Linux-Roadwarrior zu AVM Fritz!Box Fon WLAN 7270

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.

Benutzerabhängige Einstellungen

LOCAL_INTERN
Adresse aus dem heimischen Netz, die das Notebook erhalten soll. (hier: 192.168.0.201/32)
LOCAL_INTERN_NETSIZE
32
LOCAL_INTERN_NETMASK
255.255.255.255
LOCAL_INTERN_NETWORK
192.168.0.201
LOCAL_EXTERN
öffentliche Adresse des Notebooks, ggf. dynamisch per DHCP bezogen. (hier: 134.106.22.73)
HOME_INTERN
privater Adressbereis des heimischen Netzes. (hier: 192.168.0.0/16)
HOME_INTERN_NETSIZE
16
HOME_INTERN_NETMASK
255.255.0.0
HOME_INTERN_NETWORK
192.168.0.0
HOME_EXTERN
öffentliche Adresse der heimischen Fritz!Box, per DynDns erfragbar. (hier: 92.196.38.176)
HOME_DYNDNS
DynDns-Name der heimischen Fritz!Box. (hier: pmhahn.dyndns.org
USER_FQDN
Email-Adresse als eindeutiger Identifikation für eine Verbindung. (hier: pmhahn@pmhahn.de)
PASSWORD
Pre-Shared-Key. (Hier: GEHEIM)

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.

Fritz!Box Konfiguration

DynDns

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.

VPN-Konfiguration

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";
}

Debian GNU/Linux

Die nachfolgende Installation benutzt den ISAKMP-Daemon racoon, die Alternativen isakmp und OpenSWAN bzw. FreeSWAN bzw. StrongSWAN wurde nicht getestet.

  1. Debian-Pakete installieren
    aptitude install racoon ipsec-tools iproute
  2. /etc/racoon/psk.txt anpassen
    ${HOME_EXTERN}	${PASSWORD}
    # Die Verwendung des nachfolgenden USER_FQDN scheint nicht zu funktionieren
    pmhahn@pmhahn.de	${PASSWORD}
  3. /etc/racoon/racoon.conf anpassen
    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;
    }
  4. Das Notebook soll eine IP-Adresse aus dem heimischen privaten Subnetz ${HOME_INTERN} erhalten, da die heimischen Rechner bei mir so konfiguriert sind, daß die verschiedenen Dienste nur Rechnern aus dem eigenen LAN anbieten.
    ip addr add ${LOCAL_INTERN} dev eth0
  5. In der Security Policy Database (SPD) muß eingetragen werden, daß die Verbindung zur Fritz!Box verschlüsselt erfolgen soll. Dadurch wird dann auch automatisch racoon getriggert, um den Sitzungsschlüssel auszuhandeln. (Alternativ: racoonctl vpn-connect ${HOME_DYNDNS}?)
    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