OpenVPN als Tunnel zum eigenen Netzwerk ======================================= .. |date| date:: .. sidebar:: Info .. image:: ../images/logo-freebsd.png Mit Hilfe eines VPNs kann man bequem auf Resourcen des eigenen Netzes zugreifen und sogar seinen kompletten Traffic über den Tunnel routen, so dass man Portsperren in öffentlichen Netzen (zum Beispiel im Uninetz) „umgehen“ kann. In diesem HowTo wird beschrieben, wie man dies mit Hilfe von OpenVPN tun kann. Installation ------------ Es ist OpenVPN (server- und clientseitig), sowie die Bash Shell (nur serverseitig) zu installieren. - `security/openvpn `__ (FreeBSD Ports) - `shells/bash `__ (FreeBSD Ports) Gearbeitet wird in dem gesamten HowTo mit der Bash Shell, da die easy-rsa Skripte diese verlangen. Falls keine dauerhafte Umstellung der Shell gewünscht ist, wechselt man die aktuelle Shell mittels:: # bash Erstellen der Zertifikate ~~~~~~~~~~~~~~~~~~~~~~~~~ Nun muss für den Server, sowie für jeden Client jeweils ein Zertifikat erstellt werden. Generiert werden diese auf dem Server. Für die Zertifikatserstellung nutzen wir easy-rsa. Easy-rsa ist eine Sammlung von Skripten, welche die Erstellung der Zertifikate um einiges erleichtern. Diese Skripte müssen zuerst noch installiert werden. Unter DESTDIR ist das gewünschte Installationsverzeichnis anzugeben:: # cd /usr/local/share/doc/openvpn/easy-rsa/2.0 # make install DESTDIR=/root/easy-rsaVPNgw/ # cd /root/easy-rsaVPNgw Nun bearbeiten wir das Skript vars. Dieses Skript enthält Variablen, welche zur Erstellung der Zertifikate nötig sind. Die Schlüsselgröße passen wir noch an indem wir sie von 1024bit auf 2048bit heraufsetzen. :: export KEY_SIZE=2048 Danach ersetzten wir noch die Werte :: export KEY_COUNTRY="US" export KEY_PROVINCE="CA" export KEY_CITY="SanFrancisco" export KEY_ORG="Fort-Funston" export KEY_EMAIL="me@myhost.mydomain" durch geeignetere. Zum Beispiel: :: export KEY_COUNTRY="DE" export KEY_PROVINCE="HESSEN" export KEY_CITY="Frankfurt" export KEY_ORG="SecretVPN" export KEY_EMAIL="support@SecretVPN.de" Erstellen einer eigenen CA ~~~~~~~~~~~~~~~~~~~~~~~~~~ Zuerst müssen wir eine eigene CA erstellen. Dies wird mit den folgenden Befehlen gemacht:: # source vars # ./clean-all # ./build-ca # ./build-dh Server Zertifikat ~~~~~~~~~~~~~~~~~ Nun können wir das Server Zertifikat erstellen. Dieses Zertifikat wird nur einmal erstellt und dem OpenVPN Server übergeben:: # source vars # ./build-key-server VPNgwServer Client Zertifikat erstellen ~~~~~~~~~~~~~~~~~~~~~~~~~~~ Jetzt wird pro Client ein Client Zertifikat erstellt. Hier für den Client „fridolin“:: # source vars # ./build-key fridolin Client Zertifikat sperren ~~~~~~~~~~~~~~~~~~~~~~~~~ Falls ein erstelltes Zertifikat nicht mehr benötigt wird oder abhanden gekommen ist kann dieses mittels easy-rsa auch gesperrt werden. Hier für das Zertifikat von „fridolin“:: # source vars # ./revoke-full fridolin Konfiguration von OpenVPN ------------------------- Nach der Erstellung der Zertifikate kann mit der Konfiguration von OpenVPN begonnen werden. Server Konfiguration ~~~~~~~~~~~~~~~~~~~~ Damit Portsperren in fremden Netzen relativ einfach zu handhaben sind wird der OpenVPN Server auf dem Port 80 lauschen und das TCP Protokoll nutzen. Damit sollte eine Verbindung in jedem Netz zu stande kommen, in dem das Surfen erlaubt ist. Dafür erstellen wir eine Konfigurationsdatei mit einem beliebigen Namen (hier: /root/VPNgwServer.conf). Darauf zu achten ist, dass vor dem Erstellen der Konfigurationsdatei ein Zertifikat mit dem oben beschriebenen Befehl (./revoke-full) widerrufen wird, da ansonsten die Datei crl.pem nicht erstellt wird und OpenVPN dadurch nicht startet. :: #Autentifizierungsmethode auth RSA-SHA1-2 #Verschlüsselungsalgorithmus cipher AES-256-CBC #IP auf der gelauscht wird local $IP_DES_SERVERS_IM_LAN #Port auf dem gelauscht wird port 80 proto tcp-server mode server tls-server dev tap client-to-client float keepalive 10 60 #IP des Servers im VPN ifconfig 10.8.1.1 255.255.255.0 #IP Pool, der an Clients vergeben wird ifconfig-pool 10.8.1.2 10.8.1.20 #IP leases speichern ifconfig-pool-persist ipp.txt #sende folgende Optionen zum Client push "route-gateway 10.8.1.1" push "redirect-gateway" push "dhcp-option DNS $DNS_SERVER_DES_HEIMNETZES" #Zertifikate ca /root/easy-rsaVPNgw/keys/ca.crt key /root/easy-rsaVPNgw/keys/VPNgwServer.key cert /root/easy-rsaVPNgw/keys/VPNgwServer.crt dh /root/easy-rsaVPNgw/keys/dh2048.pem crl-verify /root/easy-rsaVPNgw/keys/crl.pem #Starte Management Console auf Port 7506 management localhost 7506 #Nutze Komprimierung comp-lzo verb 4 mute 50 Nun muss noch FreeBSD eingerichtet werden. Hier ist in der /boot/loader.conf die Zeile :: if_tap_load="YES" einzufügen. Für einen automatischen Start beim Booten ist die /etc/rc.conf um die Zielen :: openvpn_enable="YES" openvpn_configfile="/root/VPNgwServer.conf" openvpn_dir="/root/" zu erweitern. Zum Schluss sind noch die richtigen Routen einzustellen, um den Traffic in und aus dem VPN Netz ins heimische Netzwerk zu leiten. Dafür aktivieren wir das IP Forwarding indem wir in die /etc/rc.conf die Zeile :: gateway_enable="YES" hinzufügen und am Router des Heimnetzwerkes eine Route hinzufügen, die als Router für den Netzwerkverkehr des VPN Netzes unseren Server angibt (Destination IP: 10.8.1.0, Gateway: $IP_DES_SERVERS_IM_LAN). Zusätzlich kann der Netzwerkverkehr mit einem Paketfilter wie pf eingeschränkt und kontrolliert werden. Client Konfiguration ~~~~~~~~~~~~~~~~~~~~ Nun brauchen wir nur noch den Client einzurichten und der ersten Verbindung steht nichts mehr im Wege. Auf dem Client müssen wir zuerst die Konfigurationsdatei von OpenVPN erstellen. Diese legen wir der Übersichtlichkeit halber in einen extra Ordner im Heimverzeichnis des Nutzers (hier: /home/fridolin/VPNgw/VPNgw.conf). :: #Verschluesselungsalgorithmus cipher AES-256-CBC #Autentifizierungsmethode auth RSA-SHA1-2 #IP/DNS und Port des VPN Servers remote $IP/DNS_DES_SERVERS port 80 proto tcp-client dev tap tls-client #Zertifikate ca ca.crt key fridolin.key cert fridolin.crt #Server ueberprueft Zertifikate auf Gueltigkeit ns-cert-type server #hole Configurationsoptionen vom Server pull #Nutze Komprimierung comp-lzo verb 4 mute 50 Danach kopieren wir die 3 Dateien ca.crt, fridolin.key und fridolin.crt vom Server auf den Client (hier wurden die Dateien in das selbe Verzeichnis wie die Konfigurationsdatei kopiert). Nun erstellen wir eine ausführbare Datei mit der wir die VPN Verbindung starten können. Da bei FreeBSD der DNS Server nicht verändert wird, obwohl es in der Konfiguration angegeben ist wird dieser in dem Startskript verändert. :: #!/bin/sh #set nameserver nsset=$(cat /etc/resolv.conf | grep "nameserver $DNS_SERVER_DES_HEIMNETZES" | wc -l) if [ $nsset -le 0 ] then cp /etc/resolv.conf /etc/resolv.conf.temp echo "nameserver $DNS_SERVER_DES_HEIMNETZES" > /etc/resolv.conf cat /etc/resolv.conf.temp >> /etc/resolv.conf fi #start OpenVPN cd /home/fridolin/VPNgw openvpn --config VPNgw.conf #unset nameserver mv /etc/resolv.conf.temp /etc/resolv.conf Test ---- Nun können wir den Tunnel das erste Mal testen. Dazu starten wir den OpenVPN Server und danach den OpenVPN Client auf der Konsole. Server:: # cd /root # openvpn --config VPNgwServer.conf Wenn folgende Zeile erscheint ist das Server erfolgreich gestartet:: Sat Apr 17 11:43:08 2010 us=822164 Initialization Sequence Completed Nun wird der Client gestartet:: # cd /home/fridolin/VPN/ # openvpn --config VPNgw.conf Eine erfolgreiche Verbindung des Clients kann man auf der Konsole am Server verfolgen. Der Client gibt mit folgender Zeile ebenfalls eine erfolgreiche Verbindung an:: Sat Apr 17 11:44:29 2010 us=21798 Initialization Sequence Completed Mittels netstat -r und tcpdump -vvi tap0 kann man nun prüfen, ob die Routen richtig gesetzt wurden und der Traffic nun über das TAP-Device anstatt der normalen (W)LAN Karte läuft. Ist dies der Fall kann das VPN in Betrieb genommen werden. * :ref:`genindex` Zuletzt geändert: |date|