VPN-Anbindung eines Internetservers mit strongSwan 4.2

Bei mir kommt es immer häufiger vor, dass ein Webserver Zugriff auf sensible Dienste eines Servers im internen Netzwerk erhalten soll. Um diesen Zugriff so sicher wie möglich zu gestallten, sollte die dazu notwendige Netzwerkverbindung verschlüsselt werden. Also muss eine VPN-Verbindung her.

Bei Linux-Servern kann man diese Verbindung ganz einfach mit der Software strongSwan einrichten. Bei den meisten Linux-Distributionen ist das dazu nötige Paket enthalten und schnell installiert. Bei Ubuntu 12.04 geht dies z.B. ganz einfach mit dem folgenden Befehl:

sudo apt-get install strongswan

Um die software einzurichten ist noch ein geheimes Kennwort für den Verbindungsaufbau und eine Konfiguration für die VPN-Verbindung notwendig. Das Kennwort wird in der Datei /etc/ipsec.secrets festgelegt. Wenn der Internetserver die IP 144.133.122.111 und die Firewall des internen Netzwerkes die IP 143.132.121.110 hat, müsste die Datei die folgende Zeile beinhalten (das Kennwort sollte natürlich anders sein):

144.133.122.111 143.132.121.110 : PSK 'HierKommtEinGeheimesLangesKennwortHin'

Die Konfiguration der VPN-Verbindung erfolgt in der Datei /etc/ipsec.conf. Für eine Verbindung mit dem Namen InternesNetzwerk kommt der folgende Abschnitt in die Datei:

conn InternesNetzwerk
        left=144.133.122.111
        leftsubnet=144.133.122.111/255.255.255.255
        right=143.132.121.110
        rightsubnet=172.30.4.0/255.255.255.0
        leftid="144.133.122.111"
        rightid="143.132.121.110"
        ike=aes128-sha-modp1536,aes128-sha-modp1024,aes128-md5-modp1536,aes128-md5-modp1024,3des-sha-modp1536,3des-sha-modp1024,3des-md5-modp1536,3des-md5-modp1024
        esp=aes128-sha1,aes128-md5,3des-sha1,3des-md5
        ikelifetime=1h
        keylife=8h
        dpddelay=30
        dpdtimeout=120
        dpdaction=restart
        pfs=yes
        authby=secret
        auto=start
	keyexchange="ikev1"

Bei der Verbindung werden die zuvor schon genannten IP-Adressen von Webserver und Firewall verwendet. Ferner ist ein interner IP-Bereich 172.30.4.0/24 für das interne Netzwerk konfiguriert. Für die IPSec Verbindung wurde IKE in der Version 1, Dead Peer Detektion, Perfect Forward Seurity und einige andere übliche Einstellungen gesetzt. All diese Einstellungen müssen natürlich den jeweiligen Gegebenheiten angepasst werden. Außerdem müssen die IPSec Parameter denen der Firewall entsprechen.

Wenn auch die Firewall auf der Gegenseite eingerichtet ist, lässt sich die Konfiguration durch einen Neustart von strongSwan bzw. IPSec aktivieren.

sudo /etc/init.d/ipsec restart

Danach kann man sich mit dem Befehl

sudo ip xfrm state

oder dem Befehl

sudo ip xfrm policy

anzeigen lassen, ob ein Tunnel zustande gekommen ist. Eventuelle Fehlermeldungen sind wie immer in der Datei /var/log/syslog zu finden. Wenn man die letzen 50 Zeilen anzeigen lassen möchte also einfach den folgenden Befehlt eingeben:

tail /var/log/syslog -n 50

Shrew Soft IKE daemon 2.1.7 läuft nicht bei Ubuntu 11.10

Wie ich heute feststellen musste, läuft der Shrew Soft IKE daemon 2.1.7 nicht mehr unter Ubuntu 11.10. Auf einer Mailingliste von Shrew Soft habe ih allerdings entdeckt, dass die Version 2.1.5 noch läuft: http://lists.shrew.net/pipermail/vpn-help/2011-October/004053.html.

Die Pakete für Version 2.1.5 findet man unter:

  1. http://packages.ubuntu.com/oneiric/libssl0.9.8
  2. http://packages.ubuntu.com/natty/ike
  3. http://packages.ubuntu.com/natty/ike-qtgui

