Good to Know Database

CentOS 5: OpenVPN einrichten


1. Einleitung

OpenVPN ist ein Programm mit welchem ein Virtual Private Network (VPN) realisiert werden kann. Mit OpenVPN und OpenSSL ist es möglich einen verschlüsselten VPN-Tunnel zwischen zwei Systemen aufzubauen.

Im folgenden Tutorial möchte ich Ihnen zeigen wie Sie OpenVPN für verschiedene Einsatzzwecke konfigurieren und die gegebenenfalls benötigten Zertifikate mit OpenSSL erstellen.

2. Installation

Bevor Sie OpenVPN konfigurieren und einsetzen können, müssen Sie die Pakete lzo und openvpn installieren. Da diese nicht in den CentOS-Repositories enthalten sind, müssen Sie diese Pakete aus dem Fedora EPEL Repository (http://fedoraproject.org/wiki/EPEL) installieren.

[root@centos5-vpn1 ~]# yum install lzo openvpn

Sollten Sie die Firewall aktiviert haben, müssen Sie noch den UDP-Port 1194 öffnen, damit eingehende Verbindungen angenommen werden können.

[root@centos5-vpn1 ~]# iptables -I INPUT -m state --state NEW -m udp -p udp --dport 1194 -j ACCEPT

Speichern Sie die erstellten Firewall-Regel mit dem folgenden Befehl dauerhaft in die /etc/sysconfig/iptables.

[root@centos5-vpn1 ~]# service iptables save

3. Manuelle Host zu Host Verbindung

Wenn Sie temporär eine VPN-Verbindung zwischen zwei Rechnern aufbauen wollen, reicht es in der Regel wenn man den VPN-Tunnel auf der Konsole erstellt.

Mit dem folgenden Befehl wird eine unverschlüsselte VPN-Verbindung zum Rechner mit der IP-Adresse 192.168.10.2 aufgebaut. Dem Device tun0 des aktuellen Rechners wird beim Verbindungsaufbau die IP-Adresse 192.168.100.1 zugeteilt und die Gegenstelle erhält die IP-Adresse 192.168.100.2.

[root@centos5-vpn1 ~]# openvpn --dev tun0 --remote 192.168.10.2 --ifconfig 192.168.100.1 192.168.100.2 >> openvpn.log 2>&1 &

Da im Moment die Gegenstelle noch keine Verbindung annimmt, müssen Sie den gleichen Befehl mit ein paar Änderungen auf dem zweiten System aufrufen.

[root@centos5-vpn2 ~]# openvpn --dev tun0 --remote 192.168.10.1 --ifconfig 192.168.100.2 192.168.100.1 >> openvpn.log 2>&1 &

Auf einer Seite können Sie auch die Option --remote entfernen. Wenn Sie allerdings auf beiden Seiten keine Remoteadresse angegeben haben, kann von jeder Adresse eine VPN-Verbindung aufgebaut werden, was im Moment noch sehr riskant ist, da wir weder eine Authentifizierung der Gegenstelle noch eine Verschlüsselung des Tunnels vornehmen und sich somit jeder mit OpenVPN verbinden kann.

Wenn der VPN-Tunnel erfolgreich aufgebaut wurde, sollten Sie die folgenden Meldungen im  Logfile sehen.

[root@centos5-vpn1 ~]# tail -f openvpn.log
Thu Sep  3 18:27:22 2009 OpenVPN 2.1_rc15 i386-redhat-linux-gnu [SSL] [LZO2] [EPOLL] built on Nov 30 2008
Thu Sep  3 18:27:22 2009 IMPORTANT: OpenVPN's default port number is now 1194, based on an official port number assignment by IANA.  OpenVPN 2.0-beta16 and earlier used 5000 as the default port.
Thu Sep  3 18:27:22 2009 NOTE: OpenVPN 2.1 requires '--script-security 2' or higher to call user-defined scripts or executables
Thu Sep  3 18:27:22 2009 ******* WARNING *******: all encryption and authentication features disabled -- all data will be tunnelled as cleartext
Thu Sep  3 18:27:22 2009 TUN/TAP device tun0 opened
Thu Sep  3 18:27:22 2009 /sbin/ip link set dev tun0 up mtu 1500
Thu Sep  3 18:27:22 2009 /sbin/ip addr add dev tun0 local 192.168.100.1 peer 192.168.100.2
Thu Sep  3 18:27:22 2009 UDPv4 link local (bound): [undef]:1194
Thu Sep  3 18:27:22 2009 UDPv4 link remote: 192.168.10.2:1194
Thu Sep  3 18:27:30 2009 Peer Connection Initiated with 192.168.10.2:1194
Thu Sep  3 18:27:31 2009 Initialization Sequence Completed

Mit dem Befehl ifconfig können Sie zusätzlich überprüfen ob das Device tun0 verfügbar ist und anschließend mit einem Ping die Verbindung überprüfen.

[root@centos5-vpn1 ~]# ifconfig tun0
tun0      Link encap:UNSPEC  HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
          inet addr:192.168.100.1  P-t-P:192.168.100.2  Mask:255.255.255.255
          UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:100
          RX bytes:0 (0.0 b)  TX bytes:0 (0.0 b)

[root@centos5-vpn1 ~]# ping -c 5 192.168.100.2
PING 192.168.100.2 (192.168.100.2) 56(84) bytes of data.
64 bytes from 192.168.100.2: icmp_seq=1 ttl=64 time=7.26 ms
64 bytes from 192.168.100.2: icmp_seq=2 ttl=64 time=2.00 ms
64 bytes from 192.168.100.2: icmp_seq=3 ttl=64 time=1.12 ms
64 bytes from 192.168.100.2: icmp_seq=4 ttl=64 time=1.35 ms
64 bytes from 192.168.100.2: icmp_seq=5 ttl=64 time=2.05 ms

--- 192.168.100.2 ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 3999ms
rtt min/avg/max/mdev = 1.120/2.758/7.262/2.281 ms

Da wir OpenVPN im Hintergrund gestartet haben, müssen Sie OpenVPN mit dem folgenden Befehl beenden und schließen somit auch den VPN-Tunnel wieder.

[root@centos5-vpn1 ~]# killall openvpn

Wenn Sie die VPN-Verbindung verschlüsseln wollen, müssen Sie einen sogenannten statischen Schlüssel erzeugen welcher auf beiden Rechnern verfügbar sein muss. Den statischen Schlüssel erstellen Sie mit dem folgenden Befehl.

[root@centos5-vpn1 ~]# openvpn --genkey --secret /etc/openvpn/static.key

Die soeben erstellte Datei müssen Sie jetzt über einen sicheren Weg auf den zweiten Rechner transferieren. Dazu können Sie einen USB-Stick, eine verschlüsselte E-Mail oder wie im folgenden Beispiel SCP verwenden.

[root@centos5-vpn1 ~]# scp /etc/openvpn/static.key root@192.168.10.2:/etc/openvpn/

Sobald der statische Schlüssel auf beiden Rechnern verfügbar ist, können Sie einen verschlüsselten VPN-Tunnel aufbauen. Dazu fügen Sie einfach den beiden Befehlen von oben die Option --secret und den vollständigen Pfad zur static.key an.

[root@centos5-vpn1 ~]# openvpn --dev tun0 --remote 192.168.10.2 --ifconfig 192.168.100.1 192.168.100.2 --secret /etc/openvpn/static.key >> openvpn.log 2>&1 &

4. Host zu Host Verbindung mit dem OpenVPN-Daemon

Eine weitere Variante zwei Rechner mit OpenVPN zu verbinden besteht darin die Einstellungen in einer Konfigurationsdatei zu speichern und den OpenVPN-Daemon für den Verbindungsaufbau zu verwenden.

Zuerst wird hier der VPN-Client mit der IP-Adresse 192.168.10.1 konfiguriert. Erstellen Sie auf diesem Rechner die Datei /etc/openvpn/server.conf.

[root@centos5-vpn1 ~]# vi /etc/openvpn/server.conf

In diese Datei fügen Sie jetzt die folgenden Zeilen ein.

dev tun0
remote 192.168.10.2
ifconfig 192.168.100.1 192.168.100.2
secret static.key

Wie Sie sehen werden nur die bereits aus dem vorhergehenden Abschnitt bekannten Optionen eingetragen.

Auf dem zweiten VPN-Client mit der IP-Adresse 192.168.10.2 erstellen Sie ebenfalls die Datei /etc/openvpn/server.conf.

[root@centos5-vpn2 ~]# vi /etc/openvpn/server.conf

Auch hier kommen keine neuen Optionen hinzu.

dev tun0
remote 192.168.10.1
ifconfig 192.168.100.2 192.168.100.1
secret static.key

Sollten Sie noch keinen statischen Schlüssel erstellt und auf beiden Systemen unter /etc/openvpn/static.key hinterlegt haben, erstellen Sie diesen wie im vorherigen Abschnitt beschrieben und hinterlegen ihn auf beiden Systemen.

Der OpenVPN-Daemon wird anschließend wie folgt auf beiden Systemen gestartet.

[root@centos5-vpn1 ~]# service openvpn start

Sobald auf beiden Systemen der OpenVPN-Daemon gestartet wurde, wird ein VPN-Tunnel aufgebaut. Sollte dies nicht der Fall sein, überprüfen Sie die Meldungen im Logfile /var/log/messages.

[root@centos5-vpn1 ~]# tail -f /var/log/messages

Um den VPN-Tunnel zu trennen, müssen Sie nur den OpenVPN-Daemon stoppen.

[root@centos5-vpn1 ~]# service openvpn stop

5. OpenVPN-Server für mehrere Clients

Wenn Sie von mehreren Clients eine Verbindung zu einem OpenVPN-Server aufbauen wollen, kommen Sie mit den bisher genannten Methoden nicht sehr weit. In diesem Fall müssen Sie die Authentifizierung und Verschlüsselung mit Zertifikaten durchführen.

In diesem Abschnitt soll ein OpenVPN-Server (192.168.10.1) konfiguriert werden, welcher im Internet unter der Adresse vpn-server.dyndns.org erreichbar ist, und ein VPN-Client welcher sich über das Internet mit dem VPN-Server verbinden kann und anschließend Zugriff auf das interne Netzwerk 192.168.10.0/24 hat.

Bevor Sie die Zertifikate generieren, erstellen Sie die folgenden OpenSSL-Verzeichnisse und wechseln nach /etc/ssl.

[root@centos5-vpn1 ~]# mkdir -p /etc/ssl/private /etc/ssl/certs
[root@centos5-vpn1 ~]# cd /etc/ssl/

Zuerst erstellen Sie mit dem folgenden Befehl einen Certificate Authority (CA) Schlüssel.

[root@centos5-vpn1 ssl]# openssl genrsa -aes256 -out private/vpn-cakey.pem 2048

Während des Vorgangs müssen Sie ein Passwort vergeben welches Sie im weiteren Verlauf noch öfters benötigen. Des Weiteren wird dieses Passwort auch benötigt um ein abgelaufenes Zertifikat zu erneuern oder kompromittierte Zertifikate zu sperren.

Generating RSA private key, 2048 bit long modulus
...............+++
..............................................+++
e is 65537 (0x10001)
Enter pass phrase for private/vpn-cakey.pem:
Verifying - Enter pass phrase for private/vpn-cakey.pem:

Nachdem der CA-Schlüssel erstellt wurde, wird die Certificate Authority erzeugt. Mit dem Parameter -days wird angegeben wie lange der Schlüssel gültig sein soll (hier 10 Jahre).

[root@centos5-vpn1 ssl]# openssl req -new -x509 -days 3650 -key private/vpn-cakey.pem -out vpn-ca.pem -set_serial 1

Sie müssen nun das zuvor verwendete Passwort eingeben und anschließend einige Fragen beantworten.

Enter pass phrase for private/vpn-cakey.pem:
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [GB]:DE
State or Province Name (full name) [Berkshire]:Bayern
Locality Name (eg, city) [Newbury]:Woerth an der Donau
Organization Name (eg, company) [My Company Ltd]:Privat
Organizational Unit Name (eg, section) []:IT
Common Name (eg, your name or your server's hostname) []:VPN
Email Address []:root@localhost

Damit die Nummerierung der Zertifikate automatisch erfolgt, erstellen Sie die folgende Datei.

[root@centos5-vpn1 ssl]# echo "01" > serial

Jetzt erzeugen Sie einen Certificate Signing Request (CSR) für den Server.

[root@centos5-vpn1 ssl]# openssl req -new -newkey rsa:1024 -out certs/servercsr.pem -nodes -keyout private/serverkey.pem -days 3650

Dazu müssen wieder einige Fragen beantwortet werden.

Generating a 1024 bit RSA private key
.........++++++
...........................++++++
writing new private key to 'private/serverkey.pem'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [GB]:DE
State or Province Name (full name) [Berkshire]:Bayern
Locality Name (eg, city) [Newbury]:Woerth an der Donau
Organization Name (eg, company) [My Company Ltd]:Privat
Organizational Unit Name (eg, section) []:IT
Common Name (eg, your name or your server's hostname) []:VPN_SERVER
Email Address []:root@localhost

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

Sobald der CSR erstellt wurde, wird das Server-Zertifikat generiert.

[root@centos5-vpn1 ssl]# openssl x509 -req -in certs/servercsr.pem -out certs/servercert.pem -CA vpn-ca.pem -CAkey private/vpn-cakey.pem -CAserial /etc/ssl/serial -days 3650

Hier müssen Sie nur das Passwort des CA-Schlüssels eingeben.

Signature ok
subject=/C=DE/ST=Bayern/L=Woerth an der Donau/O=Privat/OU=IT/CN=VPN_SERVER/emailAddress=root@localhost
Getting CA Private Key
Enter pass phrase for private/vpn-cakey.pem:

Nachdem das Server-Zertifikat erzeugt wurde, müssen Sie noch für jeden OpenVPN-Client ein Client-Zertifikat erstellen. Dazu wird zuerst ein Certificate Signing Request (CSR) für den ersten Client erzeugt.

[root@centos5-vpn1 ssl]# openssl req -new -newkey rsa:1024 -out certs/client1csr.pem -nodes -keyout private/client1key.pem -days 3650

Wie beim Server-CSR müssen Sie auch hier wieder einige Fragen beantworten..

Generating a 1024 bit RSA private key
..++++++
............................................................++++++
writing new private key to 'private/client1key.pem'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [GB]:DE
State or Province Name (full name) [Berkshire]:Bayern
Locality Name (eg, city) [Newbury]:Woerth an der Donau
Organization Name (eg, company) [My Company Ltd]:Privat
Organizational Unit Name (eg, section) []:IT
Common Name (eg, your name or your server's hostname) []:VPN_CLIENT1
Email Address []:root@localhost

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

Ist der Client Certificate Signing Request erzeugt worden, folgt die Generierung des Client-Zertifikats.

[root@centos5-vpn1 ssl]# openssl x509 -req -in certs/client1csr.pem -out certs/client1cert.pem -CA vpn-ca.pem -CAkey private/vpn-cakey.pem -CAserial /etc/ssl/serial -days 3650

Auch hier müssen Sie nur das Passwort des CA-Schlüssels eingeben.

Signature ok
subject=/C=DE/ST=Bayern/L=Woerth an der Donau/O=Privat/OU=IT/CN=VPN_CLIENT1/emailAddress=root@localhost
Getting CA Private Key
Enter pass phrase for private/vpn-cakey.pem:

Wenn Sie mehrere OpenVPN-Clients einsetzen, müssen Sie die beiden Schritte für den Certificate Signing Request und für das Client-Zertifikat mehrmals wiederholen.

Nachdem Sie die Zertifikate für den Server und die Clients erstellt haben, müssen Sie noch die Diffie-Hellman-Parameter für den VPN-Server erstellen, welche für den Austausch der Schlüssel über eine ungesicherte Verbindung benötigt werden.

[root@centos5-vpn1 ssl]# openssl dhparam -out dh1024.pem 1024

Dieser Vorgang kann je nach Systemleistung einige Sekunden bis ein paar Minuten dauern.

Generating DH parameters, 1024 bit long safe prime, generator 2
This is going to take a long time
...............+.........+...............................+..........
[...]

Nachdem Sie alle Zertifikate und die Diffie-Hellman-Parameter erstellt haben, kopieren Sie die Server-Zertifikate in das OpenVPN-Verzeichnis.

[root@centos5-vpn1 ssl]# cp vpn-ca.pem certs/servercert.pem private/serverkey.pem dh1024.pem /etc/openvpn/

Die Client-Zertifikate sollten Sie auch hier wieder über einen sicheren Transportweg auf die Clients kopieren. Mit dem folgenden Befehl werden die benötigten Client-Zertifikate mit SCP auf den Client kopiert.

[root@centos5-vpn1 ssl]# scp vpn-ca.pem certs/client1cert.pem private/client1key.pem root@192.168.10.2:/etc/openvpn/

Sobald die Zertifikate in die OpenVPN-Verzeichnisse kopiert wurden, müssen Sie noch die Konfigurationsdateien erstellen. Zuerst erstellen Sie die Konfigurationsdatei für den OpenVPN-Server.

[root@centos5-vpn1 ssl]# vi /etc/openvpn/server.conf

Die Konfigurationsdatei sollte wie folgt aufgebaut sein.

dev tun
ca /etc/openvpn/vpn-ca.pem
cert /etc/openvpn/servercert.pem
key /etc/openvpn/serverkey.pem
dh /etc/openvpn/dh1024.pem
server 192.168.100.0 255.255.255.0
push "route 192.168.10.0 255.255.255.0"
keepalive 10 120
auth SHA1
cipher AES-256-CBC
verb 3

Die Option dev gibt an welches virtuelle Netzwerkgerät verwendet werden soll. Die nächsten Optionen geben die Zertifikate und die Diffie-Hellman-Parameter an. Danach folgt die Option server mit welcher Sie das Netzwerk und die Subnetmask für OpenVPN angeben.
Mit push wird hier eine Route auf dem VPN-Client eingetragen sobald dieser eine Verbindung zum VPN-Server aufgebaut hat. Damit ist es möglich bei aktiviertem IP-Forwarding auf das Netzwerk des Servers zugreifen zu können.
Die beiden Werte der Option keepalive geben an, in welchem Intervall ein Ping an die Gegenstelle gesendet werden soll und nach welcher Zeit ohne Antwort der Verbindungspartner nicht mehr verfügbar ist.
Die Optionen auth und cipher legen fest mit welchem Algorithmus die Authentifizierung und die Verschlüsselung erfolgen. Der Wert hinter verb gibt den Level der Debug-Meldungen an. In den meisten Fällen reicht der Level 3 aus um genügend Statusinformationen vom OpenVPN-Daemon zu erhalten. Sobald OpenVPN zu Ihrer Zufriedenheit läuft, können Sie diesen Wert auch auf 0 setzen und somit nur noch die kritische Fehler im Logfile loggen.

Nachdem Sie die Server-Konfiguration abgeschlossen haben, erstellen Sie die Konfiguration auf den Client-Systemen.

[root@centos5-vpn2 ~]# vi /etc/openvpn/server.conf

Ihre Client-Konfiguration sollte wie folgt aussehen.

client
float
dev tun
remote vpn-server.dyndns.org 1194
ca /etc/openvpn/vpn-ca.pem
cert /etc/openvpn/client1cert.pem
key /etc/openvpn/client1key.pem
auth SHA1
cipher AES-256-CBC
verb 3

Da sich hier bereits bekannte Optionen wiederfinden, werde ich nur die neuen Optionen kurz erläutern. Die Option client gibt an das sich der OpenVPN-Daemon im Client-Modus befindet und Konfigurationen vom Server annimmt.
Mit der Option float ist es möglich, dass sich die IP-Adresse des OpenVPN-Servers ändert ohne das die Verbindung abbricht. Dies ist zum Beispiel dann der Fall wenn der OpenVPN-Server seine IP-Adresse von einem DHCP-Server erhält oder die Verbindung über eine Internetverbindung ohne feste IP-Adresse läuft. Sobald sich die IP-Adresse ändert und Pakete von der neuen Adresse ankommen welche alle Authentifizierungsüberprüfungen bestehen, übernimmt die neue Adresse die Kontrolle über die VPN-Verbindung.
Die Option remote gibt die Adresse und den Port des OpenVPN-Server an.

Wie bereits erwähnt, wird mit dem folgenden Eintrag in der Konfigurationsdatei des OpenVPN-Servers eine Route auf dem Client eingetragen sobald dieser eine Verbindung aufgebaut hat.

push "route 192.168.10.0 255.255.255.0"

Dies reicht allerdings noch nicht aus um auf ein System im Netzwerk des OpenVPN-Servers zugreifen zu können. Dazu müssen Sie auf dem Server das IP-Forwarding aktivieren und den einzelnen Clients im Netzwerk den OpenVPN-Server als Gateway bekannt machen.

Das IP-Forwarding können Sie mit dem folgenden Befehl temporär aktivieren.

[root@centos5-vpn1 ssl]# sysctl -w net.ipv4.ip_forward=1

Wenn Sie das IP-Forwarding dauerhaft aktivieren wollen, setzen Sie in der Datei /etc/sysctl.conf zusätzlich den Wert der folgenden Option auf 1.

net.ipv4.ip_forward = 0

Jetzt können Sie bereits vom VPN-Client aus Pakete an einen Rechner im Netzwerk 192.168.10.0/24 senden, erhalten aber keine Antwort. Das liegt daran das die Pakte zwar am Ziel ankommen aber kein Weg zurück zu Ihrem VPN-Client bekannt ist. Aus diesem Grund müssen Sie auf den Clients im Netzwerk 192.168.10.0/24 noch den OpenVPN-Server als Gateway für alle Anfragen aus dem Netzwerk 192.168.100.0/24 angeben.

[root@centos5-client ~]# route add -net 192.168.100.0 netmask 255.255.255.0 gw 192.168.10.1

Sobald die Konfiguration des Servers und der Clients abgeschlossen ist, können Sie die OpenVPN-Daemons starten.

[root@centos5-vpn1 ssl]# service openvpn start

Sollte es Probleme beim Aufbau der VPN-Tunnel geben, überprüfen Sie die Log-Meldungen.

[root@centos5-vpn1 ssl]# tail -f /var/log/messages

Hinweis: Wenn Sie einen OpenVPN-Tunnel mit Zertifikaten absichern, müssen Sie sicherstellen, dass auf den einzelnen Rechnern die Systemzeit übereinstimmt. Am Besten lösen Sie dieses Problem, indem Sie auf den VPN-Systemen das Network Time Protocol (NTP) einsetzen. Lesen Sie hierzu das Tutorial CentOS 5: Network Time Protocol (NTP).

Damit der OpenVPN-Daemon beim Systemstart automatisch gestartet wird, aktivieren Sie ihn im Runlevel 3 und 5.

[root@centos5-vpn1 ssl]# chkconfig --level 35 openvpn on

6. Zwei Netzwerke mit OpenVPN verbinden

Nachdem wir uns bisher nur mit VPN-Verbindungen zwischen zwei Rechnern und mit der Einwahl in ein Netzwerk beschäftigt haben, wollen wir jetzt ein weiteres Szenario behandeln, bei welchem mit OpenVPN zwei Netzwerke miteinander verbunden werden.

In diesem Abschnitt möchte ich Ihnen also zeigen wie Sie die beiden Netzwerke 192.168.10.0/24 und 192.168.20.0/24 mit OpenVPN verbinden. In beiden Netzen steht ein OpenVPN-Server welcher die IP-Adresse 192.168.10.1 beziehungsweise 192.168.20.1 besitzt und im Internet unter vpn-server1.dyndns.org beziehungsweise vpn-server2.dyndns.org erreichbar ist. Ziel dieses Beispiels ist es, dass ein Rechner im Netzwerk 192.168.10.0/24 einen anderen Rechner im Netzwerk 192.168.20.0/24 erreichen kann.

Zuerst müssen Sie wie bereits im vorherigen Kapitel beschrieben die Zertifikate erstellen. Für dieses Beispiel benötigen Sie eine Certificate Authority, ein Server- und ein Client-Zertifikat sowie die Diffie-Hellman-Parameter .

Nachdem Sie diese Dateien generiert und auf die beiden OpenVPN-Server übertragen haben, können Sie die Konfigurationsdateien erstellen. Zuerst wollen wir den Server hinter der externen Adresse vpn-server1.dyndns.org konfigurieren.

Unter /etc/openvpn/ sollten sich bereits die folgenden Dateien befinden.

[root@centos5-vpn1 ~]# ls /etc/openvpn/
dh1024.pem  servercert.pem  serverkey.pem  vpn-ca.pem

Erstellen Sie jetzt die OpenVPN-Konfigurationsdatei.

[root@centos5-vpn1 ~]# vi /etc/openvpn/server.conf

Die Konfigurationsdatei sollte wie folgt aussehen.

dev tun
ca /etc/openvpn/vpn-ca.pem
cert /etc/openvpn/servercert.pem
key /etc/openvpn/serverkey.pem
dh /etc/openvpn/dh1024.pem
server 192.168.100.0 255.255.255.0
push "route 192.168.10.0 255.255.255.0"
keepalive 10 120
auth SHA1
cipher AES-256-CBC
verb 3
client-config-dir /etc/openvpn/ccd
route 192.168.20.0 255.255.255.0

Bis auf die zwei letzten Zeilen unterscheidet sich diese Konfigurationsdatei nicht von der Server-Konfiguration aus dem letzten Abschnitt. Die Option client-config-dir gibt das Verzeichnis an, in welchem die Client-spezifischen Konfigurationsdateien abgelegt werden. Die Dateinamen müssen mit dem Common Name aus dem jeweiligen Client-Zertifikat übereinstimmen, damit OpenVPN die Konfigurationsdateien den Clients eindeutig zuordnen kann. Mit der Option route wird eine lokale Route in das zweite Netzwerk erzeugt.

Erstellen Sie jetzt mit dem folgenden Befehl das Verzeichnis für die Client-spezifischen Konfigurationsdateien.

[root@centos5-vpn1 ~]# mkdir /etc/openvpn/ccd/

Wenn Sie, wie im letzten Abschnitt zu sehen, beim Erstellen des Client-Zertifikates für den OpenVPN-Server vpn-server2.dyndns.org als Common Name VPN_CLIENT1 angegeben haben, müssen Sie die Datei /etc/openvpn/ccd/VPN_CLIENT1 erstellen.

[root@centos5-vpn1 ~]# vi /etc/openvpn/ccd/VPN_CLIENT1

Fügen Sei die folgende Zeile in die Client-spezifische Konfigurationsdatei ein.

iroute 192.168.20.0 255.255.255.0

Durch die Option iroute wird erreicht, dass der Client eine Route für sein Netzwerk setzt, damit dieses ebenfalls Zugriff auf das VPN erhält.

Kommen wir jetzt zur OpenVPN-Konfiguration des Servers mit der öffentlichen Adresse vpn-server2.dyndns.org. Im OpenVPN-Verzeichnis sollten sich bereits die folgenden Dateien befinden.

[root@centos5-vpn2 ~]# ls /etc/openvpn/
client1cert.pem  client1key.pem  vpn-ca.pem

Auch hier erstellen wir wieder die Konfigurationsdatei /etc/openvpn/server.conf.

[root@centos5-vpn2 ~]# vi /etc/openvpn/server.conf

Fügen Sie hier die folgenden Zeilen ein. Wie Sie feststellen werden, ist diese Konfigurationsdatei identisch mit der Client-Konfiguration aus dem vorhergehenden Abschnitt.

client
float
dev tun
remote vpn-server1.dyndns.org 1194
ca /etc/openvpn/vpn-ca.pem
cert /etc/openvpn/client1cert.pem
key /etc/openvpn/client1key.pem
auth SHA1
cipher AES-256-CBC
verb 3

Wenn Sie jetzt auf beiden Servern den OpenVPN-Daemon starten würden, könnten die Server untereinander bereits über den VPN-Tunnel miteinander kommunizieren. Das Ziel ist jedoch, dass ein Client aus dem Netzwerk 192.168.10.0/24 mit einem Client im Netzwerk 192.168.20.0/24 kommunizieren kann. Dazu aktivieren Sie zuerst auf dem VPN-Server vpn-server1.dyndns.org das IP-Forwarding mit dem folgenden Befehl.

[root@centos5-vpn1 ssl]# sysctl -w net.ipv4.ip_forward=1

Wenn Sie das IP-Forwarding dauerhaft aktivieren wollen, setzen Sie in der Datei /etc/sysctl.conf zusätzlich den Wert der folgenden Option auf 1.

net.ipv4.ip_forward = 0

Anschließend müssen Sie die FORWARD-Chain der Linux-Firewall noch entsprechend konfigurieren, dass Pakete vom gegenüberliegenden VPN-Server angenommen und ausgehende Pakete an den gegenüberliegenden VPN-Server nicht geblockt werden. Alle anderen Pakete sollen nicht weitergeleitet werden.

[root@centos5-vpn1 ~]# iptables -P FORWARD DROP
[root@centos5-vpn1 ~]# iptables -I FORWARD -d 192.168.20.1 -j ACCEPT
[root@centos5-vpn1 ~]# iptables -I FORWARD -s 192.168.20.1 -j ACCEPT

Hinweis: Wenn Sie die Funktion der Firewall-Regeln überprüft haben, können Sie diese wie unter www.gtkdb.de/index_7_746.html beschrieben dauerhaft speichern.

Die Konfiguration der FORWARD-Chain können Sie mit dem folgenden Befehl überprüfen.

[root@centos5-vpn1 ~]# iptables -L FORWARD
Chain FORWARD (policy DROP)
target     prot opt source               destination
ACCEPT     all  --  192.168.20.1         anywhere
ACCEPT     all  --  anywhere             192.168.20.1
RH-Firewall-1-INPUT  all  --  anywhere             anywhere

Auf dem VPN-Server vpn-server2.dyndns.org müssen Sie jetzt die gleichen Einstellungen vornehmen. Beachten Sie aber die abweichenden IP-Adressen bei den Firewall-Regeln.

Zuerst aktivieren Sie wieder das IP-Forwarding.

[root@centos5-vpn2 ssl]# sysctl -w net.ipv4.ip_forward=1

Vergessen Sie nicht die Änderung der /etc/sysctl.conf wenn Sie das IP-Forwarding dauerhaft aktivieren wollen.

Die Firewall-Konfiguration nehmen Sie mit den folgenden Befehlen vor.

[root@centos5-vpn2 ~]# iptables -P FORWARD DROP
[root@centos5-vpn2 ~]# iptables -I FORWARD -d 192.168.10.1 -j ACCEPT
[root@centos5-vpn2 ~]# iptables -I FORWARD -s 192.168.10.1 -j ACCEPT

Zum Überprüfen der Regel in der FORWARD-Chain rufen Sie wieder den folgenden Befehl auf.

[root@centos5-vpn2 ~]# iptables -L FORWARD
Chain FORWARD (policy DROP)
target     prot opt source               destination
ACCEPT     all  --  192.168.10.1         anywhere
ACCEPT     all  --  anywhere             192.168.10.1
RH-Firewall-1-INPUT  all  --  anywhere             anywhere

Sollten Sie den OpenVPN-Daemon auf den beiden Servern noch nicht gestartet haben, holen Sie dies jetzt nach und aktivieren Ihn wenn gewünscht im Runlevel 3 und 5.

[root@centos5-vpn1 ~]# service openvpn start
[root@centos5-vpn1 ~]# chkconfig --level 35 openvpn on

Wenn der VPN-Tunnel erfolgreich aufgebaut wurde und Sie auf beiden VPN-Servern die eingetragenen Routen überprüfen, sollten die folgenden Routen eingetragen sein.

[root@centos5-vpn1 ~]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
192.168.100.2   0.0.0.0         255.255.255.255 UH    0      0        0 tun0
192.168.100.0   192.168.100.2   255.255.255.0   UG    0      0        0 tun0
192.168.20.0    192.168.100.2   255.255.255.0   UG    0      0        0 tun0
192.168.10.0    0.0.0.0         255.255.255.0   U     0      0        0 eth0
169.254.0.0     0.0.0.0         255.255.0.0     U     0      0        0 eth0
0.0.0.0         192.168.10.2    0.0.0.0         UG    0      0        0 eth0

[root@centos5-vpn2 ~]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
192.168.100.5   0.0.0.0         255.255.255.255 UH    0      0        0 tun0
192.168.100.1   192.168.100.5   255.255.255.255 UGH   0      0        0 tun0
192.168.10.0    192.168.100.5   255.255.255.0   UG    0      0        0 tun0
192.168.20.0    0.0.0.0         255.255.255.0   U     0      0        0 eth0
169.254.0.0     0.0.0.0         255.255.0.0     U     0      0        0 eth0
0.0.0.0         192.168.20.2    0.0.0.0         UG    0      0        0 eth0

Damit ein Client in einem der beiden Netzwerke über den VPN-Tunnel auf ein System im jeweils anderen Netzwerk zugreifen kann, müssen Sie den einzelnen Systemen noch eine Route vorgeben, damit Sie Pakete über den VPN-Tunnel in das andere Netzwerk schicken können. Dazu können Sie entweder den lokalen VPN-Server als Standard-Gateway oder nur als Gateway für das gegenüberliegende Netzwerk angeben.

Der folgende Befehl erzeugt zum Beispiel eine entsprechende Route auf einem Client im 192.168.10.0/24 Netzwerk.

[root@client1 ~]# route add -net 192.168.20.0 netmask 255.255.255.0 gw 192.168.10.1 dev eth0

Im 192.168.20.0/24 Netzwerk muss die Route durch den folgenden Befehl angelegt werden.

[root@client2 ~]# route add -net 192.168.10.0 netmask 255.255.255.0 gw 192.168.20.1 dev eth0

Erst wenn ein Client eine entsprechende Route kennt, kann dieser Pakete in das andere Netzwerk schicken und somit auch auf Anfragen aus dem anderen Netzwerk antworten.


Dieser Eintrag wurde am 04.09.2009 erstellt und zuletzt am 24.01.2016 bearbeitet.

Direkter Link zu dieser Seite: http://www.gtkdb.de/index_33_750.html

[ Zur Startseite ]   [ Zur Kategorie ]


Valid XHTML 1.0 Transitional Valid CSS Valid Atom 1.0

© 2004-2018 by Georg Kainzbauer