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 bis 10.255.255.255 (10/8 Präfix)
  • 172.16.0.0 bis 172.31.255.255 (172.16/12 Präfix)
  • 192.168.0.0 bis 192.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.

Das könnte dich auch interessieren …