OpenSwan VPN
Allgemeine Informationen
Der folgende Text versteht sich als Anleitung für diejenigen, die eine sichere VPN-Lösung mit einfachen, kostengünstigen Mitteln aufbauen wollen.
Die hier beschriebenen Tests wurden größtenteils in 2009 durchgeführt.
Für das erfolgreiche Nachstellen der VPN-Verbindungen sollten grundlegende Vorkenntnisse sowohl im Netzwerk-, im Linux- als auch im IPSec-VPN-Bereich vorhanden sein.
NW-Übersicht
Wir haben uns für folgende Topologie entschieden:
VPN-GW .104 | | 199.199.199.96/28 | | | | .97 | | VPN-client---Internet------------Firewall--------------------|-- | | 192.168.1.0/24 (internal corporate LAN)
Das zentrale IPSec VPN-Gateway hat die fiktive Public-IP 199.199.199.104 und besitzt nur ein Netzwerkinteface (single-homed).
Kommunikationsbeziehungen
==========IPSec-Tunnel======== VPN-GW || .104 | || | || 199.199.199.96/28 | | || | | || .97 | | VPN-client---Internet------------Firewall--------------------|-- | | 192.168.1.0/24 (internal corporate LAN)
Auf Firewall-Systemen, die zwischen VPN-Client und VPN-Gateway liegen, müssen folgende Ports freigeschaltet werden:
- IKE 500/udp
- ESP 50/ip (ESP-Verkehr ohne NAT)
- 4500/udp (ESP-Verkehr mit NAT: NAT-Traversal, falls die ESP-Pakete genattet werden müssen)
VPN-Gateway Server Beschreibung
- Server-Typ: Standard Linux Server (hier Debian etch)
- IP: 199.199.199.104
- Kernel: 2.6.18, ältere Versionen wurden nicht getestet
VPN-Gateway:~# uname -a Linux VPN-Gateway 2.6.18-4-686 #1 SMP Wed May 9 23:03:12 UTC 2007 i686 GNU/Linux
Grundinstallation und Konfiguration
Software Installation
Die Installation des Openswan Pakets erfolgt z.B. unter Debian/Ubuntu mittels
aptitude install openswan
Status nach erfolgter Installation
VPN-Gateway:~# dpkg -l | grep openswan ii openswan 2.4.6+dfsg.2-1.1 IPSEC utilities for Openswan
Kernel Parameter anpassen
Folgende Kernel-Parameter müssen auf dem VPN-Gateway (bootfest) gesetzt werden (Quelle: http://www.ducea.com/2006/08/01/how-to-enable-ip-forwarding-in-linux/):
sudo vi /etc/sysctl.conf
net.ipv4.ip_forward=1 net.ipv4.conf.all.send_redirects=0 net.ipv4.conf.all.accept_redirects=0
Anschließend die neuen Werte aktivieren:
sudo sysctl -p /etc/sysctl.conf
Key Handling
Key generieren
sudo ipsec newhostkey --output - --verbose > /tmp/filename-rsa
Dieser Key muss in die Datei /etc/ipsec.secrets kopiert werden.
Key anzeigen
sudo ipsec showhostkey --right
Konfiguration in /etc/ipsec.conf
Um sicherzustellen, dass jeweils die gewünschten Kommunikationspartner via VPN miteinander kommunizieren, bietet IPSec verschiedene Authentisierungsmethoden.
Davon sind in OpenSwan die folgenden implementiert:
- Preshared Key
- RSA
- Zertifikat
Im Rahmen dieser Anleitung beschränken wir uns auf die beiden letzen Authentisierungsarten.
RSA Authentisierung
Konfiguration auf VPN-GW-Seite
sudo vi /etc/ipsec.conf
version 2.0 # conforms to second version of ipsec.conf specification # basic configuration config setup nat_traversal=yes # NAT-TRAVERSAL support, see README.NAT-Traversal virtual_private=%v4:10.0.0.0/8 nhelpers=0 # enable this if you see "failed to find any available worker" conn %default left=199.199.199.104 # Gateway's information leftid=@vpn-gw.cactus.de leftnexthop=%defaultroute # correct in many situations leftrsasigkey=xxx right=%any # Wildcard: we don't know the roadwarrior's IP auto=add # authorizes but doesn't start this connection at startup conn roadwarrior_2_cactus_office rightid=@roadwarrior.cactus.de rightrsasigkey=xxx rightsubnet=vhost:%priv,%no leftsubnet=192.168.1.0/24 include /etc/ipsec.d/examples/no_oe.conf #Disable Opportunistic Encryption
Konfiguration auf Client (Road Warrior) Seite
- die Ausgabe in die Config wechselweise eintragen
sudo vi /etc/ipsec.conf
version 2.0 # conforms to second version of ipsec.conf specification # basic configuration config setup plutodebug=control nat_traversal=yes # NAT-TRAVERSAL support, see README.NAT-Traversal virtual_private=%v4:10.0.0.0/8 nhelpers=0 # enable this if you see "failed to find any available worker" conn %default left=%defaultroute leftcert=roadwarrior-vpn.crt leftrsasigkey=%cert leftid="CN=roadwarrior-vpn, C=de, L=Darmstadt, ST=Hessen, O=Cactus, OU=Cactus-IT, E=roadwarrior-account@cactus.de" right=199.199.199.104 # Gateway IP rightid="CN=vpn-gw, C=de, L=Darmstadt, ST=Hessen, O=Cactus, OU=Cactus-IT, E=admin-account@cactus.de" auto=add # authorizes but doesn't start this connection at startup conn roadwarrior_2_cactus_office leftsourceip=192.168.2.67 # set fixed source ip for vpn client (allows easier routing and safer firewall settings) leftsubnet=192.168.2.67/32 rightsubnet=192.168.1.0/24 include /etc/ipsec.d/examples/no_oe.conf #Disable Opportunistic Encryption
X.509 Authentifizierung
Konfiguration auf VPN-GW-Seite
Requirements
- CA-Cert (Format .der oder .pem) in /etc/ipsec.d/cacerts
- Gateway-Cert (Format .der oder .pem) in /etc/ipsec.d/certs
- Gateway-Cert-RSA-Key in /etc/ipsec.d/private
sudo vi /etc/ipsec.conf
version 2.0 # conforms to second version of ipsec.conf specification # basic configuration config setup nat_traversal=yes # NAT-TRAVERSAL support, see README.NAT-Traversal virtual_private=%v4:10.0.0.0/8 nhelpers=0 # enable this if you see "failed to find any available worker" plutodebug=control conn %default left=199.199.199.104 # Gateway's information leftid="CN=vpn-gw, C=de, L=Darmstadt, ST=Hessen, O=Cactus, OU=Cactus-IT, E=admin-account@cactus.de" leftnexthop=%defaultroute # correct in many situations leftcert=vpn-gw.crt leftrsasigkey=%cert right=%any # Wildcard: we don't know the laptop's IP auto=add # authorizes but doesn't start this connection at startup conn roadwarrior_2_cactus_office rightid="CN=roadwarrior-vpn, C=de, L=Darmstadt, ST=Hessen, O=Cactus, OU=Cactus-IT, E=roadwarrior-account@cactus.de" rightsubnet=192.168.2.67/32 leftsubnet=192.168.1.0/24 include /etc/ipsec.d/examples/no_oe.conf #Disable Opportunistic Encryption
sudo vi /etc/ipsec.secrets
: RSA vpn-gw.pem
Konfiguration auf Client (Roadwarrior) Seite
Requirements
- CA-Cert (Format .der oder .pem) in /etc/ipsec.d/cacerts
- Client-Cert (Format .der oder .pem) in /etc/ipsec.d/certs
- Client-Cert-RSA-Key in /etc/ipsec.d/private
sudo vi /etc/ipsec.conf
version 2.0 # conforms to second version of ipsec.conf specification # basic configuration config setup plutodebug=control nat_traversal=yes # NAT-TRAVERSAL support, see README.NAT-Traversal virtual_private=%v4:10.0.0.0/8 nhelpers=0 # enable this if you see "failed to find any available worker" conn %default left=%defaultroute leftcert=roadwarrior-vpn.crt leftrsasigkey=%cert leftid="CN=roadwarrior-vpn" right=199.199.199.104 # Gateway's information rightid="CN=vpn-gw, C=de, L=Darmstadt, ST=Hessen, O=Cactus, OU=Cactus-IT, E=admin-account@cactus.de" auto=add # authorizes but doesn't start this connection at startup conn roadwarrior_2_cactus_office leftsourceip=192.168.2.67 # road warrior uses this ip to communicate thru the tunnel leftsubnet=192.168.2.67/32 rightsubnet=192.168.1.0/24 include /etc/ipsec.d/examples/no_oe.conf #Disable Opportunistic Encryption
sudo vi /etc/ipsec/ipsec.secrets
: RSA roadwarrior-vpn.pem
Verbindung aufbauen
Auf beiden Seiten VPN starten mit:
/etc/init.d/ipsec start
Auf dem Client die Verbindung aufbauen mit:
tim@acantha:~$ sudo ipsec auto --up acantha 104 "acantha" #1: STATE_MAIN_I1: initiate 003 "acantha" #1: ignoring unknown Vendor ID payload [4f456c4c4f5d5264574e5244] 003 "acantha" #1: received Vendor ID payload [Dead Peer Detection] 003 "acantha" #1: received Vendor ID payload [RFC 3947] method set to=109 106 "acantha" #1: STATE_MAIN_I2: sent MI2, expecting MR2 003 "acantha" #1: NAT-Traversal: Result using RFC 3947 (NAT-Traversal): no NAT detected 108 "acantha" #1: STATE_MAIN_I3: sent MI3, expecting MR3 004 "acantha" #1: STATE_MAIN_I4: ISAKMP SA established {auth=OAKLEY_RSA_SIG cipher=oakley_3des_cbc_192 prf=oakley_md5 group=modp1536} 117 "acantha" #2: STATE_QUICK_I1: initiate 004 "acantha" #2: STATE_QUICK_I2: sent QI2, IPsec SA established {ESP=>0x673c052c <0x8f72d5d9 xfrm=AES_0-HMAC_SHA1 NATD=none DPD=none} tim@acantha:~$
Überprüfung der Verbindung mit:
tim@acantha:~$ sudo /etc/init.d/ipsec status IPsec running - pluto pid: 9517 pluto pid 9517 1 tunnels up some eroutes exist tim@acantha:~$
VPN-Client auf Windows
Nach diversen Tests mit unterschiedlichen VPN-Clients für Windows können wir eine Empfehlung für folgenden kostenlos beziehbaren VPN Client aussprechen:
Shrew Soft VPN Client Version 2.1.4, Download unter http://www.shrew.net/
Die Installation ist simpel und wird hier nicht beschrieben.
Der Client wurde erfolgreich unter Windows XP und Vista getestet. Es gibt auch eine Version für Mac OS.
Konfiguration
Die Einstellungen wurden alle auf den Default-Werten belassen. Lediglich folgende Einstellungen wurden angepasst:
- General
- Auto Configuration: disabled
- use an existing adapter...
- Name Resolution
- Empfehlung: Disable DNS/WINS
- Authentication
- Method: Mutual RSA
- Local: ASN.1
- Local: Use the subject in the client certificate
- Remote: ASN.1
- Remote: Use the subject in the client certificate
- Creditals: Certificate- and Key-Files
- Method: Mutual RSA
- Phase 1
- Exchange main
- DH Ex: auto
- Chipher Alg: auto
- Hash Alg: auto
- Phase 2
- PFS Ex: DH Group 5
- Policy
- Add remote network e.g. 192.168.1.0 / 255.255.255.0
VPN Client für Mac OS
Erfolgreich getestet unter Mac OS 10.6.7:
Freeware IPSecuritas Version 3.4 (http://www.lobotomo.com)
Es folgt ein erfolgreich getestetes Konfigurationsbeispiel:
Generell Firewall-Adresse: <IP des OpenSwan Servers> Modus Lokaler Endpunkt: Host - <Host-IP für den Tunnel> Modus Entferntere Endpunkt: Netzwerk - <Remote Netzwerk und Maske in Bit-Notation>
Phase 1 Gültigkeit 86400 Sekunden DH Gruppe 1024 (2) Verschlüsselung AES 192 Authentifikation SHA-1 Exchange Mode Main Proposal Check Obey Nonce-Länge 16
Phase 2 Gültigkeit 3600 Sekunden PFS Gruppe 1024 (2) Verschlüsselung AES 256 & AES 192 Authentifikation HMAC MD5, HMAC SHA-1, HMAC SHA-256, HMAC SHA-384, HMAC-512
ID Lokale Identifikation Zertifikat Entfernte Identifikation Zertifikat Authentifikationsmethode Zertifikate Lokales Zertifikat <Importiertes Zertifikat> (inklusive Private Key Anteil!) Entferntes Zertifikat CA prüfen (hierzu muss das CA-Zertifikat zuvor importiert werden)
DNS (optional bei Bedarf) Domain-spezifische DNS Server aktivieren Domains <Domain> (ohne führenden Punkt) für Remote Netzwerk Name Server Adressen <DNS Server Adresse(n)>
Optionen IPSec DOI: ein SIT_IDENTITY_ONLY: ein Identifikation prüfen: aus (für Zertifikat-Auth) Initial Contact: ein Benutze MODE_CFG: aus Lokale IP in Ente. Netzwerk: aus Adressprüfung unterlassen: aus Generiere Police: aus Support Proxy: aus Zertifikat anfordern: aus Zertifikat prüfen: ein Zertifikat senden: ein Einmalige SA: aus IKE Fragmentierung: ein Passiv: aus NAT-T: Ein Verbindungsüberprüfung: ein Ping-Adresse: <pingbare IP im Remote-Netzwerk> Nach Zeitüberschreitung: Aufgeben
VPN Troubleshooting / Debugging
- Warum funktioniert das Key-Generieren auf dem VPN-Gateway (Debian etch) nicht (bleibt bei /dev/random-Zugriff stehen)?
VPN-Gateway:~# ipsec newhostkey --output - --verbose >/tmp/xxx getting 137 random bytes from /dev/random... (Prozess bleibt ohne erkennbaren Fortschritt stehen)
Das Problem besteht in der nicht ausreichend vorhandenen "Zufälligkeit" auf dem VPN-GW (siehe http://www.gentoo-wiki.info/HOWTO_OpenSwan_2.6_kernel#Generating_ipsec.secrets und ein Beispiel für einen erfolgreichen Ablauf der Key-Generierung).
Werkzeuge
- ipsec auto --status
- ipsec barf
- ipsec eroute --add --eraf inet --src 192.168.60.0/24 --dst 172.16.1.0/24 --af inet --edst 192.168.50.5 --said %pass
- ipsec auto --listcacerts
- ipsec auto --listcerts
Probleme beim Aufbau eines VPN-Tunnels
TCmy8T <a href="http://yttzflcmljus.com/">yttzflcmljus</a>, [url=http://tcnffmskyodh.com/]tcnffmskyodh[/url], [link=http://zsmshifslyyn.com/]zsmshifslyyn[/link], http://wtefylkajsen.com/
Single-Homed-Lösung einfach zu realisieren?
Entgegen der Aussage unter http://lists.virus.org/users-openswan-0504/msg00028.html: "A single-homed VPN server (i.e. with only one interface) is normally asking for trouble", konnte die beschriebene Lösung erfolgreich aufgebaut werden.
Offene Punkte
- KLIPS vs. NETKEY
Evtl. müssen folgende Kernel-Parameter auf dem VPN-Gateway überhaupt gesetzt werden:
echo "0" > /proc/sys/net/ipv4/conf/all/send_redirects echo "0" > /proc/sys/net/ipv4/conf/all/accept_redirects echo "1" > /proc/sys/net/ipv4/ip_forward
Beispiel
- Status der Tunnel anzeigen:
tim@acantha:~$ sudo ipsec auto --status
VPN FAQ
Wo findet man allgemeine Informationen zum Thema IPSec VPN?
- man ipsec.conf
- http://www.64-bit.de/dokumentationen/netzwerk/a/012/DE-VPN-HOWTO-4.html
- http://onair.funkwerk-ec.com/brueckenschlag_zwischen_nat_und_ipsec.html
- VPN Authentisierung via Zertifikat
- dhcp over IPSEC: http://www.strongsec.com/freeswan/dhcprelay/ipsec-dhcp-howto.html
- Windows Client
Welche Alternativen zu OpenSwan gibt es?
Produkt | Kurzbeschreibung | Verfügbarkeit |
---|---|---|
OpenSwan (Referenz) | An advanced IPSEC and IKE implementation for Linux/Windows/BSD. | ubuntu package, debian package |
OpenVPN | OpenVPN is an open source software application that implements virtual private network (VPN) techniques for creating secure point-to-point or site-to-site connections in routed or bridged configurations and remote access facilities. It uses a custom security protocol that utilizes SSL/TLS for key exchange. It is capable of traversing network address translators (NATs) and firewalls. It was written by James Yonan and is published under the GNU General Public License (GPL). | OS independant |
SSL-Explorer | Short Description: SSL-Explorer is a fully-featured, web-based SSL VPN server. This project is no longer actively maintained as the SSL-Explorer technology has now been acquired by Barracuda Networks, Inc. | OS independant (Java) |
StrongSwan | A complete IPsec and IKEv1/IKEv2 implementation for Linux 2.4 and 2.6 kernels. | ubuntu package, debian package |