IPSEC VPN zwischen pfSense 2.0 und AVM Routern

IPSEC stellt den Standard für sichere Verbindungen zwischen getrennten Netzwerken da. Hier wird gezeigt wie man eine Verbindung zwischen AVM Routern und pfSense herstellen kann. So das man Transparent auf die einzelnen Netzwerke zugreifen kann.

Ausgangslage

Auf der pfSense Seite haben wir eine feste IP Adresse und der AVM Router wählt sich direkt ins Internet ein.

Einstellungen auf der pfSense Seite…

Da wir ja IPSEC nutzen wollen, müssen wir in die IPSEC Einstellungen gelangen. Also klicken wir auf VPN -> IPSEC und dort auf das kleine + Zeichen zum hinzufügen einer neuen Verbindung. Zuvor, falls noch nicht geschehen müssen wir einen Hacken bei Enable IPSEC  setzen. Als erstes fügen wir die IKE Phase 1 hinzu. Dazu stellen wir folgendes ein. Als Interface nutzen wir das WAN interface auf dem wir die Verbindung erlauben möchten. Als REMOTE GATEWAY tragen wir den DYNDNS Namen des AVM Routers ein. Achtung dieser muss als DNS-Name, also keine IP,  eingetragen werden bei diesem Beispiel. Als Description  trägt man einfach einen aussagekräftigen Namen ein.

pfSense IPSEC phase 1 general

Nun kommen wir zu den PHASE1 Proposals. Hier tragen wir nun die Verschlüsselungsdaten ein um den Tunnel zu sichern. Wenn die IP Adresse auf der pfSense Seite bekannt ist, dann tragen wir dort folgendes ein:pfSense Phase1 IKE proposals

Sollte die IP wie auf der AVM Seite dynamisch sein so muss die Einstellung so aussehen:

pfSense IPSEC phase 1 IKE proposal dynamic ips

Wichtig in beiden fällen ist bei Negotination mode den aggressive Modus auszuwählen. Auch muss man den Encryption algorithm auf 3des und die DH Key Group auf 1 und damit auf 768 bit einstellen. Selbstverständlich sollte man den Pre-Shared Key auf ein eigenes sehr sicheres Passwort ändern. Wenn auf beiden Seiten eine Dynamische IP Adresse zum Einsatz kommt, so müssen bei My Identifier der Dyndns Name des pfSense Routers eingetragen werden. Der PEER Identifier dient pfSense zum identifizieren der Gegenstelle. Hier muss der dyndns Name von oben eingegeben werden. Den Rest lassen wir in den Default Einstellungen. Die DEAD PEER DETECTION sollte eingeschaltet bleiben, da hiermit schneller der Tunnel wieder aufgebaut werden kann.

Kommen wir nun zur Phase 2 des Tunnel aufbaus.

Damit unsere Subnetze miteinander Kommunizieren können, bauen wir jetzt den Tunnel dafür auf. Wir können mehrere Tunnel für verschiedene Subnetze auf der pfSense Seite einrichten. Dies ist vorallem dann nötig wenn wir mit VLANS arbeiten die aus dem Netz des AVM Routers erreichbar sein sollen.

Als Mode nutzen wir tunnel, da wir die Netze transparent miteinander verbinden möchten. Als Local Network tragen wir das Netzwerk ein welches auf der pfSense Seite mit dem AVM Netz interagieren darf. Das Remote Network ist das lokale Netzwerk unseres AVM Routers. Sollte der AVM Router noch standardmässig eingerichtet sein, so wäre dies 192.168.178.0/24. Als Description sollte hier ein Name eingetragen werden der die Verbindung eindeutig identifiziert, da wir dieses später in den Logs und unter den Statusseiten zu sehen bekommen.

pfSense phase 2 avm general Auch bei der Phase 2 müssen wir proposals einrichten. Damit wird er Tunnel verschlüsselt. Als Protocol nutzen wir ESP da dies sicherer ist wie AH. Bei Encryption algorithms machen wir einen Haken bei AES und bei 3DES. Die HASH algorithms können wir so belassen und wählen einfach beide aus.  Die PFH Key Group müssen wir auch hier auf 1 stellen wie wir es bereits bei der Phase 1 gemacht haben. Die Lifetime lassen wir auf 3600 stehen. Wer es gerne möchte kann auch den entfernten Router oder einen Server hinter dem AVm Router anpingen. Damit testet pfSense ob die Verbindung noch richtig läuft. Ich stelle dies grundsätzlich ein, ist aber jedem selbst überlassen.

