Einen Router bauen
arrow.gif Entwicklungsumgebung
arrow.gif Hardware Plattformen
arrow.gif Slackware Router
arrow.gif Downloads
   
Weiterentwicklung
arrow.gif Tasks pending
arrow.gif Bugs
   
Informationen
arrow.gif Security
arrow.gif FAQ
arrow.gif Links
 
Slackware Linux Router
Prev Next

11. Virtual Private Network mit IPSec

11.1 Hintergrund

VPN (Virtual Private Network) steht für ein Netzwerk, das öffentliche Verbindungen (z.B. das Internet) benützt, um zwei Netzwerk-Knoten miteinander zu verbinden. VPN-Implementationen müssen Mechanismen für die Identifikation der Benutzer (Authentication) und für den Schutz der übermittelten Daten bereitstellen (Encryption, Integrity Check).

Die Verschlüsselungs-Algorithmen, die verwendet werden, können auf der Ebenen des Transport-Protokolls (IPsec) oder auf darüberliegenden Protokollschichten (SSL-VPN, OpenVPN) angesiedelt sein. Die folgende Diskussion zeigt, wie der Router IPSec-fähig gemacht werden kann. Das nächste Kapitel enthält einen Architekturvorschlag für die Anbindung von mobilen Clients («Remote-Access VPN» auch «Road-Warrior Access» genannt) an ein Netzwerk, das von einem Linuxrouter geschützt wird.

11.2 Netzwerk Topologien

Beim «Site to Site VPN» werden ganze Netze via VPN gekoppelt, so dass sie für die darin liegenden Maschinen wie zwei direkt verbundene Subnetze erscheinen. Beim «Remote-Access VPN», auch «Road-Warrior» genannt, werden einzelne, meist mobile, Maschinen an ein Netzwerk angebunden.

11.3 Linux

Seit Version 2.6.x enthält der Linux-Kernel mit NETKEY einen IPsec-Stack, der von Alexey Kuznetsov und David S. Miller geschrieben wurde. NETKEY wird zusammen mit dem racoon Key-Management Daemon des KAME-Projekts verwendet.

(Userspace Daemons wie racoon authentisiereren beim Tunnelaufbau die Peers und handeln die zu verwendenden Verschlüsselungs-Verfahren und andere Parametern aus. racoon ist in den ipsec-tools enthalten.)

11.4 Kernel-Support für IPSec

Linux Kernel >= V2.6.12.2 von ftp://ftp.kernel.org/pub/ und ipsec-tools >= V0.6 von http://ipsec-tools.sourceforge.net downloaden und auf dem Enwicklungs-System entpacken.

Den Kernel mit den folgenden Optionen kompilieren:

Device Drivers -->
 [*] Networking support (NET)
     Networking options -->
       [*] PF_KEY sockets (NET_KEY)
       [*] TCP/IP Networking (INET)
       [*] IP: AH transformation (INET_AH)
       [*] IP: ESP transformation (INET_ESP)
       [*] IP: IPComp transformation (INET_IPCOMP)
       [*] IPsec user configuration interface (XFRM_USER)

Cryptographic options -->
  -- Cryptographic API (CRYPTO)
  -- HMAC support (CRYPTO_HMAC)
  [*] Null algorithms (CRYPTO_NULL)
  -- MD5 digest algorithm (CRYPTO_MD5)
  -- SHA1 digest algorithm (CRYPTO_SHA1)
  -- DES and Triple DES EDE cipher algorithms (CRYPTO_DES)
  [*] AES cipher algorithms (CRYPTO_AES)
 

Die obigen Optionen stellen den IPsec-Stack des Kernels zur Verfügung. Das Netfilter-Modul (iptables) benötigt ausserdem:

Networking options  --->
  [*] Network packet filtering 
    IP: Netfilter Configuration  ---> 
      [*]   AH/ESP match support(IP_NF_MATCH_AH_ESP)
 

Die ipsec-tools kompilieren. Beim Kompilieren beachten: Den Pfad auf die Kernel-Headers des neuen Kernels angeben.

$ ./configure --with-kernel-headers=/kernel-directory-tree/linux/include
$ make
 

Den Kernel und die ipsec-tools-binaries auf den Router kopieren. Die Pfade lauten:

