OpenVPN via Bridge Networking
Szenariobeschreibung
Es soll ein OpenVPN-Server aufgebaut werden, der es Clients ermöglicht sich in das Subnetz des Servers einzuwählen.
/---------------\ | Server |--> (eth1->ppp0) Verbindung ins Internet (über dyndns erreichbar) \---------------/ | \------> (eth0) Zugang zu anderen Rechnern im Netz 192.168.14.0 | | | |--> (br0) Bridge 192.168.14.3 | | \------------> (tap1) OpenVPN-Device für Bridged Networking | /----------------------\ | | | | diverse OpenVPN Clients
Table of Contents
Setup Server
OpenVPN installieren
OpenVPN ist Open Source Software und es gibt sie für viele Betriebssysteme. Die Software gibt es auf der Seite http://openvpn.net oder unter Debian/Ubuntu durch Eingabe von
sudo aptitude install openvpn
Damit openvpn unter Linux nicht mit normalen Benutzerrechten ausgeführt wird, ist es sinnvoll, einen user openvpn und eine Gruppe openvpn anzulegen. Der User openvpn sollte dann noch Mitglied dieser Gruppe werden.
sudo adduser --system openvpn sudo addgroup --system openvpn sudo addgroup openvpn openvpn
Bridgedevice erstellen (Linux)
Von Seiten des Betriebssystems muss zunächst ein Bridgedevice hergestellt werden. Es soll das physische Netzwerkdevice eth0 mit dem virtuellen tap-Device, das von OpenVPN genutzt wird verbinden. Um dies unter Linux zu machen, wird das Paket bridge-utils' benötigt.
aptitude install bridge-utils
Das folgende Skript generiert ein OpenVPN-Device tap1 und ein Bridgedevice br0 und verbindet anschließend in letzterem die Devices eth0 und tap1.
#!/bin/bash ################################# # Set up Ethernet bridge on Linux # Requires: bridge-utils ################################# # Define Bridge Interface br="br0" # Define list of TAP interfaces to be bridged, # for example tap="tap0 tap1 tap2". tap="tap1" # Define physical ethernet interface to be bridged # with TAP interface(s) above. eth="eth0" eth_ip="192.168.14.3" eth_netmask="255.255.255.0" eth_broadcast="192.168.14.255" for t in $tap; do openvpn --mktun --dev $t done brctl addbr $br brctl addif $br $eth for t in $tap; do brctl addif $br $t done for t in $tap; do ifconfig $t 0.0.0.0 promisc up done ifconfig $eth 0.0.0.0 promisc up ifconfig $br $eth_ip netmask $eth_netmask broadcast $eth_broadcast
...und dieses Skript löscht Brücke und tap-Device wieder.
#!/bin/bash #################################### # Tear Down Ethernet bridge on Linux #################################### # Define Bridge Interface br="br0" # Define list of TAP interfaces to be bridged together tap="tap1" ifconfig $br down brctl delbr $br for t in $tap; do openvpn --rmtun --dev $t done
Bridgedevice erstellen (Windows)
Das Bridgedevice wird unter Windows automatisch erstellt. Daher ist hier keine zusätzliche Arbeit nötig.
Generierung der Zertifikate
Zertifikate werden mit den easy-rsa Tools erstellt. Diese Skriptsammlung sollte aus /usr/share/doc/openvpn/examples/easy-rsa/ in ein Arbeitsverzeichnis kopiert werden, bevor mit der Erstellung der notwendigen Dateien begonnen wird.
siehe dazu auch http://openvpn.net/howto.html#pki
. ./vars ./clean-all ./build-ca ./build-key-server server ./build-key client1 ./build-key client2 ./build-dh
Die Zertifikate werden wie in Zertifikate#OpenVPN-ZertifikateSchlüssel generiert. Die Dateien server.crt, server.key und dh1024.pem werden auf dem Server unter /etc/openvpn/keys abgespeichert.
Erstellung der Serverkonfigurationsdatei
Die Konfigurationsdatei (z.B. /etc/openvpn/server.conf) sollte Folgendes enthalten:
port 1194 # der Port, auf dem die VPN-Kommunikation stattfinden soll proto tcp # oder udp, falls udp verwendet werden soll dev tap1 # Device, über das die Verbindung hergestellt werden soll # Wichtig ist hierbei, dass der Eintrag mit dem Device der zuvor # aufgebauten Bridge (''br0'' übereinstimmt) dev node MyTap # NUR FÜR WINDOWS: hier muss der Netzwerkdevicename stehen ca /etc/openvpn/keys/ca.crt # genauer Pfad zu den Zertifikaten cert /etc/openvpn/keys/server.crt # bzw. zu dem Schlüssel des Servers key /etc/openvpn/keys/server.key dh /etc/openvpn/keys/dh1024.pem # genauer Pfad zu den Diffie Hellman Parametern ifconfig-pool-persist ipp.txt # in dieser Textdatei werden die zugeordneten virtuellen # IP-Adressen zu den Clients gespeichert # Der folgende Eintrag enthält die Angaben über die Brücke, die aufgebaut werden # soll. 192.168.14.3 mit der zugeh. Netzmaske sind hier gewählt # Die beiden anderen, nachstehenden Werte kennzeichnen die Grenzen des von # OpenVPN angewandten Zuordnungs-IP-Raum. Dieser wird bei der automatischen # Vergabe virtueller IP-Adressen bei der Einwahl von Clients verwendet. server-bridge 192.168.14.3 255.255.255.0 192.168.14.100 192.168.14.123 client-to-client # eingewählte Clients können sich gegenseitig "sehen" keepalive 10 120 # alle 10 Sekunden wird ein Kontrollsignal gesendet. # wenn nach 120 Sekunden keine Antwort kommt, gilt der Host als offline comp-lzo # Kompression aktivieren ### Folgendes klappt nicht bei Windows: user openvpn # OpenVPN als Benutzer openvpn ausführen group openvpn # ...in der Gruppe openvpn persist-key persist-tun status /var/log/openvpn-status.log # Definition der Logdateien log /var/log/openvpn.log verb 4 # Festlegen, wie viel in die Logdateien ausgegeben wird. Für den normalen # Gebrauch ist 4 ausreichend. Zum Debuggen reicht 5 oder 6. 9 ist das Maximum.
Anmerkungen für Windowsrechner: Bei den Pfadangaben zu den crt- und key-Dateien müssen entweder mit Doppelbackslashes oder Slashes benutzt werden. Zudem muss der Name des Netzwerkdevices von OpenVPN angegeben werden (siehe OpenVPN#Anhang).
sudo openvpn --config /etc/openvpn/server.conf
Anpassung der Firewall
Falls der Server durch eine Firewall geschützt ist, müssen für die neu erstellten Geräte br0 und tap1 dementsprechende Regeln angelegt werden.
Setup Clients
Erstellung der Clientkonfigurationsdatei
Ein Client benötigt die Dateien ca.crt (des Servers), client.crt und client.key. Diese Dateien werden in diesem Beispiel in das Verzeichnis /home/user/openvpn/ kopiert. Außerdem benötigt man eine Clientkonfigurationsdatei client.ovpn, die in diesem Beispiel im selben Verzeichnis liegen soll. Diese Datei sollte sodann analog zur oben genannten Konfiguration diese Einträge enthalten:
client dev tap proto tcp remote URL 1194 # URL zum Server anpassen resolv-retry infinite nobind persist-key persist-tun comp-lzo verb 3 ns-cert-type server ca /home/user/openvpn/ca.crt # Pfade an dieser Stelle anpassen cert /home/user/openvpn/client.crt # Pfade an dieser Stelle anpassen key /home/user/openvpn/client.key # Pfade an dieser Stelle anpassen ;user openvpn # LinuxBenutzer_innen entfernen die Kommentarzeichen, ;group openvpn # (vorher sicherstellen, dass es user und group gibt, s.o.) dev node MyTap # NUR FÜR WINDOWS: hier muss der Netzwerkdevicename stehen
Anmerkungen für Windowsrechner: Bei den Pfadangaben zu den crt- und key-Dateien müssen entweder mit Doppelbackslashes oder Slashes benutzt werden. Zudem muss der Name des Netzwerkdevices von OpenVPN angegeben werden (siehe OpenVPN#Anhang).
OpenVPN-Client-Tools mit GUI
Es existieren eine handvoll Tools, die das Verbinden mit OpenVPN-Servern erleichtern wollen. Ein paar von diesen seien an dieser Stelle erwähnt:
Tunnelblick (Mac OS X)
MacUser_innen finden auf http://tunnelblick.net ein brauchbares Tool, das die Verbindung sehr einfach herstellt. Um OpenVPN auf einem Mac OS X Rechner nutzen zu können, reicht es, eben dieses Programm herunterzuladen und zu installieren. Beim Programmaufruf gesellt sich neben der Systemuhr oben rechts ein kleines Logo, über das das Programm konfigurierbar wird.
Tunnelblick erwartet eine Client-Konfigurationsdatei (s.o.) im Verzeichnis ~/User/openvpn. Ist diese dort abgelegt, ist es möglich, die Verbindung zum Server herzustellen.
Gnome Network-Manager (Linux)
Gnome bietet ein komfortables grafisches Frontend zur Herstellung von Netzwerkverbindungen, den Network-Manager. Dieses Tool ist standardmäßig installiert. Man kann es auch zum Aufbau von OpenVPN-Verbindungen nutzen. Dann sollte jedoch das Paket network-manager-openvpn installiert werden.
sudo aptitude install network-manager-openvpn
Unter Gnome findet sich in der Nähe der Systemuhr oben rechts das Symbol für den Network-Manager. Ein Rechtsklick auf das Symbol öffnet ein Menü. In Diesem Menü kann man unter dem Eintrag VPN-Verbindungen/VPN Konfigurieren... eine neue VPN-Verbindung einrichten.
Es öffnet sich ein Dialog wie oben angezeigt, bei dem man dann auf Hinzufügen klickt.
Im folgenden Dialog sollte man nun OpenVPN auswählen.
In dem o.a. Dialog sollte man einen Namen für die Verbindung vergeben und die korrekten Einträge für Gateway-Address, Gateway-Port angeben. Weiter unten wird dann der Verbindungstype als X.509 Zertifikat-basiert ausgewählt und die korrekten Pfade zu den Dateien ca.crt, client.crt und client.key angegeben. Weitere Konfigurationsmöglichkeiten sind im Karteireiter Optional zu finden (s.u.).
In das Feld Only use VPN-Connections for these addresses wird in diesem Fall 192.168.14.0/24 eingegeben, damit nicht die Standardroute über den VPN-Server geht. Ebenso ist es bei dieser Konfiguration notwendig, LZO compression, TCP Connection und TAP device zu aktivieren.
Anpassung der Firewall
Auch beim Client müssen ein- und ausgehende Verbindungen auf dem für OpenVPN definierten Port zugelassen werden.
Testen der Verbindung
Server und Clients sind nun hoffentlich fertig und korrekt konfiguriert. Jetzt kann getestet werden, ob auch wirklich kein Fehler gemacht wurde. Für den allerersten Test empfiehlt es sich, keine grafische Frontends für den Verbindungsaufbau zu benutzen, sondern an der Shell, Server und Client manuell zu starten. Wenn zusätzlich noch in den Konfigurationsdateien die evtl. vorhandenen Einträge log und status auskommentiert werden, bekommt man jede wichtige Information an der Konsole mit. Also zunächst wird der Server gestartet mit einem
openvpn --config server.ovpn
...und dann der Client auf dem anderen Rechner
openvpn --config client.ovpn
Wenn alles richtig läuft, sieht man in den Ausgaben an der Serverkonsole, dass sich ein Client eingewählt hat und welche virtuelle IP-Adresse er bekommen hat (in diesem Beispiel zwischen 192.168.14.100 und 192.168.14.123). Voilà! Somit steht die Verbindung und alle Arbeit ist getan.
Wenn etwas nicht funktioniert
In den wenigsten Fällen funktioniert alles auf Anhieb. Die meisten Probleme lösen sich jedoch, wenn man einmal ganz genau das Augenmerk auf die verwendete Firewall wendet. Hierbei müssen selbstverständlich server- und clientseitig neue Regeln für die neuen Netzwerkdevices eingetragen werden.
Im Folgenden wird noch kurz beschrieben, was es noch lohnt, zu überprüfen.
Bridge Device
Wenn das Bridgedevice korrekt konfiguriert ist, verbindet es in diesem Beispiel eth0 und tap1. Dies kann man so überprüfen:
$ brctl show br0 bridge name bridge id STP enabled interfaces br0 8000.000ee8f3abc4 no eth0 tap1
Wenn alles richtig ist, bringt hier der Aufruf von ifconfig für br0, tap1 und eth0 in etwa folgende Ausgabe:
br0 Link encap:Ethernet HWaddr 00:0e:e8:f3:ab:c4 inet addr:192.168.14.3 Bcast:192.168.14.255 Mask:255.255.255.0 inet6 addr: fe80::20e:e8ff:fef3:abc4/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1488 Metric:1 RX packets:5937250 errors:0 dropped:0 overruns:0 frame:0 TX packets:10302775 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:1242580896 (1.1 GB) TX bytes:452455583 (431.4 MB) eth0 Link encap:Ethernet HWaddr 00:0e:e8:f3:ab:c4 inet6 addr: fe80::20e:e8ff:fef3:abc4/64 Scope:Link UP BROADCAST RUNNING PROMISC MULTICAST MTU:1488 Metric:1 RX packets:5965866 errors:0 dropped:0 overruns:0 frame:0 TX packets:10337789 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:1347958616 (1.2 GB) TX bytes:487988882 (465.3 MB) Interrupt:5 Base address:0xd400 tap1 Link encap:Ethernet HWaddr 00:ff:d4:44:0f:07 inet6 addr: fe80::2ff:d4ff:fe44:f07/64 Scope:Link UP BROADCAST RUNNING PROMISC MULTICAST MTU:1500 Metric:1 RX packets:35587 errors:0 dropped:0 overruns:0 frame:0 TX packets:86755 errors:0 dropped:4 overruns:0 carrier:0 collisions:0 txqueuelen:100 RX bytes:27796862 (26.5 MB) TX bytes:70755085 (67.4 MB)
Also br0 bekommt eine IP-Adresse, tap1 und eth0 nicht.
OpenVPN Konfiguration
Um Informationen für die Fehlersuche zu bekommen sind die Statusausgaben, die - je nach Konfiguration - an der Konsole ausgegeben werden, oder in Dateien geschrieben werden (log und status) wichtige Informationsquellen.
Bemerkungen
Diese Howto ist sicherlich nicht fehlerfrei. Für Anregungen und Fehlermeldungen bin ich offen und ich freue mich über Kritik. Ich bin über gesus14@gmail.com erreichbar.
Links
Dieses Howto ist nach langer Recherche entstanden und basiert auf Zusammengetragenem aus diversen Quellen. Die wichtigsten seien hier kurz aufgeführt:
- http://openvpn.net/index.php/documentation/miscellaneous/ethernet-bridging.html
- http://openvpn.net/index.php/documentation/howto.html
Anhang
Um herauszufinden, wie der Name des Netzwerkdevices unter Windows ist, wählt man im Startmenü unter Systemsteuerung den Eintrag Netzwerkverbindungen aus und sucht nach einem Eintrag mit der Beschreibung TAP Win32 Adapter. In der ersten Spalte ist der Name des Gerätes aufgeführt. Dieser wird sowohl in der Server- als auch in der Clientkonfiguration benötigt.