IPSEC-VPN mellan Linux och inGate firewall

IPSEC är väldigt användbart i många lägen, men även extremt rörigt. Tekniken har funnits länge och varierande stöds finns i de flesta brandväggar. Ofta är det inga problem mellan två enheter från samma tillverkare, men när man ska blanda gäller det att vara påhittig. Här är ett exempel från en kund.

Linuxbrandväggen kör Ubuntu Linux 10.04 med racoon, ipsec-tools och shorewall. inGate-brandväggen kör version 4.6.4. Nedan kommer jag kalla dem L och I.

L har fast IP. I har dynamisk IP. De största begränsningarna i Linux implementation av IPSEC gäller när man kör med dynamisk IP eller har flera tunnlar som man vill ta upp och ner oberoende av varandra. I det här fallet påverkar det inte oss.

inGate är mer begränsat, så att det är I som kommer styra vilka alternativ vi väljer, bland annat följande:

* inGate stödjer bara Main Mode
* inGate stödjer bara 3DES, AES, SHA1 och MD5
* inGate stödjer bara identifiering med IP vid Pre Shared Key, vilket är helt värdelöst om man har dynamisk IP. Därför väljer vi att använda oss av enkla X.509 certifikat vid autentiseringen.

På grund av Linux begränsningar när det gäller dynamisk IP är vi tvungna att låta I initiera alla anslutningar, medan L är konfigurerat för anonym motpart, dvs alla IP-adresser är tillåtna och policy genereras automatiskt vid anslutning.

Börja med att skapa två självsignerade certifikat. Det är onödigt att börja krångla med att sätta upp en CA, se istället tidigare artikel om enkla X.509-certifikat. När du är klar ska du ha två certifikat, L.pem och I.pem, samt två nycklar, L_key.pem och I_key.pem.

Följande konfiguration behövs på L, i /etc/racoon/racoon.conf:

# Mapp för certifikat
path certificate "/etc/racoon/certs";
# Anonym motpart, gäller alla inkommande anslutningar
remote anonymous {
        proposal {
                # Detta är vad som inGate stödjer
                encryption_algorithm 3des;
                hash_algorithm sha1;
                dh_group modp1024;
                # Autentisering med certifikat
                authentication_method rsasig;
                }

        # Lyssna efter anslutningar
        passive on;
        # Vi identifierar oss med hjälp av informationen i certifikatet
        my_identifier asn1dn;
        # Anger vilket certifikat vi identifierar oss med.
        certificate_type x509 "L.pem" "L_key.pem";
        verify_identifier off;
        lifetime time 720 min;
        # Anger att policy för vilken trafik som ska krypteras ska genereras automatiskt vid anslutning
        generate_policy on;
        dpd_delay 10;
        # Krävs av inGate
        exchange_mode main;
        }

# Inställningar för själva tunneln, gäller för alla motparter:
sainfo anonymous {
        pfs_group modp1024;
        lifetime time 720 min;
        # Kryptering som inGate stödjer.
        encryption_algorithm 3des;
        authentication_algorithm hmac_sha1;
        compression_algorithm deflate;
        }

Lägg både certifikat och nyckel för L (L.pem och L_key.pem) i /etc/racoon/certs.

Lägg även det pulika certifikatet för I i samma mapp. För att racoon ska hitta det i anslutningsfasen får man göra en symlänk med samma namn som hash-värdet på certifikatet:

ln –s I.pem `openssl x509 –in I.pem –noout –hash`.0

Nu gäller det att konfigurera I rätt. Börja med att ladda upp certifikatet för I. Här behövs både certifikat och nyckel. Till skillnad från racoon vill inGate ha certifikat och nyckel i samma fil. Detta kan man enkelt lösa genom att lägga ihop dem själv:

cp I.pem I_cert_and_key.pem
cat I_key.pem >> I_cert_and_key.pem

Filen laddas upp under Grundinställningar – Certifikat. Resten av inställningarna görs under VPN – IPsec-motparter:

* Lokal sida: Det externa interfacet
* Livslängd: samma som i racoon.conf, dvs 43200 sekunder
* Autentisering: X.509-certifikat
* Ladda upp L.pem under Ändra

Under VPN – IPsec-tunnlar:

* IPsec-nätverk: Lägg upp de två privata nät du vill tunnla
* IPsec-tunnlar: Lägg upp en regel för de två privata nätverken. Livslängd ska vara samma som racoon.conf, 43200 sekunder. Kryptering ska vara AES/3DES.

Under VPN – X.509-certifikat:

* Välj det certifikat du tidigare laddade upp för I.

Nu är du redo att testa tunneln. Driftsätt konfigurationen i I, samt starta om racoon på L. Glöm inte att lägga upp matchande regler i de två brandväggarna för att tillåta trafiken mellan näten.

Förmodligen fungerar det inte på första försöket. Följande ställen är bra att titta på när det gäller felsökning:

* Loggen på I, under Loggning och verktyg.

* Loggen för racoon på L, vanligen /var/log/syslog

* Du kan öka loggningen för racoon genom att lägga till följande rad i racoon.conf:

log level debug;

* tcpdump är heller aldrig fel på L. Kolla vad det kommer för trafik på port UDP/500 och protokoll ESP:

sudo tcpdump -i eth1 -n port 500 or esp