WireGuard VPN auf Ubuntu 22.04 installieren
Wireguard ist eine Open-Source-Implementierung eines plattformübergreifenden virtuellen privaten Netzwerks (VPN), das modernste Kryptografie verwendet. Sie unterstützt IPv4- und IPv6-Verbindungen. Es ist schneller, einfacher und funktionaler als IPSec- und OpenVPN-Protokolle. Es ist als Allzweck-VPN für eingebettete Schnittstellen und Supercomputer konzipiert und läuft auf Linux, Windows, macOS, iOS, Android und verschiedenen anderen Plattformen.
Die Verschlüsselung von Wireguard funktioniert mit privaten und öffentlichen Schlüsseln, mit denen Peers einen verschlüsselten Tunnel zwischen sich aufbauen.
In dieser Anleitung erfährst du, wie du Wireguard VPN auf einem Ubuntu 22.04 Server installierst und dich mit einem Ubuntu Client mit ihm verbindest.
Voraussetzungen
- Ein Server mit Ubuntu 22.04 unterstützt sowohl IPv4- als auch IPv6-Verbindungen.
- Ein Client mit Ubuntu 22.04, der sich mit dem Wireguard-Server verbinden kann. Für unser Tutorial verwenden wir unseren lokalen Rechner als Client, du kannst aber auch einen Remote-Server dafür verwenden.
- Ein Nicht-Root-Benutzer mit sudo-Rechten.
- Die Unkomplizierte Firewall (UFW) ist aktiviert und läuft.
- Alles ist auf dem neuesten Stand.
$ sudo apt update && sudo apt upgrade
Schritt 1 – Wireguard installieren und ein Schlüsselpaar generieren
Ubuntu 22.04 wird mit der neuesten Version von Wireguard ausgeliefert. Installiere Wireguard.
$ sudo apt install wireguard
Als Nächstes musst du ein privates und öffentliches Schlüsselpaar für den Server erstellen. Erstelle einen privaten Schlüssel für den Server mit dem Befehl wg genkey
.
$ wg genkey | sudo tee /etc/wireguard/private.key
Ändere die Berechtigungen, um den privaten Schlüssel zu schützen. Der Befehl chmod go=
blockiert den Zugriff anderer Benutzer und Gruppen auf die Datei. Du erhältst den verschlüsselten Schlüssel auf deinem Terminal. Notiere dir den Schlüssel, denn er wird später benötigt.
$ sudo chmod go= /etc/wireguard/private.key
Als Nächstes generierst du den öffentlichen Schlüssel, der vom privaten Schlüssel abgeleitet ist. Verwende die wg pubkey
, um den öffentlichen Schlüssel zu erzeugen. Der folgende Befehl besteht aus drei Teilen, wobei der erste Teil den privaten Schlüssel ausgibt, der vom Befehl wg pubkey
verwendet wird, um den öffentlichen Schlüssel zu erzeugen, der dann in der entsprechenden Datei gespeichert wird.
$ sudo cat /etc/wireguard/private.key | wg pubkey | sudo tee /etc/wireguard/public.key
Du erhältst den öffentlichen Schlüssel wieder auf dem Terminal. Notiere ihn dir.
Schritt 2 – Auswahl der IPv4- und IPv6-Adressen
Wir müssen private IPv4- und IPv6-Adressen festlegen, die du mit deinem Wireguard-Server und den Gegenstellen verwenden willst.
Auswählen eines IPv4-Bereichs
Um Wireguard mit IPv4-Peers zu nutzen, braucht der Server einen Bereich privater IPv4-Adressen für seine Tunnelschnittstelle. Du kannst einen beliebigen Bereich von IP-Adressen aus den folgenden reservierten Adressblöcken wählen:
10.0.0.0
bis10.255.255.255
(10/8 Präfix)172.16.0.0
bis172.31.255.255
(172.16/12 Präfix)192.168.0.0
bis192.168.255.255
(192.168/16 Präfix)
Für unseren Lehrgang verwenden wir 10.8.0.0/24 als IP-Adressblock aus dem ersten Bereich der reservierten IPs. Dieser Bereich lässt bis zu 255 Peer-Verbindungen zu. Du kannst auch den privaten IP-Bereich verwenden, der von deinem Hosting-Unternehmen bereitgestellt wird.
Auswählen eines IPv6-Bereichs
Nach dem RFC-Algorithmus ist der empfohlene Weg, um ein eindeutiges IPv6-Präfix zu erhalten, die Kombination der Tageszeit mit einem eindeutigen Wert wie der Rechner-ID. Diese Werte werden dann gehasht und gekürzt, um als eindeutige Adresse innerhalb des reservierten privaten fd00::/8
Blocks von IPs verwendet zu werden.
Der erste Schritt ist die Erfassung eines 64-Bit-Zeitstempels mit dem Dienstprogramm date
.
$ date +%s%N
Es erzeugt eine Ausgabe ähnlich der folgenden, die die Anzahl der seit der Unix-Epoche (00:00 UTC 1. Januar 1970) verstrichenen Sekunden angibt.
1659342559092041940
Notiere den Wert für die spätere Verwendung. Als Nächstes kopierst du den Wert machine-id
deines Servers. Dieser Wert ist für jedes System einzigartig.
$ cat /var/lib/dbus/machine-id
Du wirst eine ähnliche Ausgabe erhalten.
d97e195db6584d63aeedfdc35dc83c7f
Als Nächstes kombinierst du den Zeitstempel mit machine-id
und verschlüsselst die Zeichenfolge mit dem SHA-1 Algorithmus.
printf <timestamp><machine-id> | sha1sum
Ersetze die Werte <timestamp>
und <machine-id>
im obigen Befehl von vorhin. Du erhältst einen anderen Hash-Wert.
$ printf 1659342559092041940d97e195db6584d63aeedfdc35dc83c7f | sha1sum d789c02d9d8faef806d40ec15b307d4d9c8ec4bc -
Führe den folgenden Befehl aus, um die Ausgabe printf
gemäß dem RFC-Algorithmus zu kürzen.
$ printf d789c02d9d8faef806d40ec15b307d4d9c8ec4bc | cut -c 31-
Du solltest die folgende Ausgabe erhalten.
4d9c8ec4bc
In der obigen Ausgabe ist die Menge der Bytes 4d 9c 8e c4 bc
. Erstelle die IPv6-Adresse, indem du die obigen 5 Bytes mit dem Präfix fd
wie folgt anfügst.
Mit den zuvor generierten Bytes und der Subnetzgröße /64
ergibt sich das folgende Präfix.
Unique Local IPv6 Address Prefix fd4d:9c8e:c4bc::/64
Um dem Server eine IP zuzuweisen, fügst du nach den letzten ::
Zeichen eine 1 hinzu. Die resultierende Adresse lautet fd4d:9c8e:c4bc::1/64
. Die Peers verwenden die IP-Adresse, indem sie eine weitere Ziffer hinzufügen, z. B. fd4d:9c8e:c4bc::2/64
.
Schritt 3 – Wireguard konfigurieren
Erstelle eine Konfigurationsdatei und öffne sie zur Bearbeitung.
$ sudo nano /etc/wireguard/wg0.conf
Füge den folgenden Code in die Datei ein. Ersetze den server_private_key
durch den in Schritt 1 erzeugten privaten Schlüssel. Du kannst den abhörenden Port nach Belieben ändern.
[Interface] PrivateKey = server_private_key Address = 10.8.0.1/24, fd4d:9c8e:c4bc::/64 ListenPort = 51820 SaveConfig = true
Speichere die Datei, indem du Strg + X drückst und Y eingibst, wenn du dazu aufgefordert wirst.
Schritt 4 – Wireguard-Netzwerk konfigurieren
Um den Datenverkehr der Gegenstelle über den Wireguard-Server zu leiten, musst du die IP-Weiterleitung konfigurieren. Öffne die Datei /etc/sysctl.conf
zum Bearbeiten.
$ sudo nano /etc/sysctl.conf
Hebe die Kommentare in den folgenden Zeilen auf, indem du das vorangestellte Rautenzeichen entfernst.
# Uncomment the next line to enable packet forwarding for IPv4 net.ipv4.ip_forward=1 # Uncomment the next line to enable packet forwarding for IPv6 # Enabling this option disables Stateless Address Autoconfiguration # based on Router Advertisements for this host net.ipv6.conf.all.forwarding=1
Speichere die Datei, indem du Strg + X drückst und Y eingibst, wenn du dazu aufgefordert wirst. Überprüfe die neuen Werte mit dem folgenden Befehl.
$ sudo sysctl -p net.ipv4.ip_forward = 1 net.ipv6.conf.all.forwarding = 1 vm.swappiness = 0
Jetzt leitet dein Wireguard-Server den gesamten eingehenden Datenverkehr vom VPN-Ethernet-Gerät an andere Geräte auf dem Server und von dort an das öffentliche Internet weiter. So kann der Server den gesamten Webverkehr von der Gegenstelle über die IP-Adresse des Servers leiten und die IP-Adresse des Clients verbergen.
Im nächsten Schritt musst du Firewall-Regeln konfigurieren, damit die Weiterleitung richtig funktioniert.
Schritt 5 – Konfiguriere die Firewall des Wireguard Servers
Um den VPN-Verkehr durch die Firewall des Servers zu leiten, musst du die Masquerading-Funktion aktivieren, die eine dynamische Netzwerkadressübersetzung (NAT) für die Weiterleitung der Client-Verbindungen bereitstellt.
Suche die öffentliche Netzwerkschnittstelle deines Wireguard-Servers.
$ ip route list default default via 209.23.8.1 dev eth0 proto static
Nach dem obigen Befehl ist eth0
die öffentliche Schnittstelle.
Öffne die Wireguard-Konfigurationsdatei, um die Firewall-Regeln zu deinem Wireguard-Server hinzuzufügen.
$ sudo nano /etc/wireguard/wg0.conf
Füge die folgenden Zeilen am Ende der Datei nach der Zeile SaveConfig = true
ein.
. . . PostUp = ufw route allow in on wg0 out on eth0 PostUp = iptables -t nat -I POSTROUTING -o eth0 -j MASQUERADE PostUp = ip6tables -t nat -I POSTROUTING -o eth0 -j MASQUERADE PreDown = ufw route delete allow in on wg0 out on eth0 PreDown = iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE PreDown = ip6tables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
Speichere die Datei, indem du Strg + X drückst und Y eingibst, wenn du dazu aufgefordert wirst.
Die Zeilen PostUp
werden ausgeführt, wenn der Wireguard-Server den VPN-Tunnel startet. Die erste Regel erlaubt die Weiterleitung von IPv4- und IPv6-Datenverkehr. Die zweite und dritte Regel konfiguriert das Masquerading für IPv4- und IPv6-Datenverkehr. Die Zeilen PreDown
werden ausgeführt, wenn der Wireguard-Server den VPN-Tunnel beendet.
Der letzte Schritt bei der Konfiguration der Firewall besteht darin, den Verkehr zum und vom Wireguard UDP-Port zuzulassen. Verwende die Uncomplicated Firewall (UFW), um den Wireguard-Port zu öffnen.
Überprüfe den Status der Firewall.
$ sudo ufw status
Du solltest etwas wie das Folgende sehen.
Status: active To Action From -- ------ ---- OpenSSH ALLOW Anywhere OpenSSH (v6) ALLOW Anywhere (v6)
Öffne den in Schritt 1 konfigurierten Port 51820. Wenn du einen anderen Port für Wireguard verwendest, öffne diesen Port.
$ sudo ufw allow 51820/udp
Deaktiviere die UFW-Firewall und aktiviere sie wieder, um die Änderungen aus allen in diesem Schritt geänderten Dateien zu laden.
$ sudo ufw disable $ sudo ufw enable
Überprüfe den Status erneut, um ihn zu bestätigen.
Status: active To Action From -- ------ ---- OpenSSH ALLOW Anywhere 51820/udp ALLOW Anywhere OpenSSH (v6) ALLOW Anywhere (v6) 51820/udp (v6) ALLOW Anywhere (v6)
Dein Wireguard-Server ist so konfiguriert, dass er den VPN-Verkehr abwickelt, einschließlich Weiterleitung und Masquerading für Peers.
Schritt 6 – Starten des WireGuard-Servers
Wireguard kann mit dem Skript wg-quick
so konfiguriert werden, dass es als Dienst läuft. Aktiviere den Wireguard-Dienst.
$ sudo systemctl enable wg-quick@wg0.service
Der Teil wg0
des Dienstnamens entspricht der Datei /etc/wireguard/wg0.conf
. Das bedeutet, dass du so viele VPN-Tunnel erstellen kannst, wie du willst, indem du eine andere Konfigurationsdatei und einen anderen Dienst verwendest.
Starte den Wireguard-Dienst.
$ sudo systemctl start wg-quick@wg0.service
Überprüfe den Status des Dienstes.
$ sudo systemctl status wg-quick@wg0.service
Du wirst eine ähnliche Ausgabe erhalten.
? wg-quick@wg0.service - WireGuard via wg-quick(8) for wg0 Loaded: loaded (/lib/systemd/system/wg-quick@.service; enabled; vendor preset: enabled) Active: active (exited) since Mon 2022-08-01 11:35:59 UTC; 6s ago Docs: man:wg-quick(8) man:wg(8) https://www.wireguard.com/ https://www.wireguard.com/quickstart/ https://git.zx2c4.com/wireguard-tools/about/src/man/wg-quick.8 https://git.zx2c4.com/wireguard-tools/about/src/man/wg.8 Process: 3935 ExecStart=/usr/bin/wg-quick up wg0 (code=exited, status=0/SUCCESS) Main PID: 3935 (code=exited, status=0/SUCCESS) CPU: 216ms Aug 01 11:35:58 wireguard wg-quick[3935]: [#] wg setconf wg0 /dev/fd/63 Aug 01 11:35:58 wireguard wg-quick[3935]: [#] ip -4 address add 10.8.0.1/24 dev wg0 Aug 01 11:35:58 wireguard wg-quick[3935]: [#] ip -6 address add fd4d:9c8e:c4bc::/64 dev wg0 Aug 01 11:35:59 wireguard wg-quick[3935]: [#] ip link set mtu 1420 up dev wg0 Aug 01 11:35:59 wireguard wg-quick[3935]: [#] ufw route allow in on wg0 out on eth0 Aug 01 11:35:59 wireguard wg-quick[3978]: Rule added Aug 01 11:35:59 wireguard wg-quick[3978]: Rule added (v6) Aug 01 11:35:59 wireguard wg-quick[3935]: [#] iptables -t nat -I POSTROUTING -o eth0 -j MASQUERADE Aug 01 11:35:59 wireguard wg-quick[3935]: [#] ip6tables -t nat -I POSTROUTING -o eth0 -j MASQUERADE Aug 01 11:35:59 wireguard systemd[1]: Finished WireGuard via wg-quick(8) for wg0.
Schritt 7 – Installieren und Konfigurieren eines Wireguard-Peers
Installiere den Wireguard-Client auf der Ubuntu 22.04 basierten Gegenstelle.
$ sudo apt update $ sudo apt install wireguard
Wenn du die Installation auf einem lokalen Ubuntu-Desktop durchführst, ist Wireguard wahrscheinlich bereits vorinstalliert.
Erstelle das Schlüsselpaar des Wireguard-Peers
Erstelle auf dem Peer ein Schlüsselpaar auf die gleiche Weise wie in Schritt 1. Erteile auch dem privaten Schlüssel Berechtigungen.
$ wg genkey | sudo tee /etc/wireguard/private.key $ sudo chmod go= /etc/wireguard/private.key
Erstelle den öffentlichen Schlüssel.
$ sudo cat /etc/wireguard/private.key | wg pubkey | sudo tee /etc/wireguard/public.key
Erstelle die Peer-Konfigurationsdatei
Um die Peer-Konfigurationsdatei zu erstellen, benötigst du folgende Dinge:
- Den
base64
verschlüsselten privaten Schlüssel, der auf dem Peer erzeugt wurde. - Die IPv4- und IPv6-Adressbereiche, die auf dem Wireguard-Server definiert sind.
- Den
base64
verschlüsselten öffentlichen Schlüssel des Wireguard-Servers. - Die öffentliche IP-Adresse und Portnummer des Wireguard-Servers. Wenn dein Server und der Client eine IPv6-Verbindung haben, musst du die IPv6-Adresse verwenden.
Erstelle und öffne die Peer-Konfigurationsdatei zur Bearbeitung.
$ sudo nano /etc/wireguard/wg0.conf
Füge den folgenden Code in die Datei ein.
[Interface] PrivateKey = peer_private_key Address = 10.8.0.2/24 Address = fd4d:9c8e:c4bc::2/64 [Peer] PublicKey = JySX9hMJFyAqZA+mNvJsArKW7yY8I7ROsQKTZZR/RH8= AllowedIPs = 10.8.0.0/24, fd4d:9c8e:c4bc::/64 Endpoint = 209.23.10.202:51820 PersistentKeepalive = 15
Speichere die Datei, indem du Strg + X drückst und Y eingibst, wenn du dazu aufgefordert wirst.
Der erste Schlüssel ist der auf dem Peer generierte private Schlüssel. In der ersten Adresszeile wird eine IPv4-Adresse aus dem zuvor gewählten Subnetz verwendet. In der zweiten Adresszeile wird eine IPv6-Adresse aus dem zuvor gewählten Subnetz verwendet.
Der zweite Schlüssel ist der öffentliche Schlüssel, der auf dem Server erzeugt wurde. Die AllowedIPs
verwendet die zuvor gewählten IPv4- und IPv6-Bereiche, die die Gegenstelle anweisen, nur dann Datenverkehr über das VPN zu senden, wenn das Zielsystem eine IP-Adresse in einem der Bereiche hat. Du kannst die IPv6-Adressen weglassen, wenn du nur die IPv4-Verbindung nutzt.
Den Peer so konfigurieren, dass er den gesamten Verkehr über den Tunnel leitet
Finde die IP-Adresse, die das System als Standardgateway verwendet. Führe den folgenden ip route
Befehl aus.
$ ip route list table main default
Du wirst eine ähnliche Ausgabe erhalten.
default via 69.28.84.1 dev eth0 proto static
Notiere die IP-Adresse des Gateways und den Gerätenamen. Finde die öffentliche IP-Adresse der Gegenstelle.
$ ip -brief address show eth0
Du erhältst eine ähnliche Ausgabe.
eth0 UP 69.28.84.160/23 2607:f170:14:13::910/64 fe80::200:45ff:fe1c:54a0/64
Öffne die Konfigurationsdatei des Peers zum Bearbeiten.
$ sudo nano /etc/wireguard/wg0.conf
Füge die folgenden Zeilen vor dem Abschnitt [Peer]
ein.
PostUp = ip rule add table 200 from 69.28.84.160 PostUp = ip route add table 200 default via 69.28.84.1 PreDown = ip rule delete table 200 from 69.28.84.160 PreDown = ip route delete table 200 default via 69.28.84.1 [Peer] . . .
Speichere die Datei, indem du Strg + X drückst und Y eingibst, wenn du dazu aufgefordert wirst.
Der Befehl PostUp
erstellt eine Regel, um nach Routing-Einträgen in Tabelle 200 zu suchen, wenn die IP mit der öffentlichen IP des Systems übereinstimmt. Der Befehl PreDown
stellt sicher, dass der von Tabelle 200 verarbeitete Verkehr das Gateway 203.0.113.1
für das Routing verwendet und nicht die Wireguard-Schnittstelle.
Konfiguriere die DNS-Resolver des Peers
Führe den folgenden Befehl auf dem Server aus und ersetze eth0
durch den Gerätenamen deines Ethernets, falls dieser anders lautet.
$ resolvectl dns eth0
Du wirst eine ähnliche Ausgabe erhalten.
Link 2 (eth0): 209.208.127.65 209.208.25.18 2001:4860:4860::8888 2001:4860:4860::8844
Öffne die Konfigurationsdatei des Peers.
$ sudo nano /etc/wireguard/wg0.conf
Füge den folgenden Code vor der Zeile [Peer]
ein.
DNS = 209.208.127.65 2001:4860:4860::8888 [Peer] . . .
Speichere die Datei, indem du Strg + X drückst und Y eingibst, wenn du dazu aufgefordert wirst.
Schritt 8 – Hinzufügen des öffentlichen Schlüssels des Peers zum Wireguard-Server
Überprüfe den öffentlichen Schlüssel der Wireguard-Gegenstelle.
$ sudo cat /etc/wireguard/public.key PeURxj4Q75RaVhBKkRTpNsBPiPSGb5oQijgJsTa29hg=
Führe den folgenden Befehl auf deinem Wireguard-Server aus.
$ sudo wg set wg0 peer PeURxj4Q75RaVhBKkRTpNsBPiPSGb5oQijgJsTa29hg= allowed-ips 10.8.0.2,fd24:609a:6c18::2
Um die allowed-ips
für einen bestehenden Peer zu aktualisieren, führe den obigen Befehl erneut aus, indem du die IP-Adresse änderst.
Überprüfe den Status des Tunnels auf dem Server.
$ sudo wg interface: wg0 public key: U9uE2kb/nrrzsEU58GD3pKFU3TLYDMCbetIsnV8eeFE= private key: (hidden) listening port: 51820 peer: PeURxj4Q75RaVhBKkRTpNsBPiPSGb5oQijgJsTa29hg= allowed ips: 10.8.0.2/32, fd24:609a:6c18::2/128
Schritt 9 – Verbinden des Peers mit dem Tunnel
Installiere das Paket resolvconf
, falls du den gesamten Datenverkehr über das VPN leitest.
$ sudo apt install resolvconf
Starte den Tunnel auf der Gegenstelle.
$ sudo wg-quick up wg0
Du wirst eine ähnliche Ausgabe erhalten.
[#] ip link add wg0 type wireguard [#] wg setconf wg0 /dev/fd/63 [#] ip -4 address add 10.8.0.2/24 dev wg0 [#] ip -6 address add fd4d:9c8e:c4bc::2/64 dev wg0 [#] ip link set mtu 1420 up dev wg0 [#] resolvconf -a tun.wg0 -m 0 -x [#] ip rule add table 200 from 69.28.84.160 [#] ip route add table 200 default via 69.28.84.1
Überprüfe den Status des Tunnels auf der Gegenstelle.
$ sudo wg interface: wg0 public key: nbkscqPcItMsFtv3R/ylrcC9knA+3F0Z/UVCkGx/DFw= private key: (hidden) listening port: 45392 peer: JySX9hMJFyAqZA+mNvJsArKW7yY8I7ROsQKTZZR/RH8= endpoint: 209.23.10.202:51820 allowed ips: 10.8.0.0/24, fd24:609a:6c18::/64 latest handshake: 23 seconds ago transfer: 92 B received, 212 B sent persistent keepalive: every 15 seconds
Dies bestätigt die Verbindung zwischen der Gegenstelle und dem VPN.
Überprüfe, ob die Gegenstelle das VPN nutzt.
$ ip route get 10.0.8.1 10.0.8.1 dev wg0 table 51820 src 10.8.0.2 uid 1000 cache
Wenn du IPv6 verwendest, verwende stattdessen den folgenden Befehl.
$ ip -6 route get fd24:609a:6c18::1 fd24:609a:6c18::1 from :: dev wg0 proto kernel src fd24:609a:6c18::2 metric 256 pref medium
Verwende den folgenden Befehl, um die Verbindung zur Gegenstelle zu trennen.
$ sudo wg-quick down wg0 [#] ip link delete dev wg0 [#] resolvconf -d tun.wg0 -f
Verwende den folgenden Befehl, um die Peer-Konfiguration auf dem Server zu entfernen.
$ sudo wg set wg0 peer nbkscqPcItMsFtv3R/ylrcC9knA+3F0Z/UVCkGx/DFw= remove
Fazit
Damit ist die Anleitung zum Einrichten und Konfigurieren eines Wireguard VPN auf einem Ubuntu 22.04 Server und zum Verbinden mit einem Client abgeschlossen. Wenn du Fragen hast, schreibe sie unten in die Kommentare.