How to setup OpenVPN
This guide shows how to setup an OpenVPN server. The guide is written in German because it was a homework assignment. I hope someone will find use for it anyway. This guide was written for Debian Jessie.
Als erstes müssen die OpenVPN Repositories hinzugefügt werden da die Version in den Debian Repositories veraltet ist und nicht alle Sicherheitsfeatures unterstützt die ich nutzen möchte. Hierfür muss zuerst der GPG key importiert werden.
wget -O - https://swupdate.openvpn.net/repos/repo-public.gpg| apt-key add -
Als nächstest generieren wir ein Source List File welches den Pfad zum OpenVPN Repository enthält.
echo "deb http://swupdate.openvpn.net/apt trusty main" > /etc/apt/sources.list.d/swupdate.openvpn.net.list
Nun können die nötigen Packete installiert werden. Wichtig zuerst die Source Liste updaten damit die aktuellste Versionen herunterladen werden.
sudo apt update sudo apt install openvpn easy-rsa
Anschliessend wechsle ich zum root User da alle nachfolgenden Befehle als root ausgeführt werden müssen.
sudo -s
Nun kopiere ich die easy-rsa Scripts und wechsle auch gleich in den Ordner /etc/openvpn/easy-rsa
cp /usr/share/easy-rsa/* /etc/openvpn/easy-rsa/ cd /etc/openvpn/easy-rsa/
Mit vim editiere ich nun die Datei vars. In dieser Datei werden Standardvariabeln gespeichert welche bei der Key und Zertifikat Generierung verwendet werden.
vim vars
Ich habe meine ungefähr so eingetragen wobei ich die Daten auf meinen Wohnort angepasst habe.
export KEY_SIZE=4096 export CA_EXPIRE=365 export KEY_EXPIRE=365 export KEY_COUNTRY="US" export KEY_PROVINCE="TX" export KEY_CITY="Dallas" export KEY_ORG="My Company Name" export KEY_EMAIL="sammy@example.com" export KEY_OU="MYOrganizationalUnit"
Die Variabeln werden nun mit source geladen.
source vars
Nun wird das Verzeichnis mit dem clean-all Script bereinigt.
./clean-all
Anschliessend kann das CA Zertifikat gebildet werden. Dabei werden zwei Dateien generiert ca.key und ca.crt. ca.key muss sicher aufbewahrt werden.
./build-ca
Als nächster Schritt wird der Server Key gebildet. Hierfür führt man das Script build-key- server zusammen mit dem gwünschten Dateinamen aus. Es ist wichtig das dieser Key sicher aufbewahrt wird.
./build-key-server server
Nun können die Keys und die Zertifikate für die Clients gebildet werden. Gleich wie beim Server Key hängt man noch einen Namen an. Hier empfiehlt es sich einen Namen zu nehmen den man mit dem jeweiligen Client in Verbindung bringen kann. Es ist möglich einen Key für mehrere Clients zu verwenden. Ich generiere mir jedoch für jeden Client ein eigenes da es sicherer ist und einfacher ist falls mal ein Gerät verloren geht. Auch hier gilt wieder das die *.key Dateien sicher aufbewahrt werden müssen.
./build-key client
Ich verschiebe dann die Dateien ca.crt, ca.key und testserver.crt in den openvpn Ordner und wechsle zurück in den openvpn Ordner da wir die easy-rsa Scripte nicht mehr benötigen.
mv keys/ca.crt /etc/openvpn/ mv keys/ca.key /etc/openvpn/ mv keys/server.crt /etc/openvpn/ cd ..
Im Anschluss generiere ich den Difie-Hellman Parameter. Dieser muss wie der Server Key oder der ca.key vor unbefugtem Zugriff geschützt werden. Ich habe hier einen Wert von 4096 gewählt. Dies mag ein Bisschen paranoid erscheinen aber ich arbeite nach dem Prinzip "Better safe than sorry" und seit de Snowden Leaks liest man immer mehr darüber das angeblich sichere Werte geknackt wurden oder das verschlüsselte Dateien aufbewahrt werden bis man sie knacken kann.
openssl dhparam -out dh4096.pem 4096
Zusätzlich generiere ich noch einen TLS Autentifizierungs Key. Dieser verhindert DDOS Attacken auf den VPN Server.
openvpn --genkey --secret ta.key
Die Client Zertifikate und Keys kopiere ich in den Home Ordner. Zusätzlich ändere ich noch die Berechtigungen auf meine normalen User damit ich die Dateien dann mit Filezilla oder einem ähnlich Tool vom Server kopieren kann.
mkdir /home/nebucatnetzer/openvpn cp keys/* /home/nebucatnetzer/openvpn chown -R nebucatnetzer:nebucatnetzer/home/nebucatnetzer/keys/
Nun kopiere und extrahiere ich die Beispiel Konfigurationsdatei für einen Server.
cp /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz /etc/openvpn/ gunzip server.conf.gz
Anschliessend mache ich davon zwei Kopien mit eindeutigen Namen.
cp server.conf server_tcp.conf cp server.conf server_udp.conf
Und lösche die das Beispiel Config File.
rm server.conf
Die zwei richtigen Config Files passe ich nun an. Die genaue Config beschreibe ich in der nächsten Sektion.
vim server_tcp.conf vim server_udp.conf
Damit der Traffic vom Server aus weitergeleitet wird, sprich man effektiv durch das VPN surfen kann muss man das Traffic Forwarding aktivieren.
echo "1" > /proc/sys/net/ipv4/ip_forward
Damit die Einstellung nach einem Neustart auch bestehen bleibt muss man die Datei /etc/sysctl.conf öffnen und diese Linie unkommentieren:
#net.ipv4.ip_forward=1
zu
net.ipv4.ip_forward=1
Zusätzlich muss man die Route definieren damit der Server weiss welchen Traffic er wohin routen muss. Einfach den Befehl im Terminal ausführen. Allerdings bleiben auch diese nach einem Reboot nicht bestehen.
iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE iptables -t nat -A POSTROUTING -s 10.9.0.0/24 -o eth0 -j MASQUERADE
Auch muss man die Ports in der Firewall öffnen und die Firewall konfigurieren. Ich nutze UFW was für "Uncomplicated Firewall" steht. Was eigentlich nur ein Tool ist welches es einem vereinfacht iptables (eine Anwendung um die Linux Kernel Firewall zu konfigurieren) Regeln zu erstellen.
ufw allow 1194 ufw allow 443
In der Datei /etc/default/ufw ändern wir die Zeilen:
DEFAULT_OUTPUT_POLICY="DROP" DEFAULT_FORWARD_POLICY="DROP"
zu
DEFAULT_OUTPUT_POLICY="ACCEPT" DEFAULT_FORWARD_POLICY="ACCEPT"
Dies erlaubt ausgehenden und weitergeleiteten Traffic durch die Firewall. Damit die Routen die wir weiter oben definiert haben auch nach einem Neustart erhalten bleiben müssen auch diese noch in einer Config gespeichert werden. Und zwar in /etc/ufw/before.rules gleich nach Ende der Einleitungskommentare fügen wir diese Zeilen hinzu.
# START OPENVPN RULES # NAT table rules *nat :POSTROUTING ACCEPT [0:0] # Allow traffic from OpenVPN client to eth0 -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE COMMIT # END OPENVPN RULES # START OPENVPN RULES # NAT table rules *nat :POSTROUTING ACCEPT [0:0] # Allow traffic from OpenVPN client to eth0 -A POSTROUTING -s 10.9.0.0/24 -o eth0 -j MASQUERADE COMMIT # END OPENVPN RULES
Zum Abschluss der Firewall Konfiguration wird die Firewall neu gestartet. ufw reload Nun aktivieren wir den OpenVPN Service und starten diesen dann auch gerade. Aktvieren müssen wir ihn damit nach einem Neustart des System der OpenVPN Server automatisch wieder gestartet wird. service openvpn enable service openvpn start Nun sollte das VPN einsatzbereit und erreichbar sein. Die Installation wäre somit abgeschlossen.
Hier beschreibe ich den Inhalt von /etc/openvpn/serverudp.conf. Servertcp.conf hat den gleichen Inhalt bis auf port, proto und server X.X.X.X Welche dann bei servertcp wie folgt wären:
port 443 proto tcp server 10.9.0.0 255.255.255.0
Jeder Kommentar erhält ein Rautezeichen am Anfang der Zeile. Dies stellt sicher das beim Kopieren der Server nicht versucht den Kommentar zu interpretieren. serverudp.conf
# Definiert auf welchem Port OpenVPN läuft port 1194 # Definiert mit welchem Protokol OpenVPN läuft proto udp # Definiert ob das Netzwerk gebridget oder geroutet wird. Sprich ob das Gerät direkt mit # den Geräten im VPN kommuniziert (DHCP etc.) oder ob der VPN Server dies # übernimmt. dev tun # Zeigt dem OpenVPN Server wo er die ca.crt, server.crt, server.key und dh4096.pem # Dateien findet. ca ca.crt cert server.crt key server.key dh dh4096.pem # Gibt vor welche interne Route der Server hat. server 10.8.0.0 255.255.255.0 # Definiert das OpenVPN allen Traffic ans Internet weiterreicht. push "redirect-gateway def1 bypass-dhcp" # Gibt den DNS Server vor. Ich habe hier einen unzensierten angegeben um allfällige # Blockaden zu umgehen. push "dhcp-option DNS 84.200.68.80" push "dhcp-option DNS 84.200.70.40" # Wie lange die Verbindung offen gehalten werden soll bei einem Unterbruch. Keepalive 10 120 # Zeigt dem Server wo der ta.key liegt und in welche Richtung die Authentifizierung läuft. # Der Client braucht hier 1 wenn der Server auf 0 steht. tls-auth ta.key 0 # Gibt den Verschlüsselungsalorithmus vor. Ich habe hier einen stärkeren gewählt als # standardmässig eingestellt ist. cipher AES-256-CBC # Mit welchem Hashingalgorithmus die Pakete überprüft werden. Ich habe hier auch einen # stärkeren genommen als der Default da der Default seit längerem als unsicher gilt. auth SHA512 # Gibt vor welche TLS Version mindesten gebraucht werden muss. In diesem Falls # mindesten 1.2 or die höchste verfügbare Version. tls-version-min 1.2 or-highest # Verifiziert diie Zertifikate gegen Man in the middle Attacken remote-cert-tls client # Gibt an das der OpenVPN Server ohne Rechte läuft. Funktioniert nur unter Linux/Unix user nobody group nogroup # Benötigte default Option persist-key persist-tun # Die letzten drei Parameter geben an das keine Logs jeglicher Art aufgezeichnet werden. # Ich brauche nicht zu wissen wer sich wann verbindet sobald das System funktioniert. verb 0 log /dev/null status /dev/null
Resources
- https://www.digitalocean.com/community/tutorials/how-to-set-up-an-openvpn-server-on-ubuntu-14-04
- https://openvpn.net/index.php/open-source/documentation/howto.html
- http://parabing.com/2014/06/openvpn-on-ubuntu/
- https://help.ubuntu.com/14.04/serverguide/openvpn.html
- http://blogging.dragon.org.uk/openvpn-server-on-ubuntu-14-04-2/
- https://gist.github.com/schickling/225550662982cad94e77
- https://oli.new-lan.de/2015/02/openvpn-crypto-tuning-tls-auth-tls-cipher-tls-version-min-dh-verify-x509-name-cipher-auth-remote-cert-tls/
- https://blog.g3rt.nl/openvpn-security-tips.html