OpenSwan VPN

Aus Cactus Howto
Version vom 10. Oktober 2017, 10:23 Uhr von Tim (Diskussion | Beiträge) (Single-Homed-Lösung einfach zu realisieren?)

(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)
Wechseln zu: Navigation, Suche

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:

  1. General
    1. Auto Configuration: disabled
    2. use an existing adapter...
  2. Name Resolution
    1. Empfehlung: Disable DNS/WINS
  3. Authentication
    1. Method: Mutual RSA
      1. Local: ASN.1
      2. Local: Use the subject in the client certificate
      3. Remote: ASN.1
      4. Remote: Use the subject in the client certificate
      5. Creditals: Certificate- and Key-Files
  4. Phase 1
    1. Exchange main
    2. DH Ex: auto
    3. Chipher Alg: auto
    4. Hash Alg: auto
  5. Phase 2
    1. PFS Ex: DH Group 5
  6. Policy
    1. 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?


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