Hinterher muss man aber natürlich aufpassen, dass die Update-Funktionen von Ubuntu nicht automatisch wieder auf Version 2.1.7 aktualisieren.

VPN-Tunnel auf einer pfSense in der Konsole starten

Um in der Konsole einer pfSense eine VPN-Verbindung von Hand zu starten, gibt man den folgenden Befehl ein:

racoonctl vpn-connect <IP-Adresse>

Die IP-Adresse ist dabei die von der Gegenstelle.

pfSense: Windows 7 per OpenVPN anbinden

Windows 7 verwendet bei IPSec-Verbindungen das IKE-Protokoll in der Version 2. pfSense kann bisher nur die Version 1. Deshalb kann man mit Bordmitteln keine IPSec-Verbindung zwischen Windows 7 und einer pfSense Firewall herstellen. Die pfSense Firewall beherrscht neben IPSec aber auch noch OpenVPN und PPTP. Im folgenden eine kleine Anleitung, für die Einrichtung einer OpenVPN-Verbindung zwischen einem Windows 7 und pfSense.

Einrichtung des OpenVPN-Clients

  1. Download und Installation des OpenVPN-Clients unter der URL: http://openvpn.net/download.html
  2. Ein „command prompt“ mit Administrationsrechten starten
  3. In das Verzeichnis “ c:\programfiles\openvpn\easy-rsa“ wechseln
  4. „init-config.bat“ Ausführen
  5. „vars.bat“ editieren und die letzen Zeilen wie folgt anpassen:
    set KEY_COUNTRY=DE
    set KEY_PROVINCE=HH
    set KEY_CITY=Hamburg
    set KEY_ORG=Firmenname
    set KEY_EMAIL=hostmaster@firmendomain.de
  6. „vars.bat“ ausführen
  7. „clean-all.bat“ ausführen
  8. „build-ca.bat“ ausführen
  9. „build-key-server.bat server“ ausführen. Wobei die vorgeschlagenen Werte übernommen werden können. Nur bei „Common Name“ sollte „server“ angegeben werden.
  10. „build-dh.bat“ ausführen
  11. „build-key.bat ovpn_client1“ ausführen. Wobei die vorgeschlagenen Werte übernommen werden können. Nur bei „Common Name“ sollte „ovpn_client1“ angegeben werden.
  12. Kopieren der Dateien ca.crt, ovpn_client1.key und ovpn_client1.crt aus dem Verzeichnis „c:\programfiles\openvpn\easy-rsa\keys“ in das Verzeichnis „c:\programfiles\openvpn\config“
  13. Datei mit dem Namen ovpn_client1.ovpn und dem folgenden Inhalt (die IP-Adresse muss dabei natürlich angepasst werden!) in dem Verzeichnis „c:\programfiles\openvpn\config“ anlegen:
    client
    dev tun
    proto tcp
    remote 123.123.123.123 1194
    ping 10
    resolv-retry infinite
    nobind
    persist-key
    persist-tun
    ca ca.crt
    cert ovpn_client1.crt
    key ovpn_client1.key
    ns-cert-type server
    comp-lzo
    pull
    verb 3
  14. In der Verknüpfung, mit welcher der OpenVPN-Client gestartet wird solle unbedingt in dem Eigenschaften unter Kompatibilität „Programm als Administrator ausführen“ ausgewählt werden! Ansonsten darf der OpenVPN-Client keine Routen setzen, was für den Zugriff auf das Netzwerk hinter der Firewall meistens nötig ist.

