OpenVPN ist eine gute Möglichkeit sicher in “freien” Netzwerken zu surfen. Mit einem VPN wird der gesamte Datenverkehr verschlüsselt zu dem Server übertragen und dort erst wieder entschlüsselt. Der Client “nutzt” dann auch die IP Adresse des Servers, wodurch die eigene IP Adresse für einen dritten nicht mehr sichtbar ist. In dieser Anleitung richten wir einen OpenVPN Server unter Debian 8 Jessie ein und konfigurieren danach einen Client unter Linux Mint. Die Konfiguration wurde extra so angepasst, dass sie sehr sicher ist.
1.OpenVPN Server installieren
Im ersten Schritt installieren wir den OpenVPN Server. Dazu einfach folgenden Befehl eingeben:
apt-get install openvpn easy-rsa
2.Zertifizierungsstelle einrichten
Damit die Verbindung nachher verschlüsselt ist, müssen wir uns eine Zertifizierungsstelle einrichten. Diese erstellt später die Zertifikate für unseren Client / Server.
make-cadir /etc/openvpn/easy-rsa
Nachdem wir dies erledigt habe, können wir die Standardwerte noch anpassen. Dies ist nicht dringend notwendig, da es mit diesen Werten auch funktioniert.
nano /etc/openvpn/easy-rsa/vars
Hier kann man jetzt das Land auf “DE” setzen und die restlichen Werte anpassen. Der Fantasy sind keine Grenzen gesetzt.
export KEY_COUNTRY="US" export KEY_PROVINCE="CA" export KEY_CITY="SanFrancisco" export KEY_ORG="Fort-Funston" export KEY_EMAIL="me@myhost.mydomain" export KEY_OU="MyOrganizationalUnit"
3.Zertifikate erstellen
Nachdem wir die Zertifizierungsstelle eingerichtet haben, können wir nun unsere eigenen Zertifikate erstellen. Dazu wechseln wir ins neu erstelle Verzeichnis und führen folgende Befehle aus:
cd /etc/openvpn/easy-rsa/ source ./vars ./clean-all ./build-dh 2048 ./build-ca
Die Fragen bei “build-ca” könnt ihr einfach mit “Enter” bestätigen.
Nun erstellen wir uns einen privaten Key für unseren OpenVPN Server. Ich nenne diesen Server “server”. Ihr könnt hier jeden beliebigen anderen Namen verwenden.
./build-key-server server
Hier könnt ihr wieder die Fragen mit “ENTER” bestätigen.
Optional könnt ihr noch ein “Challenge password” festlegen, was die Sicherheit erhöht.
Zum Schluss müsst ihr “Sign the certificate” und “1 out of 1 certificate requests certified” mit “y” bestätigen.
Nun erstellen wir das Zertifikat für unseren ersten VPN Client. Dieser heißt bei mir “VPNClient1”. Dies kann jedoch auch jeder andere Name sein.
./build-key VPNClient1
Auch hier bestätigen wir wieder alle Fragen mit “ENTER”.
Nun erstellen wir uns noch einen TLS Key, um alle Pakete zu signieren.
cd keys/ openvpn --genkey --secret ta.key
Wenn ihr euch nun mittels “ls” alle Dateien im Verzeichnis “/etc/openvpn/easy-rsa/keys” anschaut, dann sollte es so aussehen.
ls /etc/openvpn/easy-rsa/keys
Danach kopieren wir die nun erstellten Dateien ins richtige Verzeichnis:
cp ca.crt ca.key dh2048.pem server.crt server.key ta.key /etc/openvpn
4.Konfigurationsdateien erzeugen
4.1 Server Konfiguration
Nun erstellen wir uns Konfigurationsdateien für den OpenVPN Server.
Dazu gebt ihr folgenden Befehl ein:
cd /etc/openvpn/ echo "port 1194 ;proto tcp proto udp dev tun ca ca.crt cert server.crt key server.key dh dh2048.pem server 10.8.0.0 255.255.255.0 ifconfig-pool-persist ipp.txt keepalive 10 120 comp-lzo status openvpn-status.log verb 3 push "redirect-gateway def1 bypass-dhcp" push "dhcp-option DNS 8.8.8.8" push "explicit-exit-notify 3" tls-auth ta.key 0 tls-version-min 1.2 cipher AES-256-CBC auth SHA512 tls-cipher TLS-DHE-RSA-WITH-AES-256-CBC-SHA:TLS-DHE-RSA-WITH-CAMELLIA-256-CBC-SHA" > server.conf
Nun habt ihr die Datei “server.conf” erzeugt mit dem benötigten Inhalt.
4.2 Client Konfiguration anpassen
Dazu führt ihr folgenden Befehl aus:
cd /etc/openvpn/ echo "client dev tun proto udp remote eureDomain.de 1194 resolv-retry infinite nobind persist-key persist-tun comp-lzo verb 3 ns-cert-type server tls-version-min 1.2 cipher AES-256-CBC auth SHA512 key-direction 1 tls-cipher TLS-DHE-RSA-WITH-AES-256-CBC-SHA:TLS-DHE-RSA-WITH-CAMELLIA-256-CBC-SHA <ca> $(cat /etc/openvpn/easy-rsa/keys/ca.crt) </ca> <cert> $(cat /etc/openvpn/easy-rsa/keys/VPNClient1.crt) </cert> <key> $(cat /etc/openvpn/easy-rsa/keys/VPNClient1.key) </key> <tls-auth> $(cat /etc/openvpn/ta.key) </tls-auth>" > VPNClient1.ovpn
Nun existiert eine Datei “VPNClient1.ovpn”. Diese Datei müsst ihr nun öffnen und euren OpenVPN Server eintragen:
nano VPNClient1.ovpn Dort die Zeile abändern remote euerServer 1194 "euerServer" ersetzt ihr durch den DNS Namen eures Servers oder dessen IP Adresse Die "1194" lässt ihr stehen, da dies der Port ist
Nun downloaded ihr euch die Datei “VPNClient1.ovpn”, da ihr diese auf eurem Client benötigt. Den Download könnt ihr mittels WinSCP erledigen.
4.2.1 weitere Clients anlegen
Wenn ihr weitere VPN Clients anlegen wollt, dann müsst ihr folgendes tun:
cd /etc/openvpn/easy-rsa/ ./build-key VPNClientX
Nun habt ihr ein Zertifikat erstellt. Dieses müsst ihr nun im nachfolgenden Befehl benutzten. Das heißt, dass ihr folgende 3 Zeilen pro Client abändern müsst:
$(cat /etc/openvpn/easy-rsa/keys/VPNClientX.crt) $(cat /etc/openvpn/easy-rsa/keys/VPNClientX.key) VPNClientX.ovpn
Danach führt ihr dann das angepasste Script aus:
cd /etc/openvpn/ echo "client dev tun proto udp remote eureDomain.de 1194 resolv-retry infinite nobind persist-key persist-tun comp-lzo verb 3 ns-cert-type server tls-version-min 1.2 cipher AES-256-CBC auth SHA512 key-direction 1 tls-cipher TLS-DHE-RSA-WITH-AES-256-CBC-SHA:TLS-DHE-RSA-WITH-CAMELLIA-256-CBC-SHA <ca> $(cat /etc/openvpn/easy-rsa/keys/ca.crt) </ca> <cert> $(cat /etc/openvpn/easy-rsa/keys/VPNClientX.crt) </cert> <key> $(cat /etc/openvpn/easy-rsa/keys/VPNClientX.key) </key> <tls-auth> $(cat /etc/openvpn/ta.key) </tls-auth>" > VPNClientX.ovpn
5.Firewall anpassen
Nun müssen wir die Firewall des Servers noch anpassen, damit die Pakete vom Client weitergeleitet werden. Dies könnt ihr mit iptables ODER mit ufw machen.
5.1 IPv4 forwarding aktivieren
Um diese Funktion zu aktivieren müsst ihr nachfolgenden Befehl eingeben:
sed -i '/\<net.ipv4.ip_forward\>/c\net.ipv4.ip_forward=1' /etc/sysctl.conf echo 1 > /proc/sys/net/ipv4/ip_forward
5.2.1 Firewall Regeln erstellen mit iptables
Nun gibt ihr nachfolgende Befehle ein:
iptables -A INPUT -p udp -m state --state NEW -m udp --dport 1194 -j ACCEPT iptables -A FORWARD -s 10.8.0.0/24 -j ACCEPT iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE
5.2.2 Firewall Regeln speichern
Damit ihr nach einem Neustart noch eure Firewall Regeln habt, müsst ihr folgendes Programm installieren:
apt-get install iptables-persistent
Nach der Installation führt ihr folgenden Befehl aus:
iptables-save > /etc/iptables/rules.v4
Nun stehen eure Firewall Regeln nach einen Reboot noch zur Verfügung.
5.3 Firewall Regeln erstellen mit ufw
Wenn ihr die ufw Firewall noch nicht kennt, dann könnt ihr diesen Beitrag lesen. Für diese Befehle muss ufw bereits installiert sein.
Der folgende Befehl gibt den UDP Port für euren Server frei:
ufw allow 1194/udp
Danach geht ihr in die ufw Konfiguration und ändert folgendes ab:
nano /etc/default/ufw DEFAULT_FORWARD_POLICY="DROP" zu DEFAULT_FORWARD_POLICY="ACCEPT"
Nun müsst ihr noch eine Datei bearbeiten:
nano /etc/ufw/before.rules
In dieser Datei sollten schon einige Kommentare stehen. Die MARKIERTEN Zeilen müsst ihr einfügen.
# # rules.before # # Rules that should be run before the ufw command line added rules. Custom # rules should be added to one of these chains: # ufw-before-input # ufw-before-output # ufw-before-forward # # 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/8 -o eth0 -j MASQUERADE COMMIT # END OPENVPN RULES # Don't delete these required lines, otherwise there will be errors *filter
Nun könnt ihr eure Firewall aktivieren.
ufw enable
Jetzt solltet ihr überprüfen, ob die Portfreigabe funktioniert hat.
ufw status Status: active To Action From -- ------ ---- 22 ALLOW Anywhere 1194 ALLOW Anywhere 22 ALLOW Anywhere (v6) 1194 ALLOW Anywhere (v6)
6.OpenVPN Server starten
Nun starten wir den OpenVPN Server
systemctl enable openvpn.service && systemctl start openvpn.service
Um den Status zu überprüfen, kann folgender Befehl ausgeführt werden.
systemctl status openvpn*.service
7.Client starten
Ich habe mir als Client ein Linux Mint gewählt. Dort müsst ihr einen OpenVPN Client installiert haben. Danach könnt ihr die VPN Verbindung per Terminal mit folgendem Befehl aufbauen:
sudo openvpn --config "/PfadzurDatei/VPNClient1.ovpn"
8.Quellen
Unterstützte TLS-Ciphers:
https://community.openvpn.net/openvpn/wiki/Hardening
Überblick aller OpenVPN Parameter:
https://openvpn.net/index.php/open-source/documentation/manuals/65-openvpn-20x-manpage.html
OpenVPN inline:
https://community.openvpn.net/openvpn/wiki/IOSinline
Sehr gute, komprimierte Anleitung, danke. Hat direkt funktioniert auf einem älteren Testserver. (Debian Jessie).
Was noch fehlt ist der automatisierte Client:
# kopiere die ovpn als conf in das Systemverzeichnis:
mv /PfadzurDatei/VPNClient1.ovpn /etc/openvpn/VPNClient1.conf
# starte den Service, bzw. nutze die Debian eigene Deamon Mechanik (https://unix.stackexchange.com/questions/409665/starting-openvpn-client-as-daemon-in-debian/409689#409689)
service openvpn@VPNClient1 start
# und abschließend sehr hilfreich, beobachte das VPN Log:
journalctl -f | grep vpn
“Challenge password” hat nichts mit Sicherheit zu tun!
Und schon gar nicht, wenn die CA selbst signiert wird.
Das “Challenge password” ist nur im CSR. – Nicht im KEY und nicht im CRT!
Für iptables (persistent) würde ich ferm empfehlen! Die Rules kann man dort schön einstellen…. und was ein super Vorteil ist: Wenn man sich per SSH auf dem Server befindet – und versehentlich aussperren sollte – kann das mit ferm nicht passieren. Probiert es aus – und ihr seht warum 😉
Was hat dieser Artikel mit härten zu tun?