/boot/vmlinuz_2.6.12.2
/usr/local/sbin/plainrsa-gen
/usr/local/sbin/racoon
/usr/local/sbin/racoonctl
/usr/local/sbin/setkey
/usr/local/lib/libipsec.a
/usr/local/lib/libipsec.la
/usr/local/lib/libracoon.a
/usr/local/lib/libracoon.la
 

11.5 Site to Site VPN mit racoon konfigurieren

Im folgenden Beispiel werden die privaten Netze 192.168.0.0 und 192.168.1.0 via Internet miteinander verbunden (vergl. Skizze). racoon, der IKE Daemon des KAME-Projekts, initiiert den Aufbau der IPsec Verbindung. Der Daemon beherrscht die Authentisierung via X.509 Zertifikaten, Preshared Keys (PSK), oder Kerberos. Im folgenden Beispiel werden Preshared Keys verwendet.
Zur Beachtung: Für den Produktivbetrieb werden an den Endpunkten des Tunnels (84.x.y.z und 213.u.v.w) fixe öffentliche IP-Adressen benötigt.

		   84.x.y.z====/IN/====213.u.v.w
192.168.0.10-----192.168.0.1	      192.168.1.1-----192.168.1.11
 

Um die Verbindung einzurichten, wird zuerst mit Hilfe von dd ein 192 bit Key generiert.

$ dd if=/dev/random count=24 bs=1 | xxd -ps
 

Anschliessend müssen die folgenden Konfigurationsfiles bereitgestellt werden:

# /etc/psk.txt
#
# File for pre-shared keys for IKE authentication on gateway 84.x.y.z using racoon.
# Format is: 'identifier' 'key'
#
#
213.u.v.w 13106c8c44ff519bbd3a1786f5526203
 

/etc/psk.txt benötigt die Permissions 600, sonst wird es von racoon ignoriert. Das File, das auf dem zweiten Router zum Einsatz kommt, enthält den selben Schlüssel, der Identifizierer muss vertauscht werden.

# /etc/setkey.conf
#
# Configuration file for setkey on gateway 84.x.y.z (to set up security policies).
#
# Flush the SAD and SPD
flush;
spdflush;

# Create policies for racoon
spdadd 192.168.1.0/24 192.168.0.0/24 any -P in ipsec
           esp/tunnel/213.u.v.w-84.x.y.z/require;

spdadd 192.168.0.0/24 192.168.1.0/24 any -P out ipsec
           esp/tunnel/84.x.y.z-213.u.v.w-/require;
 

Auf dem zweiten Router kann das gleiche /etc/setkey.conf File verwendet werden, lediglich die Parameter «in» und «out» müssen vertauscht werden.

# /etc/racoon.conf
#
# Configuration file for racoon on gateway 84.x.y.z
#
path pre_shared_key "/etc/psk.txt";
#
# Specify your log level. Values are: notify, debug, debug2.
# log debug;

remote 213.u.v.w {
        exchange_mode main;
        proposal {
                encryption_algorithm 3des;
                hash_algorithm md5;
                authentication_method pre_shared_key;
                dh_group modp1024;
        }
}

# gateway to gateway
sainfo address 192.168.0.0/24 any address 192.168.1.0/24 any {
        pfs_group modp768;
        encryption_algorithm 3des;
        authentication_algorithm hmac_md5;
        compression_algorithm deflate;
}
 

Auf dem zweiten Router kann das gleiche /etc/racoon.conf File verwendet werden, lediglich der Parameter «remote» muss angepasst werden.

11.6 Verbindung testen

Die Verbindung kann nun getestet werden. Die Firewalls auf den Linuxroutern an den Endpunkten des Tunnels deaktivieren, mit Hilfe von setkey die Security Policy einlesen und racoon manuell starten:

/usr/local/sbin/setkey -f /etc/setkey.conf
/usr/local/sbin/racoon -F -C -f /etc/racoon.conf
 

-F = run in foreground, not as a daemon
-C = dump parsed config file
-d = debug
-f = path to config file

Unter der Voraussetzung, dass die Maschinen in den Netzen 192.168.0.0 und 192.168.1.0 als Default Gateway ihren eigenen Router benützen (192.168.0.1 und 192.168.1.1) sollte es nun möglich sein, mit einer beliebigen Maschine aus dem 0-er Netz eine ebenso beliebige Maschine im 1-er Netz zu pingen − und umgekehrt. Da der Tunnel zwischen den Routern aufgebaut wird, ist er für die Hosts in den verbundenen Netzen transparent, d.h. an den Arbeitsstationen sinde keine weiteren Konfigurationen nötig.

