Seit dem 13.3.2008 unterstützt die Firmware 54.04.55 für die AVM Fritz!Box Fon WLAN 7270 standardmäßig Virtual Private Networks (VPN) mittels IPSec. Leider gibt die offizielle Webseite von AVM im VPN-Portal nur Hinweise, wie man Windows und verschiedene andere Hardware-Gateways einrichten muß. Zu Linux findet man dort direkt nichts, obwohl doch auf der Fritz!Box selbst ein Linux läuft. Die Suche im Internet findet nur ältere Beiträge zu Installationen, die sich auf frühere Firmware-Versionen beziehen, bei denen das VPN noch in Handarbeit auf der Fritz!Box nachinstalliert werden mußte.
Da alle neueren Linux Kernel ab Version 2.6 IPSec implementieren, war meine Idee, die Hausmittel meiner Debian Sid-Distribution zu nuten, um jederzeit auch von extern auf das heimische LAN zugreifen zu können. Nach etlichen Fehlanläufen gelang mir das Gewünschte dann doch, weshalb ich an dieser Stelle eine kleine HOWTO-Anleitung zur Verfügung stellen möchte.
Problem: Da sowohl das Notebook als auch die Fritz!Box eine dynamische Adresse haben, müssen die Einstellungen des Notebooks jedesmal angepasst werden, wenn sich eine oder beide externe Adressen ändern. Änderungen der öffentlichen IP-Adresse des Notebooks lassen sich durch geschicktes plazieren von Skripten in /etc/dhcp3/dhclient-enter-hooks.d/ und /etc/dhcp3/dhclient-exit-hooks.d/ leicht abfangen. Schwieriger ist das Reagieren auf die Änderung der externen Adresse der Fritz!Box, da damit kein Event auf dem Notebook verbunden ist. Denkbar wäre eine regelmäßige Abfrage des DNS-Eintrags.
Da sich die IP-Adresse durch die Zwangstrennung ggf. jeden Tag ändert, ist es sinnvoll, DynDns einzurichten. Dazu z.B. bei dyndns.com einen Account anlegen und einen Host-Eintrag anlegen (hier: pmhahn.dyndns.org).
Die Zugangsdaten und der vollständige Domain-Name müssen dann noch in der Fritz!Box unter Einstellungen/Netzwerk/DynDns
eingetragen werden. Danach sollte ein host
pmhahn.dyndns.org die externe Adresse der Fritz!Box liefern.
Im VPN-Portal gibt es das Programm FRITZ!Box-Fernzugang einrichten
für Windows Vista/XP/2000, mit dem sich die beiden Konfigurationsdateien für die Fritz!Box und die Zugangssoftware FRITZ!Fernzugang erzeugen lassen. Benötigt wird lediglich die Datei für die Fritz!Box. Die Datei fritzbox.cfg
muß unter Einstellungen/Netzwerk/VPN
hochgeladen werden
vpncfg { connections { enabled = yes; conn_type = conntype_user; name = "${USER_FQDN}"; always_renew = no; reject_not_encrypted = no; dont_filter_netbios = yes; localip = 0.0.0.0; local_virtualip = 0.0.0.0; remoteip = 0.0.0.0; remote_virtualip = ${LOCAL_INTERN_NETWORK}; remoteid { user_fqdn = "${USER_FQDN}"; } mode = phase1_mode_aggressive; phase1ss = "all/all/all"; keytype = connkeytype_pre_shared; key = "${PASSWORD}"; cert_do_server_auth = no; use_nat_t = no; use_xauth = no; use_cfgmode = no; phase2ss = "esp-all-all/ah-none/comp-all/pfs"; accesslist = "permit ip ${HOME_INTERN_NETWORK} ${HOME_INTERN_NETMASK} ${LOCAL_INTERN_NETWORK} ${LOCAL_INTERN_NETMASK}"; } 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 nachfolgende Installation benutzt den ISAKMP-Daemon racoon, die Alternativen isakmp und OpenSWAN bzw. FreeSWAN bzw. StrongSWAN wurde nicht getestet.
aptitude install racoon ipsec-tools iproute
${HOME_EXTERN} ${PASSWORD} # Die Verwendung des nachfolgenden USER_FQDN scheint nicht zu funktionieren pmhahn@pmhahn.de ${PASSWORD}
path pre_shared_key "/etc/racoon/psk.txt"; path certificate "/etc/racoon/certs"; log notify; # error warning notify debug debug2 listen { #adminsock "/var/run/racoon/racoon.sock" "root" "root" 0660; isakmp ${LOCAL_EXTERN} [500]; } remote anonymous { exchange_mode aggressive; doi ipsec_doi; situation identity_only; my_identifier user_fqdn "${USER_FQDN}"; #peers_identifier fqdn "${HOME_DYNDNS}"; verify_identifier off; mode_cfg off; #script "/etc/racoon/phase1-up.sh" phase1_up; #script "/etc/racoon/phase1-down.sh" phase1_down; send_cert on; send_cr on; verify_cert off; ike_frag on; initial_contact on; passive off; proposal_check claim; support_proxy off; generate_policy off; nonce_size 16; proposal { encryption_algorithm aes; hash_algorithm sha1; authentication_method pre_shared_key; dh_group 2; lifetime time 1 hour; } } #sainfo address ${LOCAL_INTERN} any subnet ${HOME_INTERN} any { sainfo anonymous { pfs_group 2; lifetime time 1 hour; compression_algorithm deflate; encryption_algorithm aes; authentication_algorithm hmac_sha1, non_auth; }
ip addr add ${LOCAL_INTERN} dev eth0
setkey -c <<EOF spdflush; spdadd ${LOCAL_INTERN} ${HOME_INTERN} any -P out ipsec esp/tunnel/${LOCAL_EXTERN}-${HOME_EXTERN}/require; spdadd ${HOME_INTERN} ${LOCAL_INTERN} any -P in ipsec esp/tunnel/${HOME_EXTERN}-${LOCAL_EXTERN}/require; EOF