So erstellen Sie ein Punkt-zu-Punkt-VPN mit WireGuard unter Ubuntu 16.04

Einführung

WireGuard ist ein modernes, leistungsstarkes VPN, das einfach zu bedienen und gleichzeitig robust ist. WireGuard konzentriert sich nur auf die Bereitstellung einer sicheren Verbindung zwischen Parteien über eine Netzwerkschnittstelle, die mit der Authentifizierung mit öffentlichem Schlüssel verschlüsselt ist. Dies bedeutet, dass im Gegensatz zu den meisten VPNs keine Topologie erzwungen wird, sodass durch Manipulieren der umgebenden Netzwerkkonfiguration unterschiedliche Konfigurationen erzielt werden können. Dieses Modell bietet eine große Leistung und Flexibilität, die je nach Ihren individuellen Bedürfnissen eingesetzt werden können.

Eine der einfachsten Topologien, die WireGuard verwenden kann, ist eine Punkt-zu-Punkt-Verbindung. Dadurch wird eine sichere Verbindung zwischen zwei Computern hergestellt, ohne dass ein zentraler Server diese vermittelt. Diese Art der Verbindung kann auch zwischen mehr als zwei Mitgliedern verwendet werden, um eine Mesh-VPN-Topologie einzurichten, bei der jeder einzelne Server direkt mit seinen Kollegen kommunizieren kann. Da jeder Host gleichberechtigt ist, eignen sich diese beiden Topologien am besten für die Einrichtung von sicherem Messaging zwischen Servern, anstatt einen einzelnen Server als Gateway für die Weiterleitung des Datenverkehrs zu verwenden.

In diesem Handbuch zeigen wir Ihnen, wie Sie mit zwei Ubuntu 16.04-Servern eine Punkt-zu-Punkt-VPN-Verbindung mit WireGuard herstellen. Zunächst installieren wir die Software und generieren dann kryptografische Schlüsselpaare für jeden Host. Anschließend erstellen wir eine kurze Konfigurationsdatei, um die Verbindungsinformationen des Peers zu definieren. Sobald wir die Schnittstelle gestartet haben, können wir sichere Nachrichten zwischen den Servern über die WireGuard-Schnittstelle senden.

Voraussetzungen

Um diesem Handbuch folgen zu können, benötigen Sie Zugriff auftwoUbuntu 16.04-Server. Auf jedem Server müssen Sie einen Nicht-Root-Benutzer mit den Berechtigungensudoerstellen, um administrative Aktionen ausführen zu können. Sie benötigen außerdem eine grundlegende Firewall, die auf jedem System konfiguriert ist. Sie können diese Anforderungen erfüllen, indem Sie das folgende Lernprogramm ausführen:

Wenn Sie fortfahren möchten, melden Sie sich mit dem Benutzer Ihressudobei jedem Server an.

Installation der Software

Das WireGuard-Projekt bietet eine PPA mit aktuellen Paketen für Ubuntu-Systeme. Wir müssen WireGuard auf beiden Servern installieren, bevor wir fortfahren können. Führen Sie auf jedem Server die folgenden Aktionen aus.

Fügen Sie zunächst den WireGuard PPA zum System hinzu, um den Zugriff auf die Projektpakete zu konfigurieren:

sudo add-apt-repository ppa:wireguard/wireguard

Drücken SieENTER, wenn Sie aufgefordert werden, die neue Paketquelle zur Konfiguration vonapthinzuzufügen. Aktualisieren Sie nach dem Hinzufügen des PPA den lokalen Paketindex, um Informationen zu den neu verfügbaren Paketen abzurufen, und installieren Sie dann das WireGuard-Kernelmodul und die Userland-Komponenten:

sudo apt-get update
sudo apt-get install wireguard-dkms wireguard-tools

Als nächstes können wir WireGuard auf jedem unserer Server konfigurieren.

Erstellen eines privaten Schlüssels