pfSense AVM phase 2 proposals

Einstellungen auf der AVM Seite…
Kommen wir nun zu unserem AVM Router. Hier wird die Config von mir als Textdatei bereit gestellt. Da wir mit dem AVM Fernzugangstool für unsere Zwecke nichts direkt anfangen können.
vpncfg {
connections {
  enabled = yes;
  conn_type = conntype_lan;
  name = "toPfSense"; // NAME der Verbindung
  always_renew = yes; // Verbindung immer herstellen
  reject_not_encrypted = no;
  dont_filter_netbios = yes;
  localip = 0.0.0.0;
  local_virtualip = 0.0.0.0;
  remoteip = x.x.x.x; // Feste IP der pfSense Box
  remotehostname = "pfsense.dyndns.org"; // Wenn dynamische IP auf pfSense Seite. Dann remoteip = 0.0.0.0 !!!
  remote_virtualip = 0.0.0.0;
  localid {
    fqdn = "home.dyndns.org"; // dyndns name des AVm Routers...
    }
  remoteid {
    ipaddr = x.x.x.x; // WAN IP der pfSense Box wenn feste IP sonst löschen!!!
    fqdn = "pfsense.dyndns.org"; // nur bei dynamischer IP sonst löschen!!!
    }
  mode = phase1_mode_aggressive; 	// Auch hier nur aggressive Modus
  phase1ss = "def/3des/sha"; 	// wichtig da sonst kein Tunnelaufbau
  keytype = connkeytype_pre_shared;
  key = "sicherspasswort"; 	// Pre-Shared Key muss gleich sein mit pfSense phase1 Daten!!!
  cert_do_server_auth = no;
  use_nat_t = no;
  use_xauth = no;
  use_cfgmode = no;
  phase2localid {
    ipnet {
      ipaddr = 192.168.178.0;
      mask = 255.255.255.0;
      }
    }
  phase2remoteid {
    ipnet {
      ipaddr = 192.168.1.0; // Das Netzwerk eurer pfSense box - default 192.168.1.0
      mask = 255.255.255.0; // Das Subnetz pfSense box - default 255.255.255.0
      }
    }
  phase2ss = "esp-3des-sha/ah-no/comp-no/pfs"; // wichtig, da sonst kein Datenaustausch
  accesslist = "permit ip any 192.168.1.0 255.255.255.0"; // Firewall einstellungen für pfSense Subnet
  }
  ike_forward_rules = "udp 0.0.0.0:500 0.0.0.0:500",
                      "udp 0.0.0.0:4500 0.0.0.0:4500";
}
//EOF

Bitte achtet drauf das die Konfig auch für dynamische IPS ausgelegt ist. Daher muss der remotehostname  nicht gesetzt werden wenn mit einer festen IP gearbeitet wird. Wenn doch dann bitte remoteip auf 0.0.0.0 stellen!!! Auch müsst ihr bei der remoteid schauen ob ihr dynamische ips verwendet oder feste. Dann müsst ihr nur noch die IP Bereiche anpassen und dann sollte es gehen…

