IPsec mit strongSwan und FRITZ!Box

Weil ich selbst so lange rumsuchen musste bis ich es gefunden habe dokumentiere ich hier kurz, wie ich meine FRITZ!Box 6490 (OS: 6.87) und meinen strongSwan-Server unter Debian/Stretch erfolgreich gekoppelt bekommen habe.

Das Setup war eigentlich recht einfach: Ein Heimnetz, welches über die FB6490 mit dem Internet verbunden war sollte Zugriff auf ein Subnetz erhalten, welches über ein VPN-Gateway mit strongSwan erreichbar war.

Da sich die IP-Adresse der FB6490 gelegentlich ändert wird dort für DNS der Dienst MyFRITZ! verwendet - allerdings nur für DNS, die Freigaben sind deaktiviert. Diese Namen sind teilweise etwas kryptisch, und wenn man mehr als eine Box hat, dann kommt man da leicht durcheinander, vor allem, da die Namen auch Lookup-Keys für die Passwörter in der ipsec.secrets-Datei sind. Deswegen verwende ich eine etwa, äh, “sprechendere” ID.

Die folgenden Daten waren für die Konfiguration notwendig:

Key Explanation Value
$NAME Name der Verbindung FRITZ!Box MUC
$HOMENET Heimnetz 192.168.1.0/24
$HOMENET_MASK Heimnetz-Netzmaske 255.255.255.0
$DYNDNS_NAME MyFRITZ!-Hostname example.myfritz.net
$FB_ID “sprechende” ID: fritzbox-muc.example.com
$GATEWAY FQDN des strongSwan-Gateway gateway.example.com
$PSK Shared Secret VERYSECRET
$REMOTE_NET Remote-Netzwerk 10.14.8.0/24
$REMOTE_NET_MASK Netzmaske des Remote-Netzwerk 255.255.255.0

Das Konfigurationsdatei für die FRITZ!Box sieht dann so aus:

vpncfg {
        connections {
                enabled = yes;
                editable = no;
                conn_type = conntype_lan;
                name = "$NAME";
                boxuser_id = 0;
                always_renew = yes;
                reject_not_encrypted = no;
                dont_filter_netbios = yes;
                localip = 0.0.0.0;
                local_virtualip = 0.0.0.0;
                remotehostname = "$GATEWAY";
                remote_virtualip = 0.0.0.0;
                localid {
                        fqdn = "$FB_ID";
                }
                remoteid {
                        fqdn = "$GATEWAY";
                }
                mode = phase1_mode_idp;
                phase1ss = "all/all/all";
                keytype = connkeytype_pre_shared;
                key = "$PSK";
                cert_do_server_auth = no;
                use_nat_t = yes;
                use_xauth = no;
                use_cfgmode = no;
                phase2localid {
                        ipnet {
                                ipaddr = $HOMENET;
                                mask = $HOMENET_MASK;
                        }
                }
                phase2remoteid {
                        ipnet {
                                ipaddr = $REMOTE_NET;
                                mask = $REMOTE_NET_MASK;
                        }
                }
                phase2ss = "esp-all-all/ah-none/comp-all/pfs";
                accesslist = "permit ip any $REMOTE_NET $REMOTE_NET_MASK";
        }
        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";
}

Die Responder-Konfiguration des strongSwan in der ipsec.conf sieht folgendermaßen aus:

conn home
        # PSK Authentifizierung
        authby=secret
        # nur Responder
        auto=add
        # our endpoint
        left=$GATEWAY
        leftsubnet=$REMOTE_NET # Hinweis: hier muss eine /x Maske dran!
        # remote endpoint
        right=$DYNDNS_NAME
        rightid=@$FB_ID
        rightsubnet=$HOME_NET # Hinweis: hier muss eine /x Maske dran!
        # IKE parameters for FRITZ!Box
        ike=aes256-sha-modp1024
        esp=aes256-sha1-modp1024

Dazu gehört dann eine Passwort-Zeile in der ipsec.secrets:

@$GATEWY @$FB_ID : PSK "$PSK"

Das ganze funktioniert bisher problemlos.

BTW: Für diesen Aritkel habe ich jetzt so lange gebraucht, dass die Konfiguration mittlerweile nach Puppet gewandert ist und diese Anleitung damit unnötig geworden ist. Ich lasse sie aber trotzdem mal hier, vielleicht kann sie wer brauchen.