Jeder Teilnehmer an einem WireGuard VPN authentifiziert sich gegenüber seinen Kollegen mithilfe der Kryptografie mit öffentlichen Schlüsseln. Verbindungen zwischen neuen Peers können hergestellt werden, indem öffentliche Schlüssel ausgetauscht werden und eine minimale Konfiguration durchgeführt wird.

Geben Sie die folgendenon each serverein, um einen privaten Schlüssel zu generieren und direkt in eine WireGuard-Konfigurationsdatei zu schreiben:

(umask 077 && printf "[Interface]\nPrivateKey = " | sudo tee /etc/wireguard/wg0.conf > /dev/null)
wg genkey | sudo tee -a /etc/wireguard/wg0.conf | wg pubkey | sudo tee /etc/wireguard/publickey

Der erste Befehl schreibt den Anfangsinhalt einer Konfigurationsdatei in/etc/wireguard/wg0.conf. Der Wert vonumaskin einer Sub-Shell, damit wir die Datei mit eingeschränkten Berechtigungen erstellen, ohne unsere reguläre Umgebung zu beeinträchtigen.

Der zweite Befehl generiert einen privaten Schlüssel mit dem Befehlwgvon WireGuard und schreibt ihn direkt in unsere eingeschränkte Konfigurationsdatei. Wir leiten den Schlüssel auch zurück in den Befehlwg pubkey, um den zugehörigen öffentlichen Schlüssel abzuleiten, den wir zur einfachen Bezugnahme in eine Datei namens/etc/wireguard/publickey schreiben. Wir müssen den Schlüssel in dieser Datei mit dem zweiten Server austauschen, während wir unsere Konfiguration definieren.

Erstellen einer Erstkonfigurationsdatei

Als Nächstes öffnen wir die Konfigurationsdatei in einem Editor, um einige weitere Details festzulegen:

sudo nano /etc/wireguard/wg0.conf

Im Inneren sollte Ihr generierter privater Schlüssel in einem Abschnitt namens[Interface] definiert sein. Dieser Abschnitt enthält die Konfiguration für die lokale Seite der Verbindung.

Schnittstellenteil konfigurieren

Wir müssen die VPN-IP-Adresse definieren, die dieser Knoten verwendet, und den Port, den er auf Verbindungen von Peers überwacht. Fügen Sie zunächst die ZeilenListenPort undSaveConfig hinzu, damit Ihre Datei folgendermaßen aussieht:

/etc/wireguard/wg0.conf

[Interface]
PrivateKey = generated_private_key
ListenPort = 5555
SaveConfig = true

Hiermit wird der Port festgelegt, auf dem WireGuard empfangsbereit ist. Dies kann jeder freie, bindbare Port sein, aber in diesem Handbuch richten wir unser VPN auf Port 5555 für beide Server ein. Stellen Sie dieListenPort auf jedem Host auf den von Ihnen ausgewählten Port ein:

Wir setzen auchSaveConfig auftrue. Dadurch wird der Dienst vonwg-quickangewiesen, seine aktive Konfiguration beim Herunterfahren automatisch in dieser Datei zu speichern.

[.note] #Note: WennSaveConfig aktiviert ist, überschreibt der Dienstwg-quick den Inhalt der Datei/etc/wireguard/wg0.conf, wenn der Dienst heruntergefahren wird. Wenn Sie die WireGuard-Konfiguration ändern müssen, fahren Sie entweder den Dienstwg-quickherunter, bevor Sie die Datei/etc/wireguard/wg0.confbearbeiten, oder nehmen Sie die Änderungen am laufenden Dienst mit dem Befehlwgvor (dies ist der Fall) in der Datei gespeichert, wenn der Dienst heruntergefahren wird). Alle Änderungen, die während der Ausführung des Dienstes an der Konfigurationsdatei vorgenommen werden, werden überschrieben, wennwg-quick seine aktive Konfiguration speichert.
#

Fügen Sie als Nächstes jedem Server eine eindeutigeAddress-Definition hinzu, damit derwg-quick-Dienst die Netzwerkinformationen festlegen kann, wenn die WireGuard-Schnittstelle aufgerufen wird. Wir werden das Subnetz 10.0.0.0/24 als Adressraum für unser VPN verwenden. Für jeden Computer müssen Sie eine eindeutige Adresse innerhalb dieses Bereichs (10.0.0.1 bis 10.0.0.254) auswählen und die Adresse und das Subnetz mitCIDR notation angeben.