11.7 Firewall Regeln und IPsec

Beim Filtern von IPsec-Verbindungen sind die folgenden Ports und Protokolle relevant:

- UDP port 500 --> für ISAKMP (das «Internet Security Association Key Management Protocol»).
- UDP port 4500 --> wenn NAT-T (NAT-Traversal) benützt werden soll.
- ESP protocol (50) --> Das «Encapsulated Security Payload Protocol».
- AH protocol (51) --> Das «Authentification Header Protocol».

Ein IPsec Gateway, der mit einem Peer einen Tunnel aufbaut, benötigt mindestens Filterregeln die den UDP Port 500 (Key Exchange Channel) und das IP Protokoll 50 (ESP, für den Datenaustausch) freigeben. Im nachstehenden Beispiel gilt:

p_ike=500
IPTABLES=/usr/sbin/iptables
VPN_SOURCE_NET_PEER=<Privates-Netz-am-anderen-Tunnelende>

# Allow IKE negotiations (Internet Key Exchange)
$IPTABLES -A INPUT  -i $EXT -p udp --sport $p_ike \
   --dport $p_ike  -j ACCEPT
$IPTABLES -A OUTPUT -o $EXT -p udp --sport $p_ike \
   --dport $p_ike  -j ACCEPT

# Allow ESP encryption (Encapsulated Security Payload)
$IPTABLES -A INPUT  -p esp -j ACCEPT
$IPTABLES -A OUTPUT -p esp -j ACCEPT
$IPTABLES -A FORWARD -i $EXT -o $INT -s $VPN_SOURCE_NET_PEER \
  -m state --state NEW -j ACCEPT
 

Um Pakete aus dem eigenen privaten Netz via Internet zum Peer zu tunneln, ist zudem die folgende Masquerading-Regel nötig:

# Needed for outgoing client connections using site to site VPN
$IPTABLES -t nat -A POSTROUTING ! -p esp -o $EXT -j MASQUERADE
 

Die exakten Reglen für den Paket Filter hängen von der Umgebung ab, die der Firewall schützen soll (Anzahl DMZs, Adressen der verwendeten privaten Netze, etc.).

11.8 racoon beim Booten starten

Das folgende Konfigurations File dient dazu, racoon automatisch zu starten und zu stoppen (Konfigurations File nach einer Vorlage von Patrick Volkerding).

#!/bin/sh
#
# /etc/rc.d/rc.racoon/var/log
# Start/stop/restart racoon
# 2007-01-03, 2013-09-26
#
# To start racoon automatically at boot, make this file 
# executable: chmod 755 /etc/rc.d/rc.racoon
#
# Adapt /etc/rc.d/rc.M  (start)
# Adapt /etc/rc.d/rc.K  (runlevel 1)
# Adapt /etc/rc.d/rc.6  (system shutdown)

RACOON_DIR="/usr/local/sbin"
RACOON_CONF="/etc"
SETKEY_CONF="/etc"
LOGDIR="/var/log"

racoon_start() {
  # Sanity checks. Exit if there are no config files for racoon or setkey
  if [ ! -r ${SETKEY_CONF}/setkey.conf ]; then # no config file, exit:
    exit
  fi
  if [ ! -r ${RACOON_CONF}/racoon.conf ]; then # no config file, exit:
    exit
  fi

#if ! /bin/ps ax | grep racoon 1> /dev/null 2> /dev/null; then
  if ! /bin/netstat -naup | grep racoon 1>/dev/null 2>&1; then 
    echo "Starting racoon..."
    sleep 1

    if [ -x ${RACOON_DIR}/setkey ]; then
      echo "  ${RACOON_DIR}/setkey -f ${SETKEY_CONF}/setkey.conf"
      ${RACOON_DIR}/setkey -f ${SETKEY_CONF}/setkey.conf 
    fi
    if [ -x ${RACOON_DIR}/racoon ]; then
      echo "  ${RACOON_DIR}/racoon -f ${RACOON_CONF}/racoon.conf"
      ${RACOON_DIR}/racoon -f ${RACOON_CONF}/racoon.conf
      #${RACOON_DIR}/racoon -v -f ${RACOON_CONF}/racoon.conf -l ${LOGDIR}/racoon.log 
    fi

    else
     echo "racoon is already running."
  fi
}

