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.

Konfiguration des VPN-Servers

Ich gehe davon aus, dass OpenVPN bereits installiert und eigene Zertifikate erstellt sind. 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
dh dh4096.pem
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
<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.