4. OpenVPN konfigurieren
Wie
schon bei den Verschlüsselungsarten möchte ich auch hier
wieder darauf hinweisen, dass das Kapitel 1 Einführung unbedingt gelesen werden sollte. In
diesem
werden die in dieser Konfiguration benutzten Verbindungen und
IP-Nummern
beschrieben.
Die Konfiguration erfolgt in dem Verzeichnis
/etc/openvpn.
Man kann mehrere Konfigurationen für verschiedene VPNs benutzen.
Welche Konfigurationsdatei benutzt werden soll, wird OpenVPN beim
Starten übergeben. In diesem Beispiel benutze ich als Dateinnamen
vpn.conf. In dieser Datei
wird die
Konfiguration vorgenommen. Die Optionen in der Konfiguration sind (fast
alle) äquivalent zu Parametern die man OpenVPN
beim Aufruf mit übergeben kann. D.h. man bräuchte theoretisch
gesehen keine Konfigurationsdatei, sondern könnte alles per
Startparameter übergeben. Die meisten Einstellungen sind
Optional und haben Standardwerte.
Anm.:
eine genauere Beschreibung der
Optionen finden Sie in Kapitel 5
und natürlich in der Manual-Page von OpenVPN (man openvpn).
Gestartet wird OpenVPN in meinen Beispielen immer in der
Eingabeaufforderung mit Übergabe der Konfigurationsdatei als
Parameter (siehe
4.2.1.3). Unter Linux kann
es vorkommen, dass beim Starten das
Device
nicht gefunden wird. Dieses Problem kann wie folgt behoben werden:
mknod /dev/net/tun c 10 200
modprobe tun
Wenn eine Firewall benutzt wird, sollte das Port 1194 oder das
Netzwerkdevice freigeschaltet werden.
iptables -A INPUT -i tun+ -j ACCEPT
Zunächst sollte eine einfache, ungesicherte Verbindung
zwischen zwei Rechnern aufgebaut werden. Hierdurch kann man feststellen
ob es zu
Firewall- und/oder
Device-Problemen kommt oder nicht:
Gateway: openvpn --remote IP-CLIENT --dev tun1 --ifconfig 11.0.0.1 11.0.0.2 --verb 5
Client: openvpn --remote IP-GATEWAY --dev tun1 --ifconfig 11.0.0.2 11.0.0.1 --verb 5
Ob die Verbindung zustande gekommen ist erkennt man an der Meldung
Initialization Sequence Completed.
Die Verbindung kann dann durch gegenseitiges Anpingen getestet werden:
Gateway: ping 11.0.0.2
Client: ping 11.0.0.1
4.1 Die Datei 'vpn.conf'
Ich möchte nochmals daran
erinnern, dass der Name der Konfigurationsdatei frei wählbar ist.
Man kann auch mehrere Dateien, für verschiedene VPN-Verbindungen,
verwenden. Ich beschreibe hier nur die wichtigsten Optionen. Ein
Kommentar beginnt mit '#' oder ';'.
4.2 Statischer Schlüssel
Wenn man einen statischen Schlüssel (siehe
3.1) benutzt ist die
Konfiguration recht simpel. Wir benutzen einen einfachen IP-Tunnel und
dafür das Device
tun.
4.2.1 Client-Gateway-Verbindung
Bei dieser
Art der Verbindung können nur Daten zwischen den beiden Rechnern
ausgetauscht
werden. Auf eventuell vorhandene Netzwerke hinter dem VPN-Gateway der
Zentrale kann nicht zugegriffen werden! Der Client könnte
natürlich auch ein anderer VPN-Gateway sein. Hierdurch können
z.B. Zertifikate, sicher von Gateway zu Gateway kopiert werden. Mein
Client ist in diesem Beispiel ein Windows-Rechner. Die
Konfiguration auf Windows-Rechnern ist gleich der von Linux-Rechnern
bis auf den Unterschied, dass Pfadangaben mit
doppeltem Backslash
geschrieben werden. Für Windows gibt es noch ein paar
zusätzliche Optionen (siehe Manualpage)
Als Tunnel wird ein
IP-Tunnel aufgebaut.
Durch diesen können nur Daten auf IP-Basis gesendet werden. Dies
ist für die meisten Fälle ausreichend.
4.2.1.1 vpn.conf
der Zentrale (bzw. des Gateways):
# OpenVPN soll ins Konfig-Verzeichnis wechseln
cd /etc/openvpn
# Device f. IP-Tunnel
dev tun
# Port und Protokoll
port 1194
proto udp
# Paketgroessen
tun-mtu 1500
fragment 1300
mssfix
# Netzwerkkonfiguration (IP Zentrale - IP Zweigstelle)
ifconfig 11.0.0.1 11.0.0.2
# Authentisierung
secret private/static_key.txt
4.2.1.2 vpn.conf der
Zweigstelle (bzw. des Clients):
# OpenVPN soll ins Konfig-Verzeichnis wechseln
cd C:\\Programme\\OpenVPN\\config
# IP der Gegenstelle
remote 193.158.2.160
# Device f. IP-Tunnel
dev tun
# Port und Protokoll
port 1194
proto udp
# Paketgroessen
tun-mtu 1500
fragment 1300
mssfix
# Netzwerkkonfiguration (IP Zweigstelle - IP Zentrale)
ifconfig 11.0.0.2 11.0.0.1
# Authentisierung
secret private\\static_key.txt
Die wichtigsten benutzten Schlüsselwörter haben folgende
Bedeutung:
- remote (bei Gateway Optional): hier
kann die IP oder der Rechnername der Gegenstelle
angegeben werden. Beim Gateway lassen wir diese Offen, damit auch
Rechner mit dynamischer IP Zugriff haben
- dev: das zu benutzende
Device: tun bei IP-Tunneln
oder tap bei Ethernet-Tunneln
- port: die Portnummer,
die OpenVPN benutzen soll; Standard ist 1194
- proto: das Protokoll
- tun-mtu: maximale Paketgröße,
die Übertragen wird
- fragment: gibt an das
übergrosse Pakete fragmentiert
(mehrere Teile) werden dürfen; nur bei udp notwendig
- mssfix: OFFEN
- ifconfig: hier
übergibt man die Netzwerkkonfiguration. In diesem Fall als erstes
die lokale IP-Nummer und als
zweites die der Gegenstelle
- secret:
Verschlüsselungsmethode Private
Key und Verweis auf den Key
Die IPs, die mit ifconfig gesetzt werden,
müssen in
einem Subnet mit der Maske 255.255.255.252 liegen - also es müssen
zwei
benachbarte Nummern sein.
4.2.1.3 OpenVPN starten
Gestartet
wird OpenVPN in Linux und Windows über die Kommandozeile mit dem
Parameter --config um die Konfigurationsdatei zu übergeben.
Linux:
openvpn --config /etc/openvpn/vpn.conf
.
Windows:
C:\Programme\OpenVPN\bin\openvpn --config C:\Programme\OpenVPN\config\vpn.conf
Unter Windows genügt auch ein
Klick mit der rechten Maustaste auf die Konfigurationsdatei. Dann kann
man mit dem zweiten Eintrag im Kontextmenü OpenVPN starten. Hierzu muss die
Datei jedoch die Endung .OVPN (also vpn.conf.ovpn) besitzen!
Anm.:
die weiteren Beispiele werden alle auf Zertifikaten aufbauen. Sie sind
jedoch alle auch, durch entsprechende Änderung in der
Konfiguration, mit einem statischen Schlüssel möglich.
4.3 Zertifikatbasiert
Im vorigen Abschnitt habe ich eine Client-Gateway-Verbindung mit einem statischen Schlüssel
eingerichtet. Ab nun werde ich für die Beispiele nur noch Zertifikate benutzen. Wenn man zum
Schutz für seine Private Keys ein Passwort verwendet hat, wird
dieses beim Start abgefragt.
4.3.1 Client-Gateway-Verbindung
Diese Verbindungsart ist die selbe wie in
4.2.1.
Es wird nur statt dem
statischen
Schlüssel eine
zertifikatbasierte
Authentisierung benutzt. Die Gegenstelle ist wieder ein
Windows-Rechner.
4.3.1.1 vpn.conf
der Zentrale (Gateway):
# OpenVPN soll ins Konfig-Verzeichnis wechseln
cd /etc/openvpn
# Device f. IP-Tunnel
dev tun
# Port und Protokoll
port 1194
proto udp
# Paketgroessen
tun-mtu 1500
fragment 1300
mssfix
# Netzwerkkonfiguration (IP Zentrale - IP Zweigstelle)
ifconfig 11.0.0.1 11.0.0.2
# Auth.-Server
tls-server
# Zertifikate
ca certs/cacert.pem
cert certs/ServerCert.pem
key private/ServerKey.pem
# Diffie Hellman Parameter
dh certs/dh1024.pem
# Debug-Level
verb 5
4.3.1.2 vpn.conf
des Clients:
# OpenVPN soll ins Konfig-Verzeichnis wechseln
cd C:\\Programme\\OpenVPN\\config
# IP der Gegenstelle
remote 193.158.2.160
# Device f. IP-Tunnel
dev tun
# Port und Protokoll
port 1194
proto udp
# Paketgroessen
tun-mtu 1500
fragment 1300
mssfix
# Netzwerkkonfiguration (IP Zweigstelle - IP Zentrale)
ifconfig 11.0.0.2 11.0.0.1
# Auth.-Client
tls-client
# Zertifikate im PKCS12-Format
pkcs12 certs\\ClientP12.pem
# Debug-Level
verb 5
Die
neuen benutzten Optionen
dienen nun der
Authentisierung.
Zusätzlich habe ich noch mit
verb
den
Debug-Modus aktiviert.
Hierdurch bekommen wir ausführlichere Informationen beim Starten
von
OpenVPN. Mit
tls-server und
tls-client wird festgelegt wer bei
der
Authentisierung der
Server bzw. der
Client ist.
ca, cert, key und
pkcs12 verweisen auf die
Zertifikate. Die Optionen haben folgende
Bedeutung:
- tls-server,
tls-client: Definiert wer bei der Authentifizierung
der Server bzw. der Client ist
- ca: ein Verweis auf das Stammzertifikat der Zertifizierungsstelle
(CA-Root-Zertifikat; liegt auf jedem Rechner)
- cert: ein Verweis auf
das Zertifikat des Rechners
- key: ein Verweis auf
den private Schlüssel
des Rechners
- pkcs12: Verweis auf die
PKCS12-Datei; ersetzt ca, cert und key
- dh: ein Verweis auf die
Datei mit den Diffie-Hellman-Parametern
(nur beim Server; wg. dem
Austausch des temporären Schlüssels)
- verb: bestimmt den
Debug-Level; mögliche Werte sind:
0 - keine Ausgabe;
außer Fehlermeldungen
1-4 - normale Ausgaben
5 - bei Aktivitäten
werden die Buchstaben R und W ausgegeben, klein für
TCP/UDP Pakete und GROSS für TUN/TAP Pakete
6 to 11 - Ausführliche
Debug-Meldungen
4.3.2 Client-Netzwerk-Verbindung
Bisher hatten wir nur einfache
Client-Gateway-Verbindungen getestet. D.h. es kann sich immer nur
ein
Client mit dem Gateway verbinden. Außerdem ist ein Zugriff auf
das hinter dem Gateway liegene Firmennetzwerk nicht möglich.
Nun kommt es aber häufig vor, dass ein oder mehrere
Roadwarrior
Zugriff auf das Firmennetz bekommen sollen. D.h. der Gateway muss mehr
als einen Client akzeptieren. Weiterhin wird er nun gleichzeitig als
DHCP-Server dienen und den
Roadwarriors
IP-Nummern zuweisen. Vorraussetzung dafür, dass die
Routen stimmen ist, das der
VPN-Gateway auch der
Gateway
der Clients im Netzwerk ist! Ansonsten müssen auf den Clients oder
dem bei den Clients eingetragenem Gateway die entsprechenden Routen
gesetzt werden.
4.3.2.1 vpn.conf
der Zentrale (Gateway):
# OpenVPN soll ins Konfig-Verzeichnis wechseln
cd /etc/openvpn
# Device f. IP-Tunnel
dev tun0
# Server
tls-server
server 192.168.2.0 255.255.255.0
mode server
# Zum 'merken' der IP-Nummern
ifconfig-pool-persist /etc/openvpn/ipp.txt
# Port und Protokoll
port 1194
proto udp
# Client eine neue Route zuweisen
push "route 192.168.0.0 255.255.255.0"
# Paketgroessen
tun-mtu 1500
fragment 1300
mssfix
# Authentifizierungsmethode
auth SHA1
# Zertifikate
ca certs/cacert.pem
cert certs/ServerCert.pem
key private/ServerKey.pem
# Diffie Hellman Parameter
dh certs/dh1024.pem
# Verschlüsselungsmethode
cipher AES-256-CBC
# Script bei Verbindung
#up /etc/openvpn/vpnup
# Kompression einschalten
comp-lzo
# Debug-Level
verb 5
4.3.2.2 vpn.conf
des Clients
# OpenVPN soll ins Konfig-Verzeichnis wechseln
cd C:\\Programme\\Kommunikation\\OpenVPN\\config
# Device f. IP-Tunnel
dev tun0
# Client
tls-client
pull
# Port und Protokoll
port 1194
proto udp
# Paketgroessen
tun-mtu 1500
fragment 1300
mssfix
# Gegenstelle
remote 193.158.2.1607
# Authentifizierungsmethode
auth SHA1
# Zertifikate
ca certs\\cacert.pem
cert certs\\ClientCert.pem
key private\\ClientKey.pem
# Verschlüsselungsmethode
cipher AES-256-CBC
# Kompression einschalten
comp-lzo
# Debug-Level
verb 5
Der VPN-Gateway der Zentrale bekommt nun mitgeteilt, dass er im
Servermodus läuft und
DHCP-Server für das Netzwerk
192.168.2.0/24 ist. In der Datei
ipp.txt
werden die IPs gespeichert um Clients bei weiteren Verbindungen
möglichst immer die selben zuzuweisen. Er selbst bekommt hierbei
die 192.168.2.1. Bei erfolgreicher
Verbindung wird auch eine neue
Route
(
push "route ...") an den
Client gesendet, damit dieser das Netzwerk findet. Um Traffic zu sparen
habe ich noch die Komprimierung (
comp-lzo)
eingeschaltet.
- mode server: versetzt
den VPN-Gateway in den Server-Modus und lässt mehrere
Clients zu
(Multi-Client-Modus); wird
eigentlich schon automatisch durch die Option server 192.... gesetzt.
- server: Adressbereich
der Clients
- ifconfig-pool-persist: In
dieser Datei merkt sich der Gateway die IP-Nummern der Clients
- push: mit push ist es möglich dem Client
verschiedene Optionen zu übermitteln. Ich füge hier
eine neue Route hinzu
- pull: hiermit wird dem
Client mitgeteilt, dass er vom Gateway push Anweisungen empfangen und
ausführen soll; ohne pull
würden diese ignoriert
- comp-lzo: schaltet die
Komprimierung der Daten ein
Die Eigenschaften
tls-client
und
pull können auch
durch den Eintrag
client
ersetzt werden.
Wenn Sie sich nun nach dem Verbindungsaufbau auf dem Client seine
Routingtabelle anschauen (
route -n)
werden sie bemerken, dass sich dort die per
push übergebene Route
befindet. Der Client
kann nun auf die Rechner im Netz 192.168.0.0/24 zugreifen und
umgekehrt. Gelegentlich kann es zu Problemen mit verschiedenen Diensten
kommen. In diesem Fall sollten Sie statt dem
udp das
tcp-Protokoll verwenden. Dies wird
durch folgende Änderungen der Konfigdateien erreicht:
vpn.conf der Zentrale
(Gateway):
# Port und Protokoll
port 1194
;proto udp
proto tcp-server
# Paketgroessen
tun-mtu 1500
;fragment 1300
mssfix
vpn.conf des Clients
# Port und Protokoll
port 1194
proto tcp-client
# Paketgroessen
tun-mtu 1500
;fragment 1300
mssfix
Zu beachten ist, dass der Name für das Protokoll auf dem
VPN-Gateway
tcp-server und
auf dem Client
tcp-client
lauten muss.
4.3.3 Netzwerk-Netzwerk Verbindung
In diesem Beispiel sollen nun zwei Netzwerke über zwei
VPN-Gateways miteinander verbunden werden, so dass alle Rechner
miteinander kommunizieren können. Wichtig ist hierbei, dass die
Routen stimmen. Ich gehe davon aus, dass bei den Clients im Netzwerk
die VPN-Gateways
folgt
4.3.4 Ethernet-Tunnel
Bisher benutzte ich immer das tun-Device und baute damit einen IP-Tunnel
auf. Dadurch werden nur IP-Pakete übermittelt, die an eine
IP-Adresse
auf der jeweils anderen Seite eines Knotens gerichtet sind. Dies hat
Vor- und Nachteile. Hauptvorteil ist die geringe Netzwerkbelastung. Es
werden nur Daten übermittelt (geroutet)
die gezielt an einen anderen Rechner gesendet wurden.
Broadcast-Anfragen oder gar andere Protokolle sind nicht möglich.
Wenn dies jedoch erwünscht bzw. notwendig ist, kann man das tap-Device benutzen und mit diesem
einen Ethernet-Tunnel aufbauen.
D.h. es werden nicht mehr nur IP-Pakete über den Tunnel geroutet,
sondern das ganze Netzwerk. Dadurch sind u.a. DHCP-Anfragen
möglich und es können andere Netzwerkprotokolle
übermittelt werden. Ein Rechner der eine solche Verbindung aufbaut
wird also fest in das vorhandene Netzwerk integriert. Dadurch werden
natürlich bedeutend mehr
Daten über den Tunnel gesendet als bei dem IP-Tunnel.
4.3.4.1 vpn.conf
der Zentrale (Gateway):
# OpenVPN soll ins Konfig-Verzeichnis wechseln
cd /etc/openvpn
# Device f. IP-Tunnel
dev tap
# Port und Protokoll
port 1194
proto udp
# Paketgroessen
tun-mtu 1500
fragment 1300
mssfix
# Netzwerkkonfiguration
mode server
ifconfig 11.0.0.1 255.255.255.0
# Auth.-Server
tls-server
# Zertifikate im PKCS12-Format
pkcs12 certs/ServerP12.pem
# Diffie Hellman Parameter
dh certs/dh1024.pem
# Debug-Level
verb 5
4.3.4.2 vpn.conf
eines Clients:
# OpenVPN soll ins Konfig-Verzeichnis wechseln
cd /etc/openvpn
# IP der Gegenstelle
remote erde
# Device f. IP-Tunnel
dev tap
# Port und Protokoll
port 1194
proto udp
# Paketgroessen
tun-mtu 1500
fragment 1300
mssfix
# Netzwerkkonfiguration
ifconfig 11.0.0.2 255.255.255.0
# Auth.-Client
tls-client
# Zertifikate im PKCS12-Format
pkcs12 certs/ClientP12.pem
# Debug-Level
verb 5
Und wieder die Bedeutung der wichtigsten
neuen bzw.
geänderten Schlüsselwörter:
- dev tap: wir
benutzen nun das tap-Device (siehe
auch 5.7)
- mode server: startet OpenVPN im Server-Modus; nun können
mehrere (100 bis über 1000) Clients sich mit
dem Gateway verbinden (Funktioniert auch mit dem dev tun)
- ifconfig: diesmal wird
jedem Rechner seine IP und Netzwerkmaske mitgeteilt;
hierfür ist dev tap
notwendig
Wichtig ist hier, dass auch an eventuelle Firewall-Einstellungen
gedacht wird. Hier wird ja nicht mehr das tun- sondern das tap-Device
benutzt (
iptables -A INPUT -i
tun+ -j ACCEPT). Nun können mehrere Clients
gleichzeitig Verbindung zum Gateway
aufbauen. Jeder besitzt eine eigene IP-Adresse.