Einrichtung der pfSense Firewall

  1. Aufrufen des Menüpunktes „OpenVPN“ im Menü „VPN“ der Webgui von der pfSense.
  2. Anlegen eines neuen Eintrages mit dem folgenden Inhalt unter dem Reiter „server“
    Protocol: TCP
    Local port: 1194
    Address pool: 192.168.200.0/24 (das Netz darf auf der Firewall noch nicht verwendet werden!)
    Local Network: 192.168.1.0/24 (hier muss das interne Netzwerk stehen!)
    Remote Network: leer
    Cryptography: BF-CBC (128 bit)
    Authentication Method: PKI
    CA certificate: Inhalt der Datei "c:\programfiles\openvpn\easy-rsa\keys\ca.crt"
    Server Certificate: Inhalt der Datei "c:\programfiles\openvpn\easy-rsa\keys\server.crt"
    Server Key: Inhalt der Datei "c:\programfiles\openvpn\easy-rsa\keys\server.key"
    DH parameters: Inhalt der Datei "c:\programfiles\openvpn\easy-rsa\keys\dh1024.pem"
    DHCP-Opt: Disable NetBIOS
    LZO Compression: Ein
  3. Anlegen einer Firewall-Regel für das WAN-Interface, die TCP-Port 1194 für das Internet frei gibt.
  4. Anlegen einer Firewall-Regel für das LAN-Interface, die any (oder was benötigt wird) für den Address pool 192.168.200.0/24 frei gibt.

Älteren Securepoint Firewalls Open-VPN beibringen

Bei Securepoint Firewalls die mit einem älteren Installationsmedium installiert wurden funktioniert die Anleitung für die Einrichtung von Open-VPN von Securepoint nicht, da es keine Zone vpn-openvpn und kein Interface tun0 gibt. Betroffen sind alle Firewalls die mit einem Installationsmedium installiert wurden, das älter als Version 2007r3 ist.

Wenn man Open-VPN auf solchen Firewalls verwenden möchte muss man die Zone und das Interface zuvor anlegen. Dies kann man am einfachsten über die CLI (Comman Line Interface) mit den folgenden Befehlen.

add zone vpn-openvpn
add interface tun0 10.10.14.1/24 0 1500 0 vpn-openvpn 0 10MBIT_HALF_DUPLEX

Danach muss man die Konfiguration mit dem Befehl config save speichern. Wenn man den Konfigurationsname nicht kennt, kann man diesen zuvor mit dem Befehl config list abfragen. Dieser Befehl gibt eine Liste mit allen vorhandenen Konfigurationen aus. In dieser Liste ist die aktuelle Startkonfiguration mit einem * gekennzeichnet.

Zum Schluss muss die Konfiguration dann noch aktiviert werden. Dies geschieht mit dem Befehl update interface. Dabei sollte man jedoch beachten, dass alle Interfaces neu gestartet werden. Das kann natürlich bestehende VPN- oder Netzwerk-Verbindungen kurzzeitig unterbrechen.

VPN-Anbindung eines Ubuntu an eine FRITZ!Box

Einige Fritzboxen können IPSec. Um dies für den Fernzugriff auf das Netzwerk hinter der Fritzbox nutzen zu können bietet AVM sogar einen einfach zu handhabenden IPSec-Client an. Diesen gibt es aber leider bis jetzt nur für Windows. Natürlich kann man auch von Ubuntu eine IPSec Verbindung zu einer Fritzbox aufbauen. Dazu benötigt man aber einen IPSec-Client. Am einfachsten ist es, wenn man hierzu den „Shrew Soft VPN Client“ verwendet, da dieser bei Ubuntu bereits als Paket im universe-Netzwerk bereit steht und einfach mit apt-get install ike installiert werden kann.

Eine sehr genaue Anleitung für die Konfiguration der Fritzbox und die Konfiguration des Clients findet man auf der Webseite von AVM.

Bei mir funktionierte die VPN-Verbindung allerdings erst, nachdem ich den rp-filter ausgeschaltet hatte. Dies erreicht man bei Ubuntu, indem man in den Dateien /etc/sysctl.conf und /etc/sysctl.d/10-network-security.conf die Zeilen rp_filter=1 in rp_filter=0 ändert und das System neu startet.

Weitere Informationen findet man im Wiki der Ubuntu-User unter: http://wiki.ubuntuusers.de/FritzBox_VPN

IPSec VPN zwischen FRITZ!Box und Securepoint V2007nx Firewall

Bei einer FRITZ!Box wird das VPN mit einer Konfigurationsdatei eingerichtet, die über das Webinterface eingespielt wird (Achtung das einspielen löst einen Neustart der FRITZ!Box aus). Nähere Informationen zu dem Thema FRITZ!Box und VPN können im AVM VPN Service-Portal gefunden werden.