14 Gedanken zu “IPSEC VPN zwischen pfSense 2.0 und AVM Routern

  1. Gute arbeit, danke.
    Hast du denn schon einmal versucht, mehrere Phase-2 für dein AVM Gerät anzulegen?
    Bei mir scheitert der Aufbau, wenn Ich mehrere Phase-2 Einträge vornehme (VLan).

    • Moin,
      danke für die netten Worte. Ich hab auf einer meiner pfSense Kisten auch mehrere VLANS am laufen. Bei mir hat es so geklappt das ich auf der pfSense einfach eine zweite Phase eingerichtet habe und auf dem AVM Router die Tunnelkonfig kopiert und nur die Netzbereiche angepasst. Sprich auf dem AVM Router gibt es zwei Tunnel. Damit läuft es bei mir Super… Hoffe das hilft dir…
      MfG
      Thomas

      • Du sprichst von einer zweiten Phase – komplett oder hast du nur zwei Phase 2 Einträge für eine einzelne Phase 1?

        Ich arbeite mit FQDN als Identifier, hier kann ich keine zwei Phase 1 mit dem gleichen Ziel anlegen. Andernfalls würde es beim SA nicht auseinander zu halten sein.

        Wenn Ich versuche, der FritzBox mehrere Netzwerke mitzugeben, nimmt er die Konfigurationsdatei nicht an.

        Ich habe aber vorhin einen interessanten Ansatz des Supernettings gelesen, welchen Ich morgen einmal ausprobieren werde.

        • Genau, eine Phase 1 und dann zwei Phase 2 Einträge für die Netze.
          Bei meiner Konfig habe ich auch den Identifier als FQDN definiert. Unten siehst du mal eine Beispielkonfig wie sie bei mir läuft… Beim CopyAndPaste bitte aufpassen, da die Fritzbox echt zickig sein kann bei sowas…
          Bei mir läuft es auf einer Fritzbox 7390 Fehlerlos… Die Tunnel zu beiden Netzen sind stabil und sauber…
          MfG
          Thomas

          vpncfg {
          connections {
          enabled = yes;
          conn_type = conntype_lan;
          name = „toSubnetz1“;
          always_renew = yes;
          reject_not_encrypted = no;
          dont_filter_netbios = yes;
          localip = 0.0.0.0;
          local_virtualip = 0.0.0.0;
          remoteip = REMOTIP_EINTRAGEN;
          remote_virtualip = 0.0.0.0;
          localid {
          fqdn = „DEIN FQDN ( BEI MIR DER DYNDNS NAME )“;
          }
          remoteid {
          ipaddr = DIE_REMOTE_IP;
          }
          mode = phase1_mode_aggressive;
          phase1ss = „def/3des/sha“;
          keytype = connkeytype_pre_shared;
          key = „SICHERESPASSWORT„;
          cert_do_server_auth = no;
          use_nat_t = no;
          use_xauth = no;
          use_cfgmode = no;
          phase2localid {
          ipnet {
          ipaddr = LOCALE IP SUBETZ HINTER AVM ROUTER;
          mask = 255.255.255.0;
          }
          }
          phase2remoteid {
          ipnet {
          ipaddr = REMOTE IP; // the subnet IP address of your pfSense box – the default being 192.168.1.0
          mask = 255.255.255.0; // the subnet netmask of your pfSense box – the default being 255.255.255.0
          }
          }
          phase2ss = „esp-3des-sha/ah-no/comp-no/pfs“;
          accesslist = „permit ip any REMOTE IP 255.255.255.0″;
          }
          {
          enabled = yes;
          conn_type = conntype_lan;
          name = „toSubnetz2„;
          always_renew = yes;
          reject_not_encrypted = no;
          dont_filter_netbios = yes;
          localip = 0.0.0.0;
          local_virtualip = 0.0.0.0;
          remoteip = REMOTE IP WIE OBEN;
          remote_virtualip = 0.0.0.0;
          localid {
          fqdn = „DEIN FQDN WIE OBEN DEFINIERT„;
          }
          remoteid {
          ipaddr = WIE OBEN;
          }
          mode = phase1_mode_aggressive;
          phase1ss = „def/3des/sha“;
          keytype = connkeytype_pre_shared;
          key = „WIE OBEN„;
          cert_do_server_auth = no;
          use_nat_t = no;
          use_xauth = no;
          use_cfgmode = no;
          phase2localid {
          ipnet {
          ipaddr = WIE OBEN;
          mask = 255.255.255.0;
          }
          }
          phase2remoteid {
          ipnet {
          ipaddr = HIER DAS ZWEITE SUBNETZ EINTRAGEN; // the subnet IP address of your pfSense box – the default being 192.168.1.0
          mask = 255.255.255.0; // the subnet netmask of your pfSense box – the default being 255.255.255.0
          }
          }
          phase2ss = „esp-3des-sha/ah-no/comp-no/pfs“;
          accesslist = „permit ip any HIER DAS zweite SUBNETZ Eintragen 255.255.255.0″;
          }

          ike_forward_rules = „udp 0.0.0.0:500 0.0.0.0:500“,
          „udp 0.0.0.0:4500 0.0.0.0:4500“;
          }

          // EOF

          • Cool!
            Besten Dank, das ist die erste Config, die mehrere Phase 2 für eine FritzBox macht, welche Ich finden konne. Probiere es gleich mal aus, aber du sagtest ja schon, dass es klappt :-)
            *thumbs up*

          • moin,

            etwas spät, aber zufällig diesen eintrag gefunden.

            hab grade das gleiche problem, leider funktioniert die konfig bei mir überhaupt nicht:
            nach dem anpassen und hochladen der konfig sehe ich die beiden VPNs in der fritzbox, das erste VPN geht auch auf und ist nutzbar, aber sobald irgendwas über das 2te vpn gehen soll, z.b. schon ein ping, raucht der erste tunnel ab und der 2te geht auch nicht…

            was mich noch wundert: für mich sieht die konfig so aus, als ob einfach zwei komplette getrennte tunnel konfiguriert werden und eben nicht zwei „phase2“ verbindungen für einen tunnel…

            any ideas?

            danke und grüße
            martin

          • Moin,
            ja ich lasse hier zwei Tunnel aufbauen… Diese dürfen auch nicht auf das selbe Gerät zeigen… Da kommt das routing dann durcheinander…
            Wenn du zwei Subnetze ansprechen willst, so kannst du das erreichen indem du die phase2 config bearbeitest und hier ein zweites Subnetz hinzufügst.
            phase2remoteid {
            ipnet {
            ipaddr = REMOTE IP; // the subnet IP address of your pfSense box – the default being 192.168.1.0
            mask = 255.255.255.0; // the subnet netmask of your pfSense box – the default being 255.255.255.0
            }
            ipnet {
            ipaddr = ANDERE REMOTE IP; // the subnet IP address of your pfSense box – the default being 192.168.1.0
            mask = 255.255.255.0; // the subnet netmask of your pfSense box – the default being 255.255.255.0
            }
            }
            phase2ss = “esp-3des-sha/ah-no/comp-no/pfs”;
            accesslist = “permit ip any REMOTE IP 255.255.255.0″;
            accesslist = “permit ip any ANDERE REMOTE IP 255.255.255.0″;
            }
            Hab ich noch nicht direkt getestet, aber in der Theorie sollte es gehen…
            MfG
            Thowie

  2. hi,

    mit den zwei „ipnet“ einträgen innerhalb der „phase2remoteid“ funktioniiert (bei mir) leider nicht.
    ich bekomme dann im pfsense ipsec log diverse fehlermeldungen
    „racoon: [remote]: [xxx.xxx.xxx.xxx] ERROR: notification INVALID-ID-INFORMATION received in informational exchange.“
    „racoon: ERROR: xxx.xxx.xxx.xxx give up to get IPsec-SA due to time up to wait.“
    und sporadisch und abwechselnd kryptisches:
    „racoon: [remote]: [xxx.xxx.xxx.xxx] ERROR: error message: ‚.] ‚.“
    „racoon: [remote]: [xxx.xxx.xxx.xxx] ERROR: error message: ‚K >'“
    „racoon: [remote]: [xxx.xxx.xxx.xxx] ERROR: error message: “.“
    „racoon: [remote]: [xxx.xxx.xxx.xxx] ERROR: error message: ‚_+f‘.“ oder „‚&2‘.“ oder “ ‚@ ‚.“…

    div settings probiert (nat-t; DPD etc).

    Ich hatte deine konfig oben so verstanden, dass du mit zwei identischen „pahse1″ settings vond er fritzbox auf das gleiche endgerät mit unterschiedlichen subnetzen gehst

    (…)
    remoteip = REMOTIP_EINTRAGEN;
    (…)
    ipaddr = LOCALE IP SUBETZ HINTER AVM ROUTER;
    (…)
    remoteip = REMOTE IP WIE OBEN;
    (…)
    ipaddr = HIER DAS ZWEITE SUBNETZ EINTRAGEN; //
    (…)

    eine analoge konfig für die fritzbox funktioniert bei mir nicht; in der fritzbox sind dann zwei VPN verbindungen zu sehen, zuerst geht der erste tunnel auf, aber sobald der 2te tunnel angetreiggert wird, bricht der erste zusammen und bleibt aus…

    evtl hab ich deine konfig auch nur mißinterpretiert…

    grüße
    martin

  3. Gute Anleitung.
    Ich habe einen IPSEC-Tunnel nach dieser Anleitung auf meiner pfsense 2.1 eingerichtet. Als Gegenseite habe ich allerdings eine m0n0wall. Vorher hatte ich auch lokal eine m0n0wall, da lief alles super. Nun habe ich lokal auf pfsense „aufgerüstet“. Wenn ich nun in der pfsense den WAN-Port als lokalen Endpunkt eingebe, dann kann ich die Gegenseite nicht einmal anpingen. Gebe ich den LAN-Port als lokalen Endpunkt ein, dann habe ich Verbindung. bei Rules->IPSEC habe ich eine Regel drinnen, die alles erlaubt. Muss ich evtl. noch eine andere Regel (z.B. bei WAN) einbauen, damit es auch funktioniert, wenn ich den WAN-Port als lokalen Endpunkt des Tunnels angebe?

    • Moin, sry komme jetzt erst dazu dir zu Antworten.
      Ich verstehe deinen Aufbau gerade nicht so richtig. Hast du deine Interfaces eventuell vertauscht??? Auf der WAN Seite musst du nichts freischalten. Sehr komisch ist aber das es geht wenn du die Interfaces vertauschst. Also so wie ich es jetzt verstehe.
      Wenn deine Probleme noch aktuell sind, kannst du dein Setup gerne etwas genauer beschreiben und ich versuch dir zu helfen…
      MfG
      Thoie

      • Hallo thowie,
        danke für Deine Antwort.
        Nein, ich habe die Interfaces nicht vertauscht. Sie sind genau so, wie ich sie auch hatte, als ich noch 2 m0n0wall hatte. Alle anderen Funktionen laufen auch richtig.
        Ich habe nun eine Firewall-Regel auf den WAN-Port gelegt, die das Protokoll ESP erlaubt. Nun funktioniert alles stabil und einwandfrei.

        Gruß Michael

  4. 7270 zu pfSense klappt wie am Schnürchen.
    Leider beendet die FB nach 60 Minuten die Verbindung; ist also nur „on-demand“
    Vielen Dank für das HowTo.

  5. Danke für das Tutorial, das funktioniert bei mir schon seit geraumer Zeit wunderbar (FB 7390 – pfSense 2.0.2).
    Zur Erhöhung der Sicherheit wollte ich bei der Blockverschlüsselung von 3DES auf AES wechseln. Ich habe in Phase 1 und 2 statt 3DES AES eingestellt und in der vpncfg esp-aes-sha bzw. def/aes/sha in verschiedenen Kombinationen probiert – erhalte aber nur Fehlermeldungen:
    Feb 3 16:06:31 racoon: [Fritzbox]: [xx.yy.zz.aa] ERROR: phase2 negotiation failed due to time up waiting for phase1 [Remote Side not responding]. ESP xx.yy.zz.aa[0]->bb.cc.dd.ee[0]
    Wenn ich zurück auf 3DES stelle, geht’s wieder funktioniert wieder alles.

    Hat das jemand hinbekommen?

  6. Achtung, mit der aktuellen Version von Fritz!OS 6.20 funktioniert das leider nicht mehr wie beschrieben, da Kompression immer verwendet wird, egal welche Einstellungen in der config-Datei angegeben werden:
    http://blog.webernetz.net/2014/11/25/fritzos-ab-06-20-anderungen-bei-vpns/

    pfsense unterstützt derzeit aber keine Kompression bei IPSec:
    https://forum.pfsense.org/index.php?topic=64702.0
    Man sollte sich also ein firmware-update gut überlegen und automatische updates abschalten oder auf zukünftige Releases warten.

    Und noch ein Hinweis: Bei ALIX-boards muss die Cryptographic Hardware abgeschaltet werden, wenn (wie vorgeschlagen) 3DES verwendet wird:
    https://doc.pfsense.org/index.php/IPsec_Troubleshooting#Unsupported_Cipher_Key_Length_for_Cryptographic_Accelerator

    Damit ist wieder ein Sonntag um – danke für die Anleitung, der Tunnel steht nun (nach einem downgrade auf 6.03)

Schreib einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind markiert *