So installierst du OpenVPN Server und Client unter FreeBSD
OpenVPN ist eine Open-Source-Anwendung, mit der du ein sicheres privates Netzwerk über das öffentliche Internet aufbauen kannst. OpenVPN implementiert ein virtuelles privates Netzwerk (VPN), um eine sichere Verbindung herzustellen. OpenVPN nutzt die OpenSSL-Bibliothek für die Verschlüsselung und bietet verschiedene Authentifizierungsmechanismen, wie z.B. zertifikatsbasierte, Pre-Shared Keys und Benutzername/Passwort-Authentifizierung.
In diesem Lernprogramm zeigen wir dir, wie du OpenVPN Schritt für Schritt unter FreeBSD 12.0 installierst und konfigurierst. Wir erstellen den VPN-Server mit dem FreeBSD-System und implementieren die zertifikatsbasierte OpenVPN-Authentifizierung.
Voraussetzung
Für diese Anleitung benötigst du das aktuelle FreeBSD 12.0 mit mindestens 512 MB RAM und 1 CPU. Außerdem brauchst du root-Rechte und die pf-Firewall.
Was wir tun werden:
- OpenVPN auf FreeBSD 12.0 installieren
- Variablen für Zertifikate einrichten
- Zertifikate generieren
- OpenVPN konfigurieren
- PF-Firewall einrichten
- Port-Forwarding unter FreeBSD einschalten
- Testen
Schritt 1 – OpenVPN installieren
Zunächst aktualisieren wir das Repository für die Binärpakete und installieren die OpenVPN-Pakete mit dem unten stehenden pkg-Befehl auf dem FreeBSD-System.
pkg update pkg install openvpn
Sobald die Installation abgeschlossen ist, fügst du den OpenVPN-Dienst zum Systemstart hinzu und definierst die OpenVPN-Tunnelschnittstelle „tun“ mit dem unten stehenden sysrc-Befehl.
sysrc openvpn_enable="YES" sysrc openvpn_if="tun"
Nun ist das OpenVPN-Paket auf dem FreeBSD 12.0 System installiert.
Schritt 2 – Variablen für das Zertifikat einrichten
In diesem Schritt richten wir die „easy-rsa“-Variablen für die Erstellung von OpenVPN-Zertifikaten ein.
Erstelle ein neues openvpn-Verzeichnis „/usr/local/etc/openvpn/“ und kopiere das Verzeichnis „easy-rsa“ dorthin.
mkdir -p /usr/local/etc/openvpn/ cp -R /usr/local/share/easy-rsa /usr/local/etc/openvpn/
Gehe nun in das Verzeichnis „/usr/local/etc/openvpn/easy-rsa/“ und bearbeite die Datei „vars“ mit dem Editor vim.
cd /usr/local/etc/openvpn/easy-rsa/ vim vars
Ändere die Details mit deinen eigenen und füge sie ein.
set_var EASYRSA "$PWD" set_var EASYRSA_PKI "$EASYRSA/pki" set_var EASYRSA_DN "cn_only" set_var EASYRSA_REQ_COUNTRY "DE" set_var EASYRSA_REQ_PROVINCE "Frankfurt" set_var EASYRSA_REQ_CITY "Frankfurt" set_var EASYRSA_REQ_ORG "hakase-labs CERTIFICATE AUTHORITY" set_var EASYRSA_REQ_EMAIL "openvpn@hakase-labs.io" set_var EASYRSA_REQ_OU "HAKASE-LABS EASY CA" set_var EASYRSA_KEY_SIZE 2048 set_var EASYRSA_ALGO rsa set_var EASYRSA_CA_EXPIRE 7500 set_var EASYRSA_CERT_EXPIRE 365 set_var EASYRSA_NS_SUPPORT "no" set_var EASYRSA_NS_COMMENT "HAKASE-LABS CERTIFICATE AUTHORITY" set_var EASYRSA_EXT_DIR "$EASYRSA/x509-types" set_var EASYRSA_SSL_CONF "$EASYRSA/openssl-1.0.cnf" set_var EASYRSA_DIGEST "sha256"
Speichere und schließe.
Mache die „vars“-Datei jetzt zu einer ausführbaren Datei.
chmod +x vars
Jetzt können wir die VPN-Zertifikate erstellen.
Schritt 3 – Zertifikate generieren
In diesem Schritt werden wir einige Zertifikate für den OpenVPN-Server erstellen. Wir werden eine CA, Client- und Server-Zertifikate, DH-PARAM und das CRL-Zertifikat (Certificate Revocation List) erstellen.
Gehe in das Verzeichnis „/usr/local/etc/openvpn/easy-rsa/“ und initialisiere das Verzeichnis für die Public Key Infrastructure (PKI) mit dem Befehl „easyrsa.real“ wie unten beschrieben.
cd /usr/local/etc/openvpn/easy-rsa/ ./easyrsa.real init-pki
– CA generieren
Erstelle nun das CA-Zertifikat und den Schlüssel.
./easyrsa.real build-ca
Du wirst nach dem Passwort für den CA-Schlüssel gefragt. Gib dein Passwort ein und das CA-Zertifikat und der Schlüssel sind generiert.
Als Nächstes werden wir das Serverzertifikat und den Schlüssel mit unserer neuen CA erzeugen und signieren.
– Serverzertifikat generieren und signieren
Erstelle das VPN-Serverzertifikat und den Schlüssel mit dem folgenden Befehl.
./easyrsa.real gen-req openvpn-bsd nopass
Danach signierst du das Serverzertifikat mit dem CA-Schlüssel.
./easyrsa.real sign-req server openvpn-bsd
Gib die Passphrase für den CA-Schlüssel ein und das Serverzertifikat und der Schlüssel sind erstellt.
Überprüfe das Serverzertifikat und die Schlüssel mit dem folgenden Befehl.
openssl verify -CAfile pki/ca.crt pki/issued/openvpn-bsd.crt
Stelle sicher, dass du keine Fehlermeldung erhältst.
– Client-Zertifikat generieren und signieren
Nachdem wir das Zertifikat für den Server erstellt haben, erstellen wir ein neues Zertifikat für den Client und signieren es mit dem CA-Schlüssel.
Erstelle das neue Zertifikat und den Schlüssel „client01“ mit dem folgenden Befehl.
./easyrsa.real gen-req client01 nopass
Signiere dann das Zertifikat mit dem CA-Schlüssel.
./easyrsa.real sign-req client client01
Gib die Passphrase für den CA-Schlüssel ein und das Client-Zertifikat und der Schlüssel sind erstellt.
Überprüfe das Client-Zertifikat und den Schlüssel mit dem Befehl openssl (siehe unten).
openssl verify -CAfile pki/ca.crt pki/issued/client01.crt
Du erhältst dann das unten stehende Ergebnis.
Das Client-Zertifikat und der Schlüssel wurden ohne Fehler erstellt.
– DH-PARAM- und CRL-Zertifikat generieren
Das DH-PARAM-Zertifikat wird für zusätzliche Sicherheit benötigt. Und die CRL (Certificate Revocation List) wird verwendet, um alle Client-Zertifikate aufzulisten, die du vom Zugriff auf den VPN-Server ausschließen möchtest.
Erstelle eine neue CRL und ein DH-PARAM-Zertifikat mit dem folgenden Befehl.
./easyrsa.real gen-crl ./easyrsa.real gen-dh
Damit sind alle grundlegenden Zertifikate, die wir für unseren VPN-Server benötigen, erstellt.
– Alle Zertifikate kopieren
Als Nächstes müssen wir alle Zertifikate in das OpenVPN-Verzeichnis kopieren. Erstelle ein neues Verzeichnis „server“ und „client“ innerhalb des OpenVPN-Verzeichnisses.
mkdir -p /usr/local/etc/openvpn/{server,client}
Kopiere das CA-Zertifikat, das Server-Zertifikat und den Schlüssel in das ’server‘-Verzeichnis.
cp pki/ca.crt /usr/local/etc/openvpn/server/ cp pki/issued/openvpn-bsd.crt /usr/local/etc/openvpn/server/ cp pki/private/openvpn-bsd.key /usr/local/etc/openvpn/server/
Kopiere das CA-Zertifikat, das Client01-Zertifikat und den Schlüssel in das „Client“-Verzeichnis.
cp pki/ca.crt /usr/local/etc/openvpn/client/ cp pki/issued/client01.crt /usr/local/etc/openvpn/client/ cp pki/private/client01.key /usr/local/etc/openvpn/client/
Kopiere die DH-PARAM- und CRL-Zertifikate in das „Server“-Verzeichnis.
cp pki/dh.pem /usr/local/etc/openvpn/server/ cp pki/crl.pem /usr/local/etc/openvpn/server/
Jetzt können wir den OpenVPN-Server konfigurieren.
Schritt 4 – OpenVPN konfigurieren
Gehe in das Verzeichnis „/usr/local/etc/openvpn“ und erstelle mit einem Editor eine neue openvpn-Konfiguration namens „openvpn.conf“.
cd /usr/local/etc/openvpn/ vim openvpn.conf
Ändere die Konfiguration wie gewünscht und füge sie ein.
# OpenVPN Port, Protocol, and the Tun port 1194 proto udp dev tun # OpenVPN Server Certificate - CA, server key and certificate ca /usr/local/etc/openvpn/server/ca.crt cert /usr/local/etc/openvpn/server/openvpn-bsd.crt key /usr/local/etc/openvpn/server/openvpn-bsd.key #DH and CRL key dh /usr/local/etc/openvpn/server/dh.pem crl-verify /usr/local/etc/openvpn/server/crl.pem # Network Configuration - Internal network # Redirect all Connection through OpenVPN Server server 10.5.5.0 255.255.255.0 push "redirect-gateway def1" # Using the DNS from https://dns.watch push "dhcp-option DNS 84.200.69.80" push "dhcp-option DNS 84.200.70.40" #Enable multiple clients to connect with the same certificate key duplicate-cn # TLS Security cipher AES-256-CBC tls-version-min 1.2 tls-cipher TLS-DHE-RSA-WITH-AES-256-GCM-SHA384:TLS-DHE-RSA-WITH-AES-256-CBC-SHA256:TLS-DHE-RSA-WITH-AES-128-GCM-SHA256:TLS-DHE-RSA-WITH-AES-128-CBC-SHA256 auth SHA512 auth-nocache # Other Configuration keepalive 20 60 explicit-exit-notify 1 persist-key persist-tun comp-lzo yes daemon user nobody group nobody # OpenVPN Log log-append /var/log/openvpn.log verb 3
Speichere und schließe.
Starte nun den OpenVPN-Dienst und überprüfe seinen Status.
service openvpn start service openvpn status
Du wirst sehen, dass der OpenVPN-Dienst unter der PID „14490“ läuft.
Überprüfe den OpenVPN-Port mit dem Befehl sockstat (siehe unten).
sockstat -l4
Du erhältst dann das folgende Ergebnis.
Der OpenVPN-Dienst läuft auf dem Standard-UDP-Port „1194“.
Schritt 5 – Einrichten der pf Firewall
In diesem Schritt richten wir die pf-Firewall für den VPN-Server ein. Wir erstellen eine nat-Regel für die OpenVPN-Schnittstelle „tun0“ und erlauben, dass alle Verbindungen an die externe Netzwerkschnittstelle „vtnet0“ umgeleitet werden.
Bevor du fortfährst, stelle sicher, dass die pf Firewall auf dem System konfiguriert ist. Du kannst auch den folgenden Link verwenden, um sie zu konfigurieren.
So richtest du die pf Firewall unter FreeBSD 12.0 ein
Gehe nun in das Verzeichnis „/usr/local/etc“ und bearbeite die pf-Konfigurationsdatei „pf.conf“ mit dem Editor vim.
cd /usr/local/etc/ vim pf.conf
Lege die OpenVPN-Schnittstelle und die lokale IP-Adresse fest.
# vpn interface vpn_if="tun0" vpn_net = "10.5.5.0/24"
Setze alle fragmentierten Pakete auf der externen Schnittstelle neu zusammen, bevor du sie filterst.
# reassemble all fragmented packets before filtering them scrub in on $ext_if all fragment reassemble
Aktiviere den nat von der OpenVPN-IP-Adresse zum externen Interface.
# route traffic from VPN interface out to the internet nat on ! $vpn_if from $vpn_net to any -> $ext_ip
Leite nun alle Verbindungen an das UDP-Protokoll auf dem OpenVPN-Port ‚1194‘ weiter und leite alle Verbindungen an die OpenVPN-Schnittstelle ‚tun0‘ weiter.
# Allow Connection to VPN Server pass in on $ext_if proto udp from any to ($ext_if) port 1194 keep state
# Pass all connection on the VPN Interface
pass in on $vpn_if from any to any
Speichere und schließe.
Überprüfe nun die Konfiguration der Pf-Firewall und stelle sicher, dass kein Fehler vorliegt.
service pf check service pf reload
Damit ist die Konfiguration der Pf-Firewall abgeschlossen.
Du kannst die Pf-Firewall-Regeln mit dem folgenden Befehl überprüfen.
pfctl -sr pfctl -sn
Das Ergebnis wird dir wie unten dargestellt angezeigt.
Schritt 6 – Einrichten und Aktivieren der Portweiterleitung
In diesem Schritt werden wir die Portweiterleitung auf dem FreeBSD-System aktivieren.
Bearbeite die Datei „/etc/sysctl.conf“ mit dem Editor vim.
vim /etc/sysctl.conf
Füge die folgende Konfiguration ein.
net.inet.ip.forwarding=1 net.inet6.ip6.forwarding=1
Speichere und schließe sie.
Überprüfe die sysctl-Konfigurationsdatei mit dem folgenden Befehl.
sysctl -f /etc/sysctl.conf
Als Nächstes aktivierst du das FreeBSD-System als Gateway, indem du die Konfiguration mit dem folgenden Befehl in die Datei „/etc/rc.conf“ einfügst.
sysrc gateway_enable="YES"
Starte dann den Server neu.
reboot
Jetzt ist die Portweiterleitung auf dem FreeBSD-System aktiviert.
Schritt 7 – Client einrichten
In diesem Schritt erstellen wir eine neue Konfiguration ‚.ovpn‘ für den Client.
Gehe in das Verzeichnis „/usr/local/etc/openvpn/client“ und erstelle eine neue Konfiguration „client01.ovpn“.
cd /usr/local/etc/openvpn/client/ vim client01.ovpn
Ändere die IP-Adresse der Gegenstelle und andere Details mit deinen eigenen und füge sie ein.
client dev tun proto udp remote xxx.xxx.xxx.xxx 1194 ca ca.crt cert client01.crt key client01.key cipher AES-256-CBC auth SHA512 auth-nocache tls-version-min 1.2 tls-cipher TLS-DHE-RSA-WITH-AES-256-GCM-SHA384:TLS-DHE-RSA-WITH-AES-256-CBC-SHA256:TLS-DHE-RSA-WITH-AES-128-GCM-SHA256:TLS-DHE-RSA-WITH-AES-128-CBC-SHA256 resolv-retry infinite compress lzo nobind persist-key persist-tun mute-replay-warnings verb 3
Speichere und schließe.
Lade nun alle Zertifikate, Schlüssel und die Konfiguration aus dem Verzeichnis „/usr/local/etc/openvpn/client“ auf deinen lokalen Computer herunter.
Schritt 8 – Testen
In diesem Schritt stellen wir mit der Konfiguration „client01.ovpn“ vom lokalen Computer aus eine Verbindung zum VPN-Server her.
Nachdem du die Zertifikate und die Konfiguration heruntergeladen hast, gehst du in das Download-Verzeichnis und stellst mit dem folgenden Befehl eine Verbindung zum openvpn-Server her.
openvpn --config client01.ovpn
Sobald die Verbindung hergestellt ist, öffne einen neuen Terminal-Tab und prüfe die Schnittstelle „tun0“.
ifconfig tun0
Du erhältst dann die interne IP-Adresse des OpenVPN-Servers.
Als Nächstes testen wir, ob wir den OpenVPN-Server mit seiner internen IP-Adresse anpingen können.
ping -c3 10.5.5.1
Du wirst eine ICMP-Antwort vom Server erhalten.
Danach überprüfst du die Internetverbindung mit dem unten stehenden curl-Befehl.
curl ipinfo.io
Jetzt wird dir die externe IP-Adresse des Servers angezeigt.
Damit ist die Installation und Konfiguration des OpenVPN-Servers unter FreeBSD 12.0 erfolgreich abgeschlossen.