OpenVPN: Netzwerkleitungen durch das Internet tunneln

Willemers Informatik-Ecke


Bei Amazon bestellen
2014-11-05
Virtuelles Tunneln wird verwendet, um eine Netzwerkleitung durch feindliches Gebiet zu legen, also durch das Internet. Und damit die Geheimdienste nicht noch mehr Daten lesen müssen, wird das Ganze auch gleich verschlüsselt.

OpenVPN findet sich im Paket openvpn, das bei Debian und Ubuntu mit dem Befehl apt-get installiert werden kann.

apt-get install openvpn

Im folgenden sind hier kurz die Schritte zusammengefasst, die im Buch Linux-Server für Einsteiger ein wenig breiter dargestellt sind.

Konzept

Ein Rechner steht bereit, um anderen Rechnern einen Netzwerkzugang anzubieten. Es kann sich dabei um den Zugang zu einem einzelnen Rechner handeln, durch geeignetes Routing aber auch der Zugang zu einem lokalen Netzwerk. Diesen anbietenden Rechner bezeichnet der folgende Text als OpenVPN-Server.

Die passenden OpenVPN-Clients können Rechner von Mitarbeitern sein, die einen Heimarbeitsplatz nutzen wollen oder auch Filialen, die über das Internet an den Server der Zentrale angebunden werden sollen.

Konfigurationsdateien

Im Verzeichnis /etc/openvpn sind die Konfigurationsdateien von OpenVPN untergebracht.

Zertifikat mit Easy-RSA bauen

Mit dem OpenVPN-Paket wird auch Easy-RSA mitinstalliert, das die Erstellung von Zertifikaten ermöglicht. Die Zertifikate haben die Aufgabe, dass die Partner einander eindeutig identifizieren und auch gleich den Datenverkehr verschlüsseln. Darum sind sie für eine VPN-Verbindung unverzichtbar.

Es wird ein Verzeichnis /etc/openvpn/easyrsa2 angelegt und dort werden die Zertifate erstellt. Zunächst wird das Beispielverzeichnis von Easy-RSA-Paket dorthin kopiert. Es wurde bei der Installation unter /usr/share/doc abgelegt.