Das Windows Programm zum erstellen der Konfigurationsdatei ist sehr puritanisch und lässt eine Einrichtung er VPN-Verbindung zu einer Securepoint V2007nx Firewall leider nicht zu. Allerdings kann man die Konfigurationsdatei hinterher mit einem Editor bearbeiten und es gibt im AVM VPN Service-Portal einige Beispielkonfigurationen. Leider hat in meinem Fall aber keine dieser Beispielkonfigurationen funktioniert. Also habe ich die Einstellungen der unterschiedlichen Beispielkonfigurationen mit einander kombiniert und schließlich die folgende Konfigurationsdatei mit einer Securepoint V2007nx Firewall (3DES/SHA in beiden Phasen und PFS) zum laufen bekommen:

/*
 
 * C:\Dokumente und Einstellungen\kristian\Anwendungsdaten\AVM\FRITZ!Fernzugang\hostname_dnsalias_net\fritzbox_hostname_dnsalias_net.cfg
 * Wed Apr 29 13:05:41 2009
 */
 
vpncfg {
        connections {
                enabled = yes;
                conn_type = conntype_lan;
                name = "Name der VPN-Verbindung";
                always_renew = no;
                reject_not_encrypted = no;
                dont_filter_netbios = yes;
                localip = 0.0.0.0;
                local_virtualip = 0.0.0.0;
                remoteip = 123.123.123.123;
                remote_virtualip = 0.0.0.0;
                localid {
                        fqdn = "hostname.dnsalias.net";
                }
                remoteid {
                        ipadr = 123.123.123.123;
                }
                mode = phase1_mode_idp;
                phase1ss = "all/all/all";
                keytype = connkeytype_pre_shared;
                key = "geheim";
                cert_do_server_auth = no;
                use_nat_t = no;
                use_xauth = no;
                use_cfgmode = no;
                phase2localid {
                        ipnet {
                                ipaddr = 192.168.31.0;
                                mask = 255.255.255.0;
                        }
                }
                phase2remoteid {
                        ipnet {
                                ipaddr = 192.168.1.0;
                                mask = 255.255.255.0;
                        }
                }
                phase2ss = "esp-3des-sha/ah-no/comp-no/pfs";
                accesslist = "permit ip any 192.168.1.0 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

Der Vollständigkeit halber hier die Konfiguration der beiden IPSec Phasen auf der Securepoint V2007nx Firewall:

IPSec Phase 1
IPSec Phase 1

IPSec Phase 2
IPSec Phase 2

Cisco ASA Konfiguration für das iPhone

Ab der Softwareversion 2.0 kann das Apple iPhone nicht nur L2PT und PPTP sondern auch richtige IPSec Verbindungen zu Firewalls von CISCO (z.B. PIX oder ASA) aufbauen. Leiter konnte ich auf den Webseiten von Apple und Cisco nur die Information finden, dass es funktionieren soll. Eine Anleitung oder ein HowTo für die Konfiguration der PIX oder ASA konnte ich nicht finden. Deshalb habe ich selber herumprobiert und die folgende Konfiguration auf einer Cisco ASA 5505 mit einem iPhone 3G (Softwareversion 2.1) zu laufen gebracht:

Cisco ASA Konfiguration für das iPhone

ASA Version 7.2(4) 
!
hostname minastirith
domain-name domain.de
enable password testpasswort
passwd testpasswort
names
name 172.20.20.0 LAN
name 172.20.52.0 iPhones
!
interface Vlan1
 nameif LAN
 security-level 100
 ip address 172.20.20.1 255.255.255.0 
!
interface Vlan2
 nameif INTERNET
 security-level 0
 ip address 217.6.26.94 255.255.255.248 
!
interface Ethernet0/0
 switchport access vlan 2
!             
interface Ethernet0/1
!
interface Ethernet0/2
 shutdown
!
interface Ethernet0/3
 shutdown
!
interface Ethernet0/4
 shutdown
!
interface Ethernet0/5
 shutdown
!
interface Ethernet0/6
 shutdown
!
interface Ethernet0/7
 shutdown
!
ftp mode passive
clock timezone MET 1
dns server-group DefaultDNS
 domain-name domain.de
access-list INTERNET_access_in extended permit ip iPhones 255.255.255.0 LAN 255.255.255.0 
access-list iPhone_splitTunnelAcl standard permit LAN 255.255.255.0 
access-list inside_outbound_nat0_acl extended permit ip LAN 255.255.255.0 iPhones 255.255.255.0 
pager lines 24
logging enable
logging asdm informational
mtu LAN 1500
mtu INTERNET 1500
ip local pool iphone_pool 172.20.52.101-172.20.52.199
icmp unreachable rate-limit 1 burst-size 1
no asdm history enable
arp timeout 14400
global (INTERNET) 1 interface
nat (LAN) 0 access-list inside_outbound_nat0_acl
nat (LAN) 1 0.0.0.0 0.0.0.0
access-group INTERNET_access_in in interface INTERNET
route INTERNET 0.0.0.0 0.0.0.0 217.6.26.89 1
timeout xlate 3:00:00
timeout conn 1:00:00 half-closed 0:10:00 udp 0:02:00 icmp 0:00:02
timeout sunrpc 0:10:00 h323 0:05:00 h225 1:00:00 mgcp 0:05:00 mgcp-pat 0:05:00
timeout sip 0:30:00 sip_media 0:02:00 sip-invite 0:03:00 sip-disconnect 0:02:00
timeout sip-provisional-media 0:02:00 uauth 0:05:00 absolute
aaa authentication serial console LOCAL 
aaa authentication ssh console LOCAL 
aaa authentication http console LOCAL 
http server enable
http LAN 255.255.255.255 LAN
http LAN 255.255.255.0 LAN
no snmp-server location
no snmp-server contact
snmp-server enable traps snmp authentication linkup linkdown coldstart
crypto ipsec transform-set ESP-3DES-SHA esp-3des esp-sha-hmac 
crypto dynamic-map INTERNET_dyn_map 20 set pfs 
crypto dynamic-map INTERNET_dyn_map 20 set transform-set ESP-3DES-SHA
crypto dynamic-map INTERNET_dyn_map 40 set pfs 
crypto dynamic-map INTERNET_dyn_map 40 set transform-set ESP-3DES-SHA
crypto map outside_map 65535 ipsec-isakmp dynamic INTERNET_dyn_map
crypto map outside_map interface INTERNET
crypto isakmp enable INTERNET
crypto isakmp policy 10
 authentication pre-share
 encryption 3des
 hash sha
 group 2
 lifetime 86400
crypto isakmp policy 65535
 authentication pre-share
 encryption 3des
 hash sha
 group 2
 lifetime 86400
telnet timeout 5
ssh LAN 255.255.255.255 LAN
ssh timeout 60
console timeout 0

group-policy iPhone internal
group-policy iPhone attributes
 wins-server value 172.20.20.21
 dns-server value 172.20.20.21
 vpn-tunnel-protocol IPSec 
 split-tunnel-policy tunnelspecified
 split-tunnel-network-list value iPhone_splitTunnelAcl
 default-domain value domain.de
username admin password testpasswort privilege 15
username marco password testpasswort privilege 0
username marco attributes
 vpn-group-policy iPhone
tunnel-group VPN-Clients type ipsec-ra
tunnel-group iPhone type ipsec-ra
tunnel-group iPhone general-attributes
 address-pool iphone_pool
 default-group-policy iPhone
tunnel-group iPhone ipsec-attributes
 pre-shared-key testkey
!
class-map inspection_default
 match default-inspection-traffic
!
!
policy-map type inspect dns preset_dns_map
 parameters
  message-length maximum 512
policy-map global_policy
 class inspection_default
  inspect dns preset_dns_map 
  inspect ftp 
  inspect h323 h225 
  inspect h323 ras 
  inspect netbios 
  inspect rsh 
  inspect rtsp 
  inspect skinny 
  inspect esmtp 
  inspect sqlnet 
  inspect sunrpc 
  inspect tftp 
  inspect sip 
  inspect xdmcp 
!
service-policy global_policy global
prompt hostname context 
Cryptochecksum:d41d8cd98f00b204e9800998ecf8427e
: end