andere HowTos auf dieser Seite

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

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.

Dieses Howto ist nach langer Recherche entstanden und basiert auf Zusammengetragenem aus diversen Quellen. Die wichtigsten seien hier kurz aufgeführt:

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.