cp -rp /usr/share/doc/openvpn/examples/easy-rsa/2.0/* /etc/openvpn/easyrsa2
cd /etc/openvpn/easyrsa2
Zum Bau des Zertifikats wird eine Datei openssl.cnf benötigt. Die ist auch vorhanden, enthält aber eine Versionsnummer. Davon wird ein symbolischer Link gebildet.
ln -s openssl-1.0.0.cnf openssl.cnf
Zuerst wird die Umgebung initialisiert, dann eventuelle fehlgeschlagene Vorversuche entsorgt. Dann wird zunächst ein Basiszertifikat (ca.crt) für die gesamte OpenVPN-Umgebung generiert. Dies kann entfallen, wenn Sie ein Original-Zertifikat einer Certificate Authority besitzen.

. ./vars
./clean-all
./build-ca
./build-dh
Nun wird zunächst für den Server mit dem Skript build-key-server ein Schlüsselpaar für den OpenVPN-Server erstellt, das hier phantasieloserweise server genannt wird.

Für jeden zugriffsberechtigten Client wird ebenfalls ein Schlüsselpaar gebildet, hier durch den Namen client1 angedeutet.

./build-key-server server
./build-key client1
Der Client-Key wird für jeden benötigten Client mit einem eigenen Namen erneut erzeugt. Mit diesen Zertifikaten an der Hand kann nun die Konfiguration gebaut werden.

Nun zu dem Teil, der im Buch Linux-Server für Einsteiger ein wenig kurz geraten ist.

Server-Einstellungen

Auf dem OpenVPN-Server wird nun eine Konfigurationsdatei erstellt, die eine virtuelle Netzwerkschnittstelle tun0 erstellt und darüber ein lokales Netzwerk 10.0.0.0/24 angelegt.

Die Beispielkonfiguration geht davon aus, dass der OpenVPN-Server in einem lokalen Netzwerk mit der Nummer 192.168.109.0/24 steht, da er das Routing für dieses Netzwerk an die Clients weiterpusht.

Ansonsten sieht man die Pfade auf die Zertifikate des Servers.

# /etc/openvpn/server.conf
dev tun0
proto udp # nicht noetig, da default
port 1194 # nicht noetig, da default
server 10.0.0.0 255.255.255.0
push "route 192.168.109.0 255.255.255.0"
dh   /etc/openvpn/easyrsa2/keys/dh1024.pem
ca   /etc/openvpn/easyrsa2/keys/ca.crt
cert /etc/openvpn/easyrsa2/keys/server.crt
key  /etc/openvpn/easyrsa2/keys/server.key
Die Verbindung wird wie üblich, per UDP über Port 1194 eingerichtet. Falls es erforderlich ist, durch eine Firewall zu gehen, die eine Kommunikation auf diesem Weg ausschließt, würde die folgende Einstellung dazu führen, dass der OpenVPN-Server wie ein gewöhnlicher Web-Server aussieht.
proto tcp-server
port 80
Das funktioniert natürlich nur, wenn auf dem Rechner nicht ein anderer Server wie etwa der Apache bereits den Port 80 bedient.

Der Server erzeugt das virtuelle Interface tun0 und verwendet für dieses den freien IP-Nummernkreis 10.0.0.0/24. Es kann eine beliebige Netzwerkadresse verwendet werden. Wichtig ist nur, dass es keine Konflikte mit den Netzwerkadressen der beteiligten Partnern gibt.

Mit dem push wird dem Client eine Route auf das serverseitige Netzwerk 192.168.109.0 zugeschoben. Nur so kann der Client mit den Netzwerkadressen im Zielnetz umgehen.

Damit der Client auch die anderen Rechner im Netzwerk erreichen kann, sind noch ein paar Schritte erforderlich:

Die passende Client-Konfiguration

Der Client nimmt mit dem folgenden Befehl Verbindung mit dem OpenVPN-Server auf:
sudo openvpn --config /etc/openvpn/client.conf
Dazu wird der Client eine Konfigurationsdatei wie die folgende verwenden:
dev tun0
client
proto udp # nicht noetig, da default
port 1194 # nicht noetig, da default
remote meinedyndns.adresseim.net
ca ca.crt
key client1.key
cert client1.crt
Hier wird ebenfalls eine virtuelle Netzwerkschnittstelle tun0 erstellt. Eine Netzwerkadresse des internen Netzwerks gibt der Client nicht an, weil er diese vom Server erfährt. Dafür muss er mit remote die öffentliche Adresse des Servers angeben. Hier wäre es beispielsweise eine dynamische DNS-Adresse. Zuletzt werden über ca, key und cert die Zertifikat-Dateien angegeben. In dieser Konfiguration liegen sie im Aufrufverzeichnis. Normalerweise sollte man den ganzen Pfad angeben.

Soll der Client auf einen OpenVPN-Server zugreifen, der Port 80 unter dem TCP-Protokoll bedient, müsste port und proto entsprechend geändert werden.

port 80
proto tcp-client
Mit den Befehlen netstat -i oder ifconfig tun0 kann man nun das Interface tun0 sehen. Mit netstat -r müsste eine Route im Netzwerk 10.0.0.0/24 auf den OpenVPN-Server zu sehen sein und ein Eintrag in das lokale Netzwerk des Zielrechners, der durch den Push-Befeh eingerichtet wurde.
netstat -r
Kernel-IP-Routentabelle
Ziel            Router          Genmask         Flags   MSS Fenster irtt Iface
default         192.168.99.1    0.0.0.0         UG        0 0          0 eth0
10.0.0.1        10.0.0.5        255.255.255.255 UGH       0 0          0 tun0
10.0.0.5        *               255.255.255.255 UH        0 0          0 tun0
192.168.99.0    *               255.255.255.0   U         0 0          0 eth0
192.168.109.0   10.0.0.5        255.255.255.0   UG        0 0          0 tun0
192.168.99.0/24 ist in diesem Fall das lokale Netzwerk auf der Client-Seite. Nur die Pakete für 10.0.0.0/24 und 192.168.109.0/24 gehen also über das VPN. Alle anderen Routen sind nicht betroffen.

Homepage (C) Copyright 2014 Arnold Willemer