VPN mit Wireguard (und ChatGPT)
Ich hatte diesen Artikel bei der Einrichtung des Blogs geschrieben und ihn beim Aufräumen der Testeinträge mitgelöscht. Leider hatte ich zu diesem Zeitpunkt noch keine Versionierung eingerichtet. Ich habe mich daher entschlossen den Artikel einmal von OpenAI/ChatGPT neu erstellen zu lassen. Das Ergebnis kann sich durchaus sehen lassen.
Ich habe folgenden Prompt verwendet:
Schreibe einen Artikel, der die Funktion und Einrichtung von Wireguard unter Linux (Server und Client) beschreibt. Zeige jeweils beispielhafte Konfigurationsdateien und nutze Preshared Keys. Erkläre zudem die nötigen Einstellungen (iptables und sysctl) zum Forwarden von Traffic und binde diese in die Wireguard Konfigurationsdatei ein (postup/postdown). Erkläre jede Zeile der Konfigurationsdateien im Detail.
Das Ergebnis war ok, man hätte eine funktionierende Konfiguration erhalten. Allerdings hat ChatGPT eine separate Konfiguration für iptables erzeugt (/etc/iptables/rules.v4
). Dies war anders gefordert, daher habe ich ChatGPT gebeten den Artikel erneut zu schreiben:
Die iptables Befehle sollen in die Wireguard Konfigurationsdateien übernommen werden. Schreibe den Artikel neu.
Das hat OpenAI so umgesetzt, die Postup/Postdown Befehle für iptables aber auch in die Client-Konfigurationsdatei geschrieben, was natürlich komplett sinnlos ist. Daher habe ich OpenAI erneut gebeten den Artikel neu zu verfassen:
Die iptables Befehle sind nur in der Server Konfigurationsdatei sinnvoll. Schreibe den Artikel neu.
Das Einzige was nun noch fehlte, waren die Preshared Keys:
Das ist gut, es fehlen aber die Preshared Keys. Schreibe den Artikel neu.
ChatGPT hat daraufhin zwar die Konfigurationseinträge in die beiden Konfigurationsateien aufgenommen, aber den Befehl zum Erzeugen des Preshared Keys nicht erwähnt.
Es fehlt der Befehl zum Erzeugen des Preshared Keys. Schreibe den Artikel neu.
Das Ergebnis ist der folgende Artikel. Sein einziges Manko ist vielleicht noch die Erklärung des Unterschieds des AllowedIPs Eintrags zwischen Server und Client. Auf Serverseite legt AllowedIPs
die IP-Adresse des Clients fest, nutzt also das Subnet /32
. Auf dem Client gibt AllowedIPs
die Subnets an, die vom Wireguard-Server geroutet werden sollen. Gibt man hier z.B. 0.0.0.0/0
an, wird der gesamte Traffic über das VPN geleitet.
Ich habe ChatGPT daher gebeten, diesen Unterschied separat zu erläutern:
Erläutere den Unterschied der AllowedIPs Konfigurationsanweisung zwischen Client und Server.
Das Ergebnis habe ich als Hinweis unter das Fazit des eigentlichen Artikels angehängt.
Titel: WireGuard unter Linux: Eine umfassende Anleitung zur Einrichtung und Konfiguration von Servern und Clients mit Preshared Keys
Einführung:
WireGuard ist ein modernes und leistungsstarkes VPN-Protokoll, das auf einfache, sichere und effiziente Weise Netzwerke über das Internet verbindet. In diesem Artikel werden wir die Funktion und Einrichtung von WireGuard unter Linux sowohl für Server als auch für Clients beschreiben. Wir werden Beispielkonfigurationsdateien verwenden, die Verwendung von Preshared Keys erklären und die Integration von iptables-Einstellungen zur Weiterleitung des Traffics in die WireGuard-Konfigurationsdateien erläutern.
Teil 1: Einrichtung des WireGuard-Servers
1. Installation:
Beginnen Sie mit der Installation von WireGuard auf dem Server. Verwenden Sie dazu den Paketmanager Ihrer Linux-Distribution. Unter Ubuntu können Sie beispielsweise den folgenden Befehl ausführen:
sudo apt-get install wireguard
2. Generieren von Schlüsselpaaren und Preshared Key:
Jeder WireGuard-Server und -Client benötigt ein Schlüsselpaar, bestehend aus einem privaten und einem öffentlichen Schlüssel. Verwenden Sie den folgenden Befehl, um ein Schlüsselpaar für den Server zu generieren:
umask 077
wg genkey | tee privatekey | wg pubkey > publickey
Dieser Befehl generiert den privaten Schlüssel und leitet ihn in die Datei privatekey
. Der öffentliche Schlüssel wird in die Datei publickey
geschrieben.
3. Erzeugen des Preshared Keys:
Verwenden Sie den folgenden Befehl, um den Preshared Key zu erzeugen:
wg genpsk > presharedkey
Dieser Befehl generiert den Preshared Key und speichert ihn in der Datei presharedkey
.
4. Erstellen der Server-Konfigurationsdatei:
Erstellen Sie eine neue Datei wg0.conf
(Sie können auch einen anderen Namen wählen) und fügen Sie den folgenden Inhalt ein:
[Interface]
PrivateKey = <Server-Privater-Schlüssel>
Address = <Server-IP-Adresse/Subnetzmaske>
ListenPort = <Server-Port>
[Peer]
PublicKey = <Client-Öffentlicher-Schlüssel>
AllowedIPs = <Client-IP-Adresse/Subnetzmaske>
PresharedKey = <Preshared-Key>
Ersetzen Sie <Server-Privater-Schlüssel>
durch den Inhalt der privatekey
-Datei, <Server-IP-Adresse/Subnetzmaske>
durch die IP-Adresse und Subnetzmaske des Servers, <Server-Port>
durch den gewünschten WireGuard-Port für den Server, <Client-Öffentlicher-Schlüssel>
durch den öffentlichen Schlüssel des Clients, <Client-IP-Adresse/Subnetzmaske>
durch die IP-Adresse und Subnetzmaske des Clients und <Preshared-Key>
durch den Inhalt der presharedkey
-Datei.
5. Aktivieren des Forwarding von Traffic:
Damit der Server den Datenverkehr zwischen den Clients weiterleiten kann, müssen Sie das Forwarding von Traffic in den iptables-Einstellungen aktivieren. Öffnen Sie die Datei /etc/sysctl.conf
und fügen Sie die folgende Zeile hinzu:
net.ipv4.ip_forward = 1
Aktivieren Sie die Einstellungen, indem Sie den Befehl sudo sysctl -p
ausführen.
6. Konfigurieren der iptables-Regeln:
Um das Forwarding von Traffic zu ermöglichen, fügen Sie die folgenden iptables-Regeln hinzu. Öffnen Sie die WireGuard-Konfigurationsdatei wg0.conf
erneut und fügen Sie am Ende des [Interface]
-Abschnitts die folgenden Zeilen hinzu:
PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -A FORWARD -o wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -D FORWARD -o wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
Diese Zeilen fügen die iptables-Befehle hinzu, die nach der Aktivierung bzw. Deaktivierung der WireGuard-Schnittstelle ausgeführt werden. Stellen Sie sicher, dass Sie eth0
durch den Namen der Netzwerkschnittstelle ersetzen, über die Ihr Server mit dem Internet verbunden ist.
7. Starten des WireGuard-Servers:
Starten Sie den WireGuard-Server, indem Sie den folgenden Befehl ausführen:
sudo wg-quick up wg0
Teil 2: Einrichtung des WireGuard-Clients
1. Installation:
Installieren Sie WireGuard auf dem Client-System, indem Sie den entsprechenden Paketmanager verwenden. Unter Ubuntu können Sie den folgenden Befehl ausführen:
sudo apt-get install wireguard
2. Generieren von Schlüsselpaaren:
Generieren Sie ein Schlüsselpaar für den Client, ähnlich wie zuvor für den Server:
umask 077
wg genkey | tee privatekey | wg pubkey > publickey
Speichern Sie den privaten Schlüssel in der Datei privatekey
und den öffentlichen Schlüssel in der Datei publickey
.
3. Erstellen der Client-Konfigurationsdatei:
Erstellen Sie eine neue Datei wg0.conf
(oder einen anderen Namen) und fügen Sie den folgenden Inhalt ein:
[Interface]
PrivateKey = <Client-Privater-Schlüssel>
Address = <Client-IP-Adresse/Subnetzmaske>
[Peer]
PublicKey = <Server-Öffentlicher-Schlüssel>
AllowedIPs = <Server-IP-Adresse/Subnetzmaske>
Endpoint = <Server-IP-Adresse:Server-Port>
PresharedKey = <Preshared-Key>
Ersetzen Sie <Client-Privater-Schlüssel>
durch den Inhalt der privatekey
-Datei des Clients, <Client-IP-Adresse/Subnetzmaske>
durch die IP-Adresse und Subnetzmaske des Clients, <Server-Öffentlicher-Schlüssel>
durch den öffentlichen Schlüssel des Servers, <Server-IP-Adresse/Subnetzmaske>
durch die IP-Adresse und Subnetzmaske des Servers, <Server-IP-Adresse:Server-Port>
durch die IP-Adresse und den Port des WireGuard-Servers und <Preshared-Key>
durch den Inhalt der presharedkey
-Datei.
4. Starten des WireGuard-Clients:
Starten Sie den WireGuard-Client mit dem Befehl:
sudo wg-quick up wg0
Fazit:
Die Einrichtung und Konfiguration von WireGuard unter Linux erfordert das Generieren von Schlüsselpaaren und Preshared Keys, das Erstellen von Konfigurationsdateien für Server und Clients sowie die Integration von iptables-Einstellungen in die WireGuard-Konfigurationsdateien. Mit WireGuard können Sie einfach und sicher private Netzwerke über das Internet erstellen und darauf zugreifen.
Hinweis:
Die Konfigurationsanweisung "AllowedIPs" hat unterschiedliche Bedeutungen und Funktionen, abhängig davon, ob sie in der WireGuard-Konfigurationsdatei des Servers oder des Clients verwendet wird.
1. Server:
In der Server-Konfigurationsdatei gibt die "AllowedIPs"-Anweisung an, welche IP-Adressen bzw. IP-Adressbereiche vom Server akzeptiert und weitergeleitet werden sollen. Diese Einstellung definiert also die Ziel-IPs, für die der Server als VPN-Gateway fungiert und den Traffic an die entsprechenden Clients weiterleitet.
Beispiel:
[Peer]
PublicKey = <Client-Öffentlicher-Schlüssel>
AllowedIPs = <Client-IP-Adresse/Subnetzmaske>
Hier wird der "AllowedIPs"-Eintrag verwendet, um die IP-Adresse oder das Subnetz des Clients anzugeben, für das der Server als Gateway fungiert. Dies ermöglicht dem Server, den Netzwerkverkehr vom Client zu akzeptieren und an den richtigen Peer weiterzuleiten.
2. Client:
In der Client-Konfigurationsdatei gibt die "AllowedIPs"-Anweisung an, welche IP-Adressen bzw. IP-Adressbereiche über die VPN-Verbindung geroutet werden sollen. Das bedeutet, dass der Client den Traffic für diese IP-Adressen über das VPN an den Server sendet und nicht über das normale Internet.
Beispiel:
[Peer]
PublicKey = <Server-Öffentlicher-Schlüssel>
AllowedIPs = <Server-IP-Adresse/Subnetzmaske>
Hier gibt der "AllowedIPs"-Eintrag die IP-Adresse oder das Subnetz des Servers an, das über die VPN-Verbindung geroutet werden soll. Dies bewirkt, dass der Client den Netzwerkverkehr für diese IP-Adresse/n über das VPN zum Server sendet.
Zusammenfassend lässt sich sagen, dass "AllowedIPs" auf der Serverseite die Ziel-IP-Adressen angibt, für die der Server als VPN-Gateway fungiert, während auf der Clientseite die "AllowedIPs" die IP-Adressen definiert, die über die VPN-Verbindung geroutet werden sollen.