OpenVPN Gateway

OpenVPN kann als Tunnel verwendet werden, um z.B. bei begrenztem Internetzugang doch alle Dienste zu erreichen. Eigentlich immer offen ist der Port 443, welcher für HTTPS-Dienste benutzt wird. Damit man sich nicht entscheiden muss, ein OpenVPN-Zugang oder einen Webserver zu betreiben, nutzt man die Option port-sharing. Jeglicher Datenverkehr, der nicht zu OpenVPN gehört, wird durch diesen weitergeleitet.

Erstellen der VPN-Zertifikate

OpenVPN basiert auf Zertifikaten, daher muss für die Inbetriebnahme einiges vorbereitet werden. Zuerst werden die notwendigen Programmpakete installiert.

apt-get install openvpn easy-rsa

Das Paket easy-rsa vereinfacht die Erzeugung der notwendigen Zertifikatstruktur. Zuerst wird die Verzeichnisstruktur eingerichtet und eine eigene Zertifizierungsstelle (CA) angelegt.

cd /etc/openvpn/
make-cadir server443_rsa
cd server443_rsa/
cp vars.example vars

In der Datei /etc/openvpn/server443_rsa/vars werden die Einstellungen festgelegt. Um sich bei der Zertifikatserstellung Tipparbeit zu sparen, sollten die Felder EASYRSA_REQ_COUNTRY, EASYRSA_REQ_PROVINCE, EASYRSA_REQ_CITY, EASYRSA_REQ_ORG, EASYRSA_REQ_EMAIL und EASYRSA_REQ_OU in der Datei auf die eigenen Bedürfnisse geändert werden. Die Standardschlüssellänge kann man von 2048 auf 4098 (Variable: EASYRSA_KEY_SIZE) setzen, um die Sicherheit zu erhöhen. Die Variable EASYRSA_CERT_EXPIRE legt fest, nach wie vielen Tagen die Zertifiakte ungültig werden und neue erzeugt werden müssen.

./easyrsa init-pki
./easyrsa build-ca nopass
./easyrsa gen-dh
./easyrsa gen-req server nopass
./easyrsa sign-req server server

Die letzten Befehle erzeugen die Zertifizierungsstelle, die Diffie-Hellman-Parameter sowie ein Schlüsselpaar für den Server, welches gleich auch signiert wird. Aus Sicherheitsgründen sollte man die CA auf einem eigenen Rechner verwalten, der am besten keinen Internetzugang hat.

In die Konfigurationsdatei des OpenVPN-Servers werden die Zertifkate und die Parameterdatei direkt hinterlegt. Die folgende Tabelle gibt Auskunft, welcher Dateiinhalt in welchen Bereich kopiert werden muss.

Datei Bereich
/etc/openvpn/server443_rsa/pki/dh.pem <dh>...</dh>
/etc/openvpn/server443_rsa/pki/ca.crt <ca>...</ca>
/etc/openvpn/server443_rsa/pki/issued/server.crt <crt>...</crt>
/etc/openvpn/server443_rsa/pki/private/server.key <key>...</key>

Konfiguration für den Client erzeugen

Jeder Nutzer, der sich mit dem VPN-Netz verbinden möchte, benötigt ebenfalls eine Konfiguration. Zuerst wird das Zertifikat erzeugt und signiert, dann die Konfigurationsdatei erstellt. Jeder Nutzer benötigt einen eindeutigen Namen, im Beispiel ist dies client1.

cd /etc/openvpn/server443_rsa/
./easyrsa gen-req client1 nopass
./easyrsa sign-req client client1

Die folgende Tabelle zeigt, welcher Dateiinhalt in welchem Bereich der Konfigurationsdatei client1.conf kopiert werden muss.

Datei Bereich
/etc/openvpn/server443_rsa/pki/ca.crt <ca>...</ca>
/etc/openvpn/server443_rsa/pki/issued/client1.crt <crt>...</crt>
/etc/openvpn/server443_rsa/pki/private/client1.key <key>...</key>

Konfiguration des VPN-Servers

