So installierst du OpenConnect VPN Server unter Ubuntu 22.04
OpenConnect VPN alias ocserv ist eine kostenlose Open-Source-VPN-Lösung mit Leistung und Funktionen auf Unternehmensniveau. Sie basiert auf dem Cisco AnyConnect VPN-Protokoll, das in der Unternehmenswelt weit verbreitet ist. In dieser Anleitung lernst du, wie du den OpenConnect VPN-Server auf einem Ubuntu 22.04-Rechner installierst. Außerdem lernst du, wie du dich mit einem OpenConnect Client mit dem Server verbinden kannst.
Voraussetzungen
- Ein Server, auf dem Ubuntu 22.04 läuft.
- Ein Nicht-Root-Benutzer mit sudo-Rechten.
- Ein vollständig qualifizierter Domainname (FQDN) wie
vpn.example.com
. - Stelle sicher, dass alles auf dem neuesten Stand ist.
$ sudo apt update $ sudo apt upgrade
- Einige wenige Pakete, die dein System benötigt.
$ sudo apt install wget curl nano software-properties-common dirmngr apt-transport-https gnupg2 ca-certificates lsb-release ubuntu-keyring unzip -y
Einige dieser Pakete sind vielleicht schon auf deinem System installiert.
Schritt 1 – Firewall konfigurieren
Der erste Schritt besteht darin, die Firewall zu konfigurieren. Ubuntu wird standardmäßig mit ufw (Uncomplicated Firewall) ausgeliefert.
Überprüfe, ob die Firewall läuft.
$ sudo ufw status
Du solltest die folgende Ausgabe erhalten.
Status: inactive
Erlaube den SSH-Port, damit die Firewall die aktuelle Verbindung nicht unterbricht, wenn du sie aktivierst.
$ sudo ufw allow OpenSSH
Lasse auch HTTP- und HTTPS-Ports zu.
$ sudo ufw allow http $ sudo ufw allow https
Aktiviere die Firewall
$ sudo ufw enable Command may disrupt existing ssh connections. Proceed with operation (y|n)? y Firewall is active and enabled on system startup
Überprüfe den Status der Firewall erneut.
$ sudo ufw status
Du solltest eine ähnliche Ausgabe sehen.
Status: active To Action From -- ------ ---- OpenSSH ALLOW Anywhere 80/tcp ALLOW Anywhere 443 ALLOW Anywhere OpenSSH (v6) ALLOW Anywhere (v6) 80/tcp (v6) ALLOW Anywhere (v6) 443 (v6) ALLOW Anywhere (v6)
Schritt 2 – Git installieren
Schritt 3 – OpenConnect installieren
Ubuntu 22.04 wird mit einer älteren Version (1.1.3) von OpenConnect ausgeliefert. Wenn du damit zufrieden bist, kannst du es mit dem folgenden Befehl installieren.
$ sudo apt install ocserv
Für diesen Lehrgang werden wir jedoch die neueste Version (1.1.6) von OpenConnect installieren. Dazu müssen wir es aus dem Quellcode bauen.
Installiere die Abhängigkeiten, die für die Erstellung des Quellcodes erforderlich sind.
$ sudo apt install -y libgnutls28-dev libev-dev libpam0g-dev liblz4-dev libseccomp-dev \ libreadline-dev libnl-route-3-dev libkrb5-dev libradcli-dev \ libcurl4-gnutls-dev libcjose-dev libjansson-dev libprotobuf-c-dev \ libtalloc-dev libhttp-parser-dev protobuf-c-compiler gperf \ nuttcp lcov libuid-wrapper libpam-wrapper libnss-wrapper \ libsocket-wrapper gss-ntlmssp haproxy iputils-ping freeradius \ gawk gnutls-bin iproute2 yajl-tools tcpdump autoconf automake
Klone das ocserv Git-Repository.
$ git clone https://gitlab.com/openconnect/ocserv.git
Wechsle in das geklonte Verzeichnis.
$ cd ocserv
Erstelle die Konfigurationsskripte.
$ autoreconf -fvi
Kompiliere den Quellcode. Ignoriere alle veralteten Warnungen.
$ ./configure && make
Installiere ocserv.
$ sudo make install
Die Dateien werden in den Verzeichnissen /usr/local/bin
und /usr/local/sbin
installiert. Kopiere die systemd-Dienstdatei.
$ sudo cp doc/systemd/standalone/ocserv.service /etc/systemd/system/ocserv.service
Öffne die Servicedatei zum Bearbeiten.
$ sudo nano /etc/systemd/system/ocserv.service
Ändere den Pfad zur ocserv-Binärdatei in der folgenden Zeile
$ ExecStart=/usr/sbin/ocserv --foreground --pid-file /run/ocserv.pid --config /etc/ocserv/ocserv.conf
in die folgende.
$ ExecStart=/usr/local/sbin/ocserv --foreground --pid-file /run/ocserv.pid --config /etc/ocserv/ocserv.conf
Speichere die Datei, indem du Strg + X drückst und Y eingibst, wenn du dazu aufgefordert wirst.
Starte den Systemdaemon neu.
$ sudo systemctl daemon-reload
Schritt 4 – SSL-Zertifikate generieren
Wir müssen Certbot installieren, um das SSL-Zertifikat zu erzeugen. Du kannst Certbot entweder über das Ubuntu-Repository installieren oder die neueste Version mit dem Snapd-Tool herunterladen. Wir werden die Snapd-Version verwenden.
Bei Ubuntu 22.04 ist Snapd standardmäßig installiert. Führe die folgenden Befehle aus, um sicherzustellen, dass deine Version von Snapd auf dem neuesten Stand ist.
$ sudo snap install core && sudo snap refresh core
Installiere Certbot.
$ sudo snap install --classic certbot
Verwende den folgenden Befehl, um sicherzustellen, dass der Certbot-Befehl ausgeführt werden kann, indem du einen symbolischen Link zum Verzeichnis /usr/bin
erstellst.
$ sudo ln -s /snap/bin/certbot /usr/bin/certbot
Es gibt zwei Möglichkeiten, um ein SSL-Zertifikat zu erstellen. Wenn du keinen Webserver auf deinem System laufen hast, kannst du das Zertifikat mit der Standalone-Methode erstellen. Führe den folgenden Befehl aus, um das Zertifikat mit dem Standalone-Plugin für Certbot zu erstellen.
$ sudo certbot certonly --standalone --agree-tos --no-eff-email --staple-ocsp --preferred-challenges http -m name@example.com -d vpn.example.com
Mit dem obigen Befehl wird ein Zertifikat in das Verzeichnis /etc/letsencrypt/live/vpn.example.com
auf deinem Server heruntergeladen.
Wenn auf deinem System ein Server läuft, kannst du als Nächstes entweder das Webroot-Plugin oder die Nginx- oder Apache-Plugins verwenden, wenn du sie einsetzt. Für Nginx- oder Apache-Server kannst du einfach den folgenden Befehl ausführen.
$ sudo certbot certonly --nginx --agree-tos --no-eff-email --staple-ocsp --preferred-challenges http -m name@example.com -d vpn.example.com
oder
$ sudo certbot certonly --apache --agree-tos --no-eff-email --staple-ocsp --preferred-challenges http -m name@example.com -d vpn.example.com
Wenn du einen anderen Server hast, müssen wir das webroot-Plugin verwenden. Erstelle dazu das Webroot-Verzeichnis.
$ sudo mkdir -p /var/www/ocserv
Lege den Server als Eigentümer des Web-Root-Verzeichnisses fest. In unserem Fall verwenden wir www-data
als Serverbenutzer.
$ sudo chown www-data:www-data /var/www/ocserv -R
Als Nächstes konfigurierst du deinen Server so, dass er die Domain vpn.example.com
im Verzeichnis /var/www/ocserv
bereitstellt. Starte den Server neu. Erstelle als Nächstes das Zertifikat mit dem folgenden Befehl.
$ sudo certbot certonly --webroot --agree-tos --no-eff-email --staple-ocsp --preferred-challenges http -m name@example.com -d vpn.example.com
Überprüfe den Certbot renewal scheduler service.
$ sudo systemctl list-timers
Dort findest du snap.certbot.renew.service
als einen der Dienste, die für die Ausführung vorgesehen sind.
NEXT LEFT LAST PASSED UNIT ACTIVATES Wed 2023-04-19 10:31:47 UTC 2h 55min left Wed 2023-04-19 03:31:58 UTC 4h 3min ago ua-timer.timer ua-timer.service Wed 2023-04-19 12:02:42 UTC 4h 26min left Wed 2023-04-19 03:19:20 UTC 4h 16min ago motd-news.timer motd-news.service Wed 2023-04-19 18:19:56 UTC 10h left Wed 2023-04-19 07:19:52 UTC 16min ago apt-daily.timer apt-daily.service Wed 2023-04-19 22:51:00 UTC 15h left n/a n/a snap.certbot.renew.timer snap.certbot.renew.service
Führe einen Probelauf des Prozesses durch, um zu prüfen, ob die SSL-Erneuerung einwandfrei funktioniert.
$ sudo certbot renew --dry-run
Wenn du keine Fehler siehst, bist du bereit. Dein Zertifikat wird automatisch erneuert.
Schritt 5 – OpenConnect konfigurieren
Wenn du ocserv mit APT installiert hast, sollte die Konfigurationsdatei bereits unter /etc/ocserv/ocserv.conf
verfügbar sein. Wenn du das Paket jedoch aus dem Quellcode erstellt hast, müssen wir die Konfigurationsdatei kopieren.
Erstelle das Verzeichnis für die Konfigurationsdatei.
$ sudo mkdir /etc/ocserv
Kopiere die Konfigurationsdatei.
$ sudo cp /home/username/ocserv/doc/sample.config /etc/ocserv/ocserv.conf
Öffne die Datei zum Bearbeiten.
$ sudo nano /etc/ocserv/ocserv.conf
Ändere den Wert des Parameters auth
wie folgt. Dies ermöglicht es den Benutzern, separate VPN-Konten zu verwenden.
auth = "plain[passwd=/etc/ocserv/ocpasswd]"
Standardmäßig verwendet OpenConnect die Ports 443 TCP und UDP. Wir werden nur den TCP-Port für die Verbindung verwenden. Deaktiviere daher den UDP-Port, indem du ihn auskommentierst.
tcp-port = 443 #udp-port = 443
Wenn du einen Webserver hast, der auf Port 443 läuft, dann ändere den Wert des TCP-Ports, indem du den Wert änderst.
tcp-port = 8443
Als nächstes suchst du die Variablen server-crt
und server-key
und änderst ihre Werte wie folgt.
server-cert = /etc/letsencrypt/live/vpn.example.com/fullchain.pem server-key = /etc/letsencrypt/live/vpn.example.com/privkey.pem
Lege die maximal zulässige Anzahl von Clients fest. Der Standardwert ist 16. Setze den Wert auf 0 für unbegrenzt.
max-clients = 16
Lege die Anzahl der Geräte fest, die ein Nutzer gleichzeitig benutzen kann. Der Standardwert ist 2. Setze den Wert 0 für unbegrenzt.
max-same-clients = 2
In der Standardeinstellung sendet OpenConnect alle 9 Stunden (32400 Sekunden) Keepalive-Pakete. Dies ist ein zu hoher Wert. Setze ihn auf 60 Sekunden, um die Wahrscheinlichkeit eines VPN-Verbindungsabbruchs zu verringern.
keepalive = 60
Ändere den Wert von try-mtu-discovery
auf true
, um die MTU-Ermittlung zu aktivieren. Das kann die VPN-Leistung optimieren.
try-mtu-discovery = true
Konfiguriere die Zeit, die ein Client im Leerlauf bleiben darf, bevor die Verbindung getrennt wird, indem du die folgenden Variablen auskommentierst. Wenn du möchtest, dass der Client unbegrenzt verbunden bleibt, lass sie so wie sie sind.
idle-timeout=1200 mobile-idle-timeout=1800
Lege den Standard-Domänennamen für das OpenConnect VPN fest.
default-domain = vpn.example.com
Ändere die Standard-IPv4-Konfiguration, um IP-Adressenkollisionen zu vermeiden. Wir werden 10.10.10.0
als Wert verwenden.
ipv4-network = 10.10.10.0
Entferne den Kommentar in der folgenden Zeile, um alle DNS-Anfragen über das VPN zu tunneln.
tunnel-all-dns = true
Ändere den DNS-Resolver auf Google DNS. Füge auch den zweiten Eintrag hinzu.
dns = 8.8.8.8 dns = 8.8.4.4
Kommentiere alle Routenparameter aus, indem du das Rautezeichen (#) davor setzt.
#route = 10.10.10.0/255.255.255.0 #route = 192.168.0.0/255.255.0.0 #route = fef4:db8:1000:1001::/64 #route = default # Subsets of the routes above that will not be routed by # the server. #no-route = 192.168.5.0/255.255.255.0
Speichere die Datei, indem du Strg + X drückst und Y eingibst, wenn du dazu aufgefordert wirst.
Schritt 6 – OpenConnect Server starten
Starte den OpenConnect VPN Server.
$ sudo systemctl start ocserv
Überprüfe den Status des Dienstes.
$ sudo systemctl status ocserv
Du wirst eine ähnliche Ausgabe erhalten.
? ocserv.service - OpenConnect SSL VPN server Loaded: loaded (/etc/systemd/system/ocserv.service; disabled; vendor preset: enabled) Active: active (running) since Thu 2023-04-20 08:52:18 UTC; 2s ago Docs: man:ocserv(8) Main PID: 19965 (ocserv-main) Tasks: 2 (limit: 1026) Memory: 1.4M CPU: 9ms CGroup: /system.slice/ocserv.service ??19965 ocserv-main ??19966 ocserv-sm Apr 20 08:52:18 openconnect ocserv[19965]: note: skipping 'pid-file' config option Apr 20 08:52:18 openconnect ocserv[19965]: note: vhost:default: setting 'plain' as primary authentication method Apr 20 08:52:18 openconnect ocserv[19965]: error connecting to sec-mod socket '/var/run/ocserv-socket.a4413bc9': No such file or directory Apr 20 08:52:18 openconnect ocserv[19965]: note: setting 'file' as supplemental config option Apr 20 08:52:18 openconnect ocserv[19965]: listening (TCP) on 0.0.0.0:443... Apr 20 08:52:18 openconnect ocserv[19965]: listening (TCP) on [::]:443... Apr 20 08:52:18 openconnect ocserv[19966]: ocserv[19966]: sec-mod: reading supplemental config from files Apr 20 08:52:18 openconnect ocserv[19966]: sec-mod: reading supplemental config from files Apr 20 08:52:18 openconnect ocserv[19966]: ocserv[19966]: sec-mod: sec-mod initialized (socket: /var/run/ocserv-socket.a4413bc9.0) Apr 20 08:52:18 openconnect ocserv[19966]: sec-mod: sec-mod initialized (socket: /var/run/ocserv-socket.a4413bc9.0)
Wenn du die Fehlermeldung bezüglich der Verbindung zu sec-mod socket
siehst, ignoriere sie. Das ist normal. Er wird die Datei initialisieren, wenn er sie nicht findet.
Schritt 7 – VPN-Konten erstellen
Du kannst VPN-Konten mit dem Dienstprogramm ocpasswd
erstellen. Führe den folgenden Befehl aus, um ein neues VPN-Konto zu erstellen.
$ sudo ocpasswd -c /etc/ocserv/ocpasswd username Enter password: Re-enter password:
Das Passwort wird in der Datei /etc/ocserv/ocpasswd
gespeichert. Um das Passwort für username
zurückzusetzen, führe den obigen Befehl erneut aus. Führe den obigen Befehl mit einem anderen Benutzer aus, um ein weiteres Konto zu erstellen.
Schritt 8 – Aktiviere die IP-Weiterleitung
Damit der VPN-Server Pakete zwischen dem Client und dem Internet weiterleiten kann, musst du die IP-Weiterleitung aktivieren, indem du den folgenden Befehl ausführst.
$ echo "net.ipv4.ip_forward = 1" | sudo tee /etc/sysctl.d/60-custom.conf
Führe die folgenden Befehle aus, um den TCP BBR-Algorithmus zu aktivieren, der die TCP-Geschwindigkeit erhöht.
$ echo "net.core.default_qdisc=fq" | sudo tee -a /etc/sysctl.d/60-custom.conf $ echo "net.ipv4.tcp_congestion_control=bbr" | sudo tee -a /etc/sysctl.d/60-custom.conf
Mache die Änderungen mit dem folgenden Befehl dauerhaft.
$ sudo sysctl -p /etc/sysctl.d/60-custom.conf
Schritt 9 – IP Masquerading konfigurieren
Der nächste Schritt besteht darin, IP-Masquerading in der Firewall einzurichten, damit der VPN-Server als virtueller Router für die Clients arbeiten kann. Suche den Namen der Hauptnetzwerkschnittstelle des Servers.
$ ip addr
Du wirst eine ähnliche Ausgabe erhalten.
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: enp1s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq state UP group default qlen 1000 link/ether 56:00:04:67:7e:79 brd ff:ff:ff:ff:ff:ff inet 95.179.138.135/23 metric 100 brd 95.179.139.255 scope global dynamic enp1s0 valid_lft 66999sec preferred_lft 66999sec inet6 2a05:f480:1400:2381:5400:4ff:fe67:7e79/64 scope global dynamic mngtmpaddr noprefixroute valid_lft 2591657sec preferred_lft 604457sec inet6 fe80::5400:4ff:fe67:7e79/64 scope link valid_lft forever preferred_lft forever
In unserem Fall ist enp1s0
der Name der Schnittstelle. Füge den Befehl iptables in eine UFW-Konfigurationsdatei ein, indem du sie zum Bearbeiten öffnest.
$ sudo nano /etc/ufw/before.rules
Füge die folgenden Zeilen am Ende der Datei hinzu. Ersetze enp1s0
im Code durch deine Netzwerkschnittstelle.
# NAT table rules *nat :POSTROUTING ACCEPT [0:0] -A POSTROUTING -s 10.10.10.0/24 -o enp1s0 -j MASQUERADE # End each table with the 'COMMIT' line or these rules won't be processed COMMIT
Suche die folgenden Zeilen in der Datei.
# ok icmp code for FORWARD -A ufw-before-forward -p icmp --icmp-type destination-unreachable -j ACCEPT -A ufw-before-forward -p icmp --icmp-type time-exceeded -j ACCEPT -A ufw-before-forward -p icmp --icmp-type parameter-problem -j ACCEPT -A ufw-before-forward -p icmp --icmp-type echo-request -j ACCEPT
Füge die folgenden Zeilen nach ihr ein.
# allow forwarding for trusted network -A ufw-before-forward -s 10.10.10.0/24 -j ACCEPT -A ufw-before-forward -d 10.10.10.0/24 -j ACCEPT
Speichere die Datei, indem du Strg + X drückst und Y eingibst, wenn du dazu aufgefordert wirst.
Starte die Firewall neu.
$ sudo systemctl restart ufw
Du kannst die Masquerade-Regel mit dem folgenden Befehl überprüfen.
$ sudo iptables -t nat -L POSTROUTING
Du wirst die folgende Ausgabe erhalten.
Chain POSTROUTING (policy ACCEPT) target prot opt source destination MASQUERADE all -- 10.10.10.0/24 anywhere
Schritt 10 – Verbindung mit OpenConnect Client
Wir werden den OpenConnect Client auf einem Ubuntu 22.04 Rechner installieren. Führe den folgenden Befehl aus, um den Client zu installieren.
$ sudo apt install openconnect
Als Nächstes verbindest du dich mit folgendem Befehl mit dem VPN-Server. Das -b
Flag sorgt dafür, dass der Client im Hintergrund läuft, sobald die Verbindung hergestellt ist.
$ sudo openconnect -b vpn.example.com:443
Du wirst aufgefordert, den VPN-Benutzernamen und das Passwort einzugeben. Gib die in Schritt 7 erstellten Anmeldedaten ein.
POST https://vpn.example.com/ Connected to 95.179.138.135:443 SSL negotiation with vpn.example.com Connected to HTTPS on vpn.example.com with ciphersuite (TLS1.3)-(ECDHE-SECP256R1)-(ECDSA-SECP256R1-SHA256)-(AES-256-GCM) XML POST enabled Please enter your username. Username:navjot POST https://vpn.example.com/auth Please enter your password. Password: POST https://vpn.example.com/auth
Bei einer erfolgreichen Verbindung siehst du die folgende Ausgabe. DTLS ist deaktiviert, weil wir das UDP deaktiviert haben.
Got CONNECT response: HTTP/1.1 200 CONNECTED CSTP connected. DPD 90, Keepalive 60 No DTLS address Set up UDP failed; using SSL instead Configured as 192.168.1.13, with SSL connected and DTLS disabled Continuing in background; pid 1650
Führe den folgenden Befehl aus, um die Verbindung zu beenden.
$ sudo pkill openconnect
Lass uns einige systemd-Skripte für OpenConnect erstellen. Das erste Skript soll dafür sorgen, dass sich der Client beim Systemstart automatisch verbindet.
Erstelle und öffne die Servicedatei zum Bearbeiten.
$ sudo nano /etc/systemd/system/openconnect.service
Füge den folgenden Code in die Datei ein.
[Unit] Description=OpenConnect VPN Client After=network-online.target systemd-resolved.service Wants=network-online.target [Service] Type=simple ExecStart=/bin/bash -c '/bin/echo -n password | /usr/sbin/openconnect vpn.example.com -u username --passwd-on-stdin' KillSignal=SIGINT Restart=always RestartSec=2 [Install] WantedBy=multi-user.target
Speichere die Datei, indem du Strg + X drückst und Y eingibst, wenn du dazu aufgefordert wirst.
Aktiviere den Dienst.
$ sudo systemctl enable openconnect.service
Starte den Dienst.
$ sudo systemctl start openconnect.service
Um deine VPN-Verbindung automatisch neu zu starten, wenn dein PC aus dem Ruhezustand wieder hochfährt, musst du ein weiteres systemd-Skript erstellen.
Erstelle und öffne das Neustart-Skript zur Bearbeitung.
$ sudo nano /etc/systemd/system/openconnect-restart.service
Füge den folgenden Code in das Skript ein.
[Unit] Description=Restart OpenConnect client when resuming from suspend After=suspend.target [Service] Type=simple ExecStart=/bin/systemctl --no-block restart openconnect.service [Install] WantedBy=suspend.target
Speichere die Datei, indem du Strg + X drückst und Y eingibst, wenn du dazu aufgefordert wirst.
Aktiviere den Dienst.
$ sudo systemctl enable openconnect-restart.service
Wir können auch einen Dienst erstellen, der die VPN-Verbindung automatisch neu startet, wenn sie abbricht. Erstelle und öffne den VPN-Prüfdienst zur Bearbeitung.
$ sudo nano /etc/systemd/system/openconnect-check.service
Füge den folgenden Code in den Dienst ein.
[Unit] Description=OpenConnect VPN Connectivity Checker After=openconnect.service [Service] Type=simple ExecStart=/bin/bash -c 'for ((; ; )) do (ping -c9 10.10.10.1 || systemctl restart openconnect) done' [Install] WantedBy=multi-user.target
Speichere die Datei, indem du Strg + X drückst und Y eingibst, wenn du dazu aufgefordert wirst.
Aktiviere und starte den Dienst.
$ sudo systemctl enable enable openconnect-check.service --now
Dadurch wird der Ping-Befehl ständig ausgeführt, um die VPN-Verbindung zu überprüfen. Wenn sie abbricht, wird OpenConnect automatisch neu gestartet.
Du kannst die OpenConnect GUI Clients herunterladen, wenn du willst. Sie wurden jedoch schon seit einiger Zeit nicht mehr aktualisiert. Wenn du einen aktualisierten GUI-Client möchtest, kannst du das OpenConnect GUI GitLab Repository besuchen und ihn selbst kompilieren.
Fazit
Damit ist unsere Anleitung zur Installation eines OpenConnect VPN-Servers auf einem Ubuntu 22.04 Server und zur Verwendung des Kommandozeilen-Clients für die Verbindung mit dem Server abgeschlossen. Wenn du Fragen hast, schreibe sie unten in die Kommentare.