|
11. Virtual Private Network mit IPSec11.1 HintergrundVPN (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 TopologienBeim «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
(Userspace Daemons wie 11.4 Kernel-Support für IPSecLinux 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:
Die obigen Optionen stellen den IPsec-Stack des Kernels zur Verfügung. Das Netfilter-Modul (iptables) benötigt ausserdem:
Die ipsec-tools kompilieren. Beim Kompilieren beachten: Den Pfad auf die Kernel-Headers des neuen Kernels angeben.
Den Kernel und die ipsec-tools-binaries auf den Router kopieren. Die Pfade lauten:
11.5 Site to Site VPN mit
|
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
|
/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
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.
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.
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.).
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
.
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 |