racoon_stop() {
  killall -3 ${RACOON_DIR}/racoon 2> /dev/null
  # Flush the SAD entries to bring down the tunnel.
  ${RACOON_DIR}/setkey -F
  ${RACOON_DIR}/setkey -FP
}

racoon_restart() {
  racoon_stop
  sleep 1
  racoon_start
}

racoon_debug() {
  if [ -x ${RACOON_DIR}/racoon ]; then
    echo "  running racoon in the foreground"
    ${RACOON_DIR}/racoon -d -F  -f ${RACOON_CONF}/racoon.conf -l ${LOGDIR}/racoon.log 
  fi
}
#-F = run in foreground, not as a daemon
#-C = dump parsed config file
#-f = path to config file
#-d = debug


setkey_debug() {
  if [ -x ${RACOON_DIR}/setkey ]; then
    echo "  ${RACOON_DIR}/setkey -f ${SETKEY_CONF}/setkey.conf"
    ${RACOON_DIR}/setkey -f ${SETKEY_CONF}/setkey.conf 
  fi
}
# The successful policy load can be tested by displaying the SAD and the SPD:
# setkey -D	-> display SAD entries ( Security Association Database )
# setkey -DP	-> display SPD entries ( Security Policy Database )
# setkey -F	-> flush SAD entries
# setkey -FP	-> flush SPD entries


case "$1" in
'start')
  racoon_start
  ;;
'stop')
  racoon_stop
  ;;
'restart')
  racoon_restart
  ;;
'racoondebug')
  racoon_debug
  ;;
'setkeydebug')
  setkey_debug
  ;;
*)
  echo "usage $0 start|stop|restart|racoondebug|setkeydebug"
  exit 1
  ;;
esac
exit 0
 

Zum Starten /etc/rc.d/rc.racoon aus /etc/rc.d/rc.M mit der Option start aufrufen, zum Stoppen aus /etc/rc.d/rc.6 und /etc/rc.d/rc.K mit der Option stop.

11.9 Tunnel debuggen

Falls bei der Inbetriebnahme eines Tunnels zwischen zwei Routern Schwierigkeiten auftreten, bietet sich zur Fehlereingrenzung das folgende Vorgehen an:

-Überprüfen, ob die Konfigurationsfiles psk.txt, racoon.conf setkey.conf die Werte enthalten, die für die aktuelle Verbindung verlangt sind (korrekte IP-Adressen, identische Preshared Key, korrekte LAN Adressen).

-Überprüfen, ob die Firewall Scripts, die auf den beteiligten Routern im Einsatz sind, für den Tunnel durchlässig sind.

-Überprüfen, ob die Workstations, die zum Testen eingesetzt werden, nicht selbst durch Firewalls geschützt werden, so dass beispielsweise Ping-Requests aus fremden Netzen verworfen werden (Windows Firewall! Windows Vista!!).

-Weiterhin kann es sinnvoll sein, die Komplexität der Testanordnung zu reduzieren, indem die Firewall Scripts auf den beteiligten Routern so angepasst werden, dass die Router auf Pings antworten. Danach kann aus beiden LANs der Default Gateway des jeweiligen Zielnetzes anpingt werden. Wenn der Tunnel korrekt funktioniert, wird der entfernte Router auf den Ping antworten.

 

Falls sich die Fehlerursache durch die obigen Tests nicht eingrenzen lässt, als nächstes feststellen, ob die beteiligten Router versuchen, den Tunnel aufzubauen:

-Racoon an beiden Tunnelenden stoppen.
-Beide Racoon Daemons im Debug Modus neu starten: /usr/local/sbin/racoon -d -F -f /etc/racoon.conf -l /var/log/racoon.log
-Das Kommando /usr/local/sbin/setkey -D zeigt die Werte der SAD (Security Association Database). Ein neu aufgebauter Tunnel zeigt keine Einträge.
-Dann einen Ping vom Quell- ins Zielnetz ausführen.
-Auf beiden Routern /usr/local/sbin/setkey -D erneut ausführen. Bei einem funktionierenden Tunnel zeigt die SDA Details der existierenden Verbindung. Es lässt sich also feststellen, ob der Tunnel aufgebaut wird und damit ob der Fehler in den beteiligten LANs oder Firewalls zu suchen ist oder ob er eher beim Tunnel Daemon selbst liegt.
-/var/log/racoon.log überprüfen.

 


Prev Home Next
Internet Anbindung Content OpenVPN