Die Konfigurationsdatei /etc/openvpn/server_443.conf zeigt meine aktuellen Einstellungen. Der VPN-Server erhält die IP-Adresse 10.77.0.1. Falls man einen eigenen DNS-Dienst, kann man die VPN-Server-Adresse übermitteln. Die Option local benötigt die externe Adresse, diese ist in jedem Fall an die Gegebenheiten anzupassen.

dev tap
port 443
proto tcp
#externe IP Adresse
local 62.75.202.50
#Webserver
port-share 127.0.0.1 443
ifconfig-pool-persist ipp_443.txt
#VPN-Netz
server 10.77.0.0 255.255.0.0
client-to-client
keepalive 10 120
max-clients 5
user nobody
group nogroup
persist-key
persist-tun
status openvpn-status_443.log
cipher AES-256-GCM
log-append /var/log/openvpn/server_443.log
push "redirect-gateway def1 bypass-dhcp"
#eigener DNS-Server (muss mit VPN-Netz übereinstimmen)
push "dhcp-option DNS 10.77.0.1"
#alternativ z.B. Google-DNS verwenden, wenn kein eigener DNS-Server 
#push "dhcp-option DNS 8.8.8.8"
comp-lzo
verb 2
#mute 2
#mute-replay-warnings
<dh>
...
</dh>
<ca>
...
</ca>
<crt>
...
</crt>
<key>
...
</key>

Anpassen der Firewall

Ich verwende die Skriptsammlung shorewall, um den Server abzuschotten. Für das VPN muss zum einen die Verbindung der Nutzer erlaubt sein, zum anderen muss NAT aktiviert werden, damit die Pakete auch an die Absender zurückkommen. In der Datei /etc/shorewall/interfaces lege ich die Netzwerkgeräte fest. Das externe Gerät ist in diesem Fall eth0, tap0 ist das VPN-Netzwerkgerät.

#
# Shorewall version 4.0 - Sample Interfaces File for one-interface configuration.
# Copyright (C) 2006 by the Shorewall Team
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
# License as published by the Free Software Foundation; either
# version 2.1 of the License, or (at your option) any later version.
#
# See the file README.txt for further details.
#------------------------------------------------------------------------------
# For information about entries in this file, type "man shorewall-interfaces"
###############################################################################
?FORMAT 2
###############################################################################
#ZONE   INTERFACE       OPTIONS
net     eth0            dhcp,tcpflags,logmartians,nosmurfs,sourceroute=0
vpn     tap0            dhcp

In der Datei /etc/shorewall/snat wird das NAT aktiviert. Das angegebene Netz muss zum VPN passen.

#ACTION      SOURCE                  DEST
MASQUERADE   10.77.0.0/24            eth0

Letztendlich wird noch in der Datei /etc/shorewall/shorewall.conf das Weiterleiten der Pakete eingeschaltet. Dazu wird die Option IP_FORWARDING von der Standardeinstellung KEEP auf Yes geändert.

...
IP_FORWARDING=Yes
...

Zum Schluss kann der Regelsatz erstellt und aktiviert werden.

cd /etc/shorewall
shorewall compile
systemctl restart shorewall

Webserverkonfiguration anpassen

Da jetzt der VPN-Server den Port 443 belegen wird, wird der Webserver so eingerichtet, dass er nur auf der Adresse 127.0.0.1 lauscht. Dazu dient eine kleine Anpassung in der Datei /etc/apache2/ports.conf:

# If you just change the port or add more ports here, you will likely also
# have to change the VirtualHost statement in
# /etc/apache2/sites-enabled/000-default.conf

Listen 80

<IfModule ssl_module>
        Listen 127.0.0.1:443
</IfModule>

<IfModule mod_gnutls.c>
        Listen 127.0.0.1:443
</IfModule>

# vim: syntax=apache ts=4 sw=4 sts=4 sr noet

Nach einem Neustart des Webservers sollte der Port 443 für den VPN-Server frei sein. Jetzt können wir auch den VPN-Dienst starten.

systemctl restart apache2
systemctl start openvpn@server_443

Mit dieser Konfiguration lässt sich der gesamte Verkehr der Nutzer über den VPN-Server leiten und so sind alle Dienste verfügbar. Zusätzlich ist der Datenverkehr noch verschlüsselt und nicht einsehbar. Nachteil sind natürlich die höhere Latenz der Netzverbindungen sowie die geringere Datenrate.