Wir geben unserenfirst server eine Adresse von 10.0.0.1, die in der CIDR-Notation als 10.0.0.1/24 dargestellt wird:

/etc/wireguard/wg0.conf on first server

[Interface]
PrivateKey = generated_private_key
ListenPort = 5555
SaveConfig = true
Address = 10.0.0.1/24

Auf unserensecond server definieren wir die Adresse als 10.0.0.2, was uns eine CIDR-Darstellung von 10.0.0.2/24 gibt:

/etc/wireguard/wg0.conf on second server

[Interface]
PrivateKey = generated_private_key
ListenPort = 5555
SaveConfig = true
Address = 10.0.0.2/24

Dies ist das Ende des Abschnitts[Interface].

Wir können die Informationen zu den Peers des Servers entweder in die Konfigurationsdatei oder später manuell mit dem Befehlwgeingeben. Wie oben erwähnt, bedeutet der Dienstwg-quickmit der OptionSaveConfig auftrue, dass die Peer-Informationen schließlich mit beiden Methoden in die Datei geschrieben werden.

Um beide Möglichkeiten zum Definieren von Peer-Identitäten zu demonstrieren, erstellen wir einen[Peer]-Abschnitt in der Konfigurationsdatei des zweiten Servers, jedoch nicht in der ersten. Sie können die Konfigurationsdatei für den Serverfirst(der die 10.0.0.1-Adresse definiert) jetzt speichern und schließen.

Peer-Bereich definieren

Erstellen Sie in der noch geöffneten Konfigurationsdatei einen Abschnitt mit dem Namen[Peer] unter den Einträgen im Abschnitt[Interface].

Setzen Sie zunächstPublicKey auf den Wert des öffentlichen Schlüssels desfirst-Servers. Sie finden diesen Wert, indem Siecat /etc/wireguard/publickey auf dem gegenüberliegenden Server eingeben. Wir setzen auchAllowedIPs auf die IP-Adressen, die innerhalb des Tunnels gültig sind. Da wir die spezifische IP-Adresse kennen, die der erste Server verwendet, können wir diese direkt eingeben und mit/32 enden, um einen Bereich anzugeben, der einen einzelnen IP-Wert enthält:

/etc/wireguard/wg0.conf on second server

[Interface]
. . .

[Peer]
PublicKey = public_key_of_first_server
AllowedIPs = 10.0.0.1/32

Schließlich können wirEndpoint auf die öffentliche IP-Adresse des ersten Servers und den WireGuard-Überwachungsport setzen (in diesem Beispiel haben wir Port 5555 verwendet). WireGuard aktualisiert diesen Wert, wenn von diesem Peer legitimer Datenverkehr über eine andere Adresse empfangen wird, sodass sich das VPN an die Roaming-Bedingungen anpassen kann. Wir legen den Anfangswert fest, damit dieser Server den Kontakt initiieren kann:

/etc/wireguard/wg0.conf on second server

[Interface]
. . .

[Peer]
PublicKey = public_key_of_first_server
AllowedIPs = 10.0.0.1/32
Endpoint = public_IP_of_first_server:5555

Wenn Sie fertig sind, speichern und schließen Sie die Datei, um zur Eingabeaufforderung zurückzukehren.

Starten des VPN und Herstellen einer Verbindung zu Peers

Jetzt können wir WireGuard auf jedem Server starten und die Verbindung zwischen unseren beiden Peers konfigurieren.

Firewall öffnen und VPN starten

Öffnen Sie zuerst den WireGuard-Port in der Firewall auf jedem Server:

sudo ufw allow 5555

Starten Sie nun den Dienstwg-quickmit der von uns definierten Schnittstellendateiwg0:

sudo systemctl start wg-quick@wg0

Dies startet die Netzwerkschnittstelle vonwg0auf dem Computer. Wir können dies bestätigen, indem wir Folgendes eingeben:

ip addr show wg0
Output on first server6: wg0:  mtu 1420 qdisc noqueue state UNKNOWN group default qlen 1
    link/none
    inet 10.0.0.1/24 scope global wg0
       valid_lft forever preferred_lft forever

Mit dem Toolwgkönnen Sie Informationen zur aktiven Konfiguration des VPN anzeigen:

sudo wg

Auf dem Server ohne Peer-Definition sieht die Anzeige folgendermaßen aus:

Output on first serverinterface: wg0
  public key: public_key_of_this_server
  private key: (hidden)
  listening port: 5555

Auf dem Server mit einer bereits definierten Peer-Konfiguration enthält die Ausgabe auch die folgenden Informationen:

Output on second serverinterface: wg0
  public key: public_key_of_this_server
  private key: (hidden)
  listening port: 5555

peer: public_key_of_first_server
  endpoint: public_IP_of_first_server:5555
  allowed ips: 10.0.0.1/32

Um die Verbindung herzustellen, müssen wir jetzt die Peering-Informationen des zweiten Servers mit dem Befehlwgzum ersten Server hinzufügen.

Hinzufügen der fehlenden Peer-Informationen in der Befehlszeile

Geben Sie auf denfirst server (die keine Peer-Informationen anzeigen) die Peering-Informationen manuell im folgenden Format ein. Der öffentliche Schlüssel des zweiten Servers befindet sich in der Ausgabe vonsudo wg vom zweiten Server:

sudo wg set wg0 peer public_key_of_second_server endpoint public_IP_of_second_server:5555 allowed-ips 10.0.0.2/32

Sie können bestätigen, dass sich die Informationen jetzt in der aktiven Konfiguration befinden, indem Sie auf dem ersten Server erneutsudo wg eingeben:

sudo wg
Output on first serverinterface: wg0
  public key: public_key_of_this_server
  private key: (hidden)
  listening port: 5555

peer: public_key_of_second_server
  endpoint: public_IP_of_second_server:5555
  allowed ips: 10.0.0.2/32

Unsere Punkt-zu-Punkt-Verbindung sollte jetzt verfügbar sein. Versuchen Sie, die VPN-Adresse des zweiten Servers vom ersten an zu pingen:

ping -c 3 10.0.0.2
Output on first serverPING 10.0.0.2 (10.0.0.2) 56(84) bytes of data.
64 bytes from 10.0.0.2: icmp_seq=1 ttl=64 time=0.635 ms
64 bytes from 10.0.0.2: icmp_seq=2 ttl=64 time=0.615 ms
64 bytes from 10.0.0.2: icmp_seq=3 ttl=64 time=0.841 ms

--- 10.0.0.2 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 1998ms
rtt min/avg/max/mdev = 0.615/0.697/0.841/0.102 ms

Wenn alles ordnungsgemäß funktioniert, können Sie die Konfiguration auf dem ersten Server in der Datei/etc/wireguard/wg0.confpeichern, indem Sie den Dienst neu starten:

sudo systemctl restart wg-quick@wg0

Wenn Sie den Tunnel beim Booten starten möchten, können Sie den Dienst auf jedem Computer aktivieren, indem Sie Folgendes eingeben:

sudo systemctl enable wg-quick@wg0

Der VPN-Tunnel sollte jetzt automatisch gestartet werden, wenn die Maschine hochfährt.

Fazit

WireGuard ist aufgrund seiner Flexibilität, leichten Implementierung und modernen Kryptografie eine großartige Option für viele Anwendungsfälle. In diesem Handbuch haben wir WireGuard auf zwei Ubuntu 16.04-Servern installiert und jeden Host als Server mit einer Punkt-zu-Punkt-Verbindung zu seinem Peer konfiguriert. Diese Topologie eignet sich ideal zum Herstellen einer Server-zu-Server-Kommunikation mit Peers, bei denen jede Seite gleichberechtigt ist oder bei denen Hosts möglicherweise Ad-hoc-Verbindungen zu anderen Servern herstellen müssen.