Wireguard: VPN unter Ubuntu einrichten (Client & Server) (2024)

Wireguard ist eine moderne VPN-Software, die alternativ zu OpenVPN oder IPsec für VPNs verwendet werden kann. Im Gegensatz zu den letztgenannten zielt Wireguard darauf ab einfacher, leichtgewichtiger, performanter sowie effizienter zu sein. Aus diesem Grund wird bspw. auch der Einsatz von Wireguard in eingebetten Systemen mit begrenzten Ressourcen, wie z.B. Routern, immer beliebter.

Des Weiteren setzt Wireguard nicht auf eine Client-Server-, sondern auf eine Peer-to-Peer-Architektur in Verbindung mit Public-Key-Verschlüsselung. Prinzipiell lässt sich mit Wireguard aber auch ein VPN mit bekannter Client-Server-Stuktur abbilden. Wie das in der einfachsten Form unter Ubuntu eingerichtet werden kann, zeigt der folgende Beitrag.

Folgende Software wurde verwendet:

  • Ubuntu v20.04 LTS
  • Wireguard v1.0.20200513

VPN mit Wireguard einrichten

Für diesen Beitrag wollen wir ein VPN zwischen zwei Teilnehmern (Peers) herstellen. Ein Teilnehmer nimmt dabei die Rolle des Clients und der andere des Servers ein.

Netzwerkaufbau

Client und Server befinden sich beide im Netzwerk 192.168.122.0/24, wobei beide folgende IPs haben:

  • Server: 192.168.122.19
  • Client: 192.168.122.70

Es soll nun ein VPN für den Netwerkbereich 192.168.9.0/24 aufgespannt werden. Folgende IPs & Ports sollen gelten:

  • Server: 192.168.9.1, Port: 55555
  • Client: 192.168.9.2, Port: 55556

Wireguard auf Server einrichten - 1. Teil

Als erstes wird Wireguard auf dem System installiert:

sudo apt install wireguard

Terminal / Konsole

Als nächstes muss ein neues Netzwerk-Interface angelegt und Wireguard konfiguriert werden. Für diese Schritte benötigen wir stets Root-Rechte, weshalb wir einfachhalber eine Root-Shell starten:

sudo -i

Terminal / Konsole

Nun legen wir ein neues Netzwerk-Interface mit dem Namen my-vpn an. Zudem weisen wir dem neuangelegten Interface eine IP zu (vgl. o.a. Netzwerkaufbau):

ip link add my-vpn type wireguardip addr add 192.168.9.1/24 dev my-vpn

Terminal / Konsole

Wechselt nun in das Konfigurationsverzeichnis /etc/wireguard/, welches bei der Installation angelegt wurde. Außerdem, bevor wir fortfahren, stellen wir per umask sicher, dass alle Dateien, die wir im weiteren Verlauf in der geöffneten Shell anlegen, nur Lese- und Schreibrechte für Root gesetzt bekommen.

cd /etc/wireguard/umask 0077

Terminal / Konsole

Hinweis Warum ist umask 0077 wichtig?

Im Konfigurationsverzeichnis von Wireguard speichern wir den privaten Schlüssel (Private-Key) des Peers bzw. Servers. Auf den Private-Key sollte aus Sicherheitsgründen nur Root (Administrator des Systems) Zugriff haben.

Stellt euch den Private-Key als Passwort für den Zugang zu eurem VPN vor. Wer den Private-Key kennt, kann sich mit eurem sicheren bzw. verschlüsselten VPN verbinden. Insofern solltet ihr genauso wie ihr eure Passwörter vor dem Zugriff Dritter schützt, auch eure Private-Keys schützen und sicher aufbewahren.

Folgend erstellen wir nun das Schlüsselpaar für den Server, welches aus einem privaten sowie öffentlichen Schlüssel (Private-Key & Public-Key) besteht:

wg genkey | tee server.private-key | wg pubkey > server.public-key

Terminal / Konsole

Als nächstes nehmen wir eine weitere Konfiguration am Netzwerk-Interface vor. Zum einen legen wir den Port fest, auf dem das Interface lauschen wird und wir legen den zu verwendenden Private-Key fest:

wg set my-vpn listen-port 55555 private-key server.private-key

Terminal / Konsole

Es folgt die Ereugung bzw. Speicherung der eigentichen Wireguard-Konfigurationsdatei:

touch my-vpn.confwg-quick save my-vpn

Terminal / Konsole

Die erstellte Konfigurationsdatei sollte wie folgt aussehen:

[Interface]Address = 192.168.9.1/24ListenPort = 55555PrivateKey = [Private-Key-Server]

/etc/wireguard/my-vpn.conf - Server

Unter dem Punkt PrivateKey sollte der generierte Private-Key, den wir in server.private-key gespeichert haben, eingetragen sein.

Ihr könnt nun die Root-Shell per exit verlassen. Damit wäre der erste Teil der Serverkonfiguration abgeschlossen. Bevor wir aber zum Client kommen, erstellen wir uns eine Verbindungsdatei mit den öffentlichen Daten des Servers. Diese Datei verwenden wir später zur Konfiguration des Clients.

Wir benötigen drei Informationen des Servers: den Public-Key, den Port des VPN-Interfaces sowie die "öffentliche" IP-Adresse, über die der Server vom Client erreichbar ist. Die Daten können wir über folgende Befehle erhalten:

sudo wg show my-vpn public-keysudo wg show my-vpn listen-portip -c address

Terminal / Konsole

Mithilfe der erhaltenen Daten erstellen wir nun die besagte Verbindungsdatei server.peer-conf, so dass sie wie folgt aussieht:

[Peer]# serverPublicKey = GX9BG67Gf1H1YA/bpZoQWEqNMqdWCgyCVFq8ui/dlBc=Endpoint = 192.168.122.19:55555AllowedIPs = 192.168.9.0/24

~/server.peer-conf

Mittels dieser Daten, die für jeden Client in die eigene Konfigurationsdatei kopiert werden, weiß der Client, wie der Server zu erreichen ist. In diesem Fall würde der Client alle Anfragen an AllowedIps mit dem PublicKey des Servers verschlüsseln und an den Server senden. Die Initialisierung der VPN-Verbindung mit dem Server erfolgt dabei über die Endpoint-Adresse.

Wireguard auf Client einrichten

Die Einrichtung auf dem Client erfolgt erst einmal analog zur Einrichtung auf dem Server. Aus diesem Grund gehe ich auf die folgenden Befehle nicht noch einmal näher ein:

sudo apt install wireguardsudo -iip link add my-vpn type wireguardip addr add 192.168.9.2/24 dev my-vpncd /etc/wireguard/umask 0077wg genkey | tee client.private-key | wg pubkey > client.public-keywg set my-vpn listen-port 55556 private-key client.private-keytouch my-vpn.confwg-quick save my-vpn

Terminal / Konsole

Kopiert nun die auf dem Server zuvor erstellte Datei server.peer-conf auf den Client ins Verzeichnis /etc/wireguard. Anschließend ergänzen wir die Konfiguration des Clients um die Serverdaten wie folgt:

wg addconf my-vpn server.peer-confwg-quick save my-vpn

Terminal / Konsole

Als Resultat sollte die Konfigurationsdatei my-vpn.conf auf dem Client so aussehen:

[Interface]Address = 192.168.9.2/24ListenPort = 55556PrivateKey = [Private-Key-Client][Peer]PublicKey = GX9BG67Gf1H1YA/bpZoQWEqNMqdWCgyCVFq8ui/dlBc=AllowedIPs = 192.168.9.0/24Endpoint = 192.168.122.19:55555

/etc/wireguard/my-vpn.conf - Client

Die Root-Shell kann nun wieder per exit geschlossen werden. Analog zum Server erstellen wir nun eine Verbindungsdatei client.peer-conf mit den öffentlichen Daten des Clients. Die entsprechenden Informationen lassen sich über die bekannten Befehle ermitteln:

sudo wg show my-vpn public-keysudo wg show my-vpn listen-portip -c address

Terminal / Konsole

Die erstellte Verbindungdatei sieht dann etwas abweichend zum Server wie folgt aus:

[Peer]# clientPublicKey = X4im6+fUMvo2wLA+EpbbD7nwX7gnwO8pwPBKAc4mtEM=#Endpoint = 192.168.122.70:55556AllowedIPs = 192.168.9.2/32

~/client.peer-conf

In unserer Client-Server-Nachbildung benötigen wir den Endpoint des Clients nicht (siehe auch Wireguard: Built-in Roaming). Außerdem ist wichtig, dass ihr bei AllowedIPs die Netzmaske 32 angebt. Unter dieser IP-Adresse ist euer Client im VPN dann erreichbar.

Die Einrichtung des Clients ist damit soweit abgeschlossen.

Wireguard auf Server einrichten - 2. Teil

Kopiert die zuvor erstellte client.peer-conf nach /etc/wireguard und passt die Serverkonfiguration wie folgt an:

sudo -iwg addconf my-vpn client.peer-confwg-quick save my-vpn

Terminal / Konsole

Die angepasste Konfigurationsdatei sollte nun wie folgt aussehen:

[Interface]Address = 192.168.9.1/24ListenPort = 55555PrivateKey = [Private-Key-Server][Peer]PublicKey = X4im6+fUMvo2wLA+EpbbD7nwX7gnwO8pwPBKAc4mtEM=AllowedIPs = 192.168.9.2/32

/etc/wireguard/my-vpn.conf - Server

Schließt die Root-Shell per exit. Damit ist auch die Konfiguration des Servers abgeschlossen.

Wireguard starten & VPN-Verbindung testen

Sowohl auf Client als auch Server starten wir nun noch das Netzerk-Interface:

sudo ip link set my-vpn upsudo ip link set my-vpn up

Terminal / Konsole

Hinweis Firewall anpassen

Wenn ihr eine Firewall, wie z.B. ufw, verwendet müsst ihr sowohl auf dem Client als auch Server die entsprechenden UDP-Ports freigeben.

Zukünftig könnt ihr das Wireguard-VPN-Interface auch mit folgenden Befehlen einfach starten und beenden:

sudo wg-quick up my-vpnsudo wg-quick down my-vpn

Terminal / Konsole

Zum Testen, ob die VPN-Verbindung erfolgreich hergestellt werden konnte, können wir z.B. auf dem Client den Server anpingen:

ping 192.168.9.1

Terminal / Konsole

Außerdem könnt ihr euch die VPN-Verbindungsinformationen mit folgendem Befehl anzeigen lassen:

sudo wg show my-vpninterface: my-vpn public key: X4im6+fUMvo2wLA+EpbbD7nwX7gnwO8pwPBKAc4mtEM= private key: (hidden) listening port: 55556peer: GX9BG67Gf1H1YA/bpZoQWEqNMqdWCgyCVFq8ui/dlBc= endpoint: 192.168.122.19:55555 allowed ips: 192.168.9.0/24 latest handshake: 19 seconds ago transfer: 476 B received, 564 B sent

Terminal / Konsole

Weiterführende Informationen

Je nach Anwendungsfall gibt es jetzt diverse Einstellungsmöglichkeiten, die ihr basierend auf der hier im Beitrag vorgestellten Konfiguration vornehmen könnt. Bspw. könntet ihr einstellen, dass der komplette Traffic des Clients über das Wireguard-VPN-Interface geroutet wird. Ihr könntet auch feingranular einstellen, welche Programme ihren Traffic über das VPN-Interface und welche ihren Traffic weiterhin über die normalen Ethernet- und/oder Wireless-Interfaces routen sollen (hierfür eignen sich bspw. Network-Namespaces).

Weitere Informatonen zu Wireguard findet ihr z.B. auf den folgenden Webseiten:

Fazit

Für mich und meine Anwendungsfälle ist Wireguard derzeit die bevorzugte VPN-Lösung. Es setzt auf aktuelle Krypto-Standards, ist einfach zu konfigurieren, effizient und schnell.

Wireguard: VPN unter Ubuntu einrichten (Client & Server) (2024)

References

Top Articles
Latest Posts
Article information

Author: Carmelo Roob

Last Updated:

Views: 6670

Rating: 4.4 / 5 (65 voted)

Reviews: 88% of readers found this page helpful

Author information

Name: Carmelo Roob

Birthday: 1995-01-09

Address: Apt. 915 481 Sipes Cliff, New Gonzalobury, CO 80176

Phone: +6773780339780

Job: Sales Executive

Hobby: Gaming, Jogging, Rugby, Video gaming, Handball, Ice skating, Web surfing

Introduction: My name is Carmelo Roob, I am a modern, handsome, delightful, comfortable, attractive, vast, good person who loves writing and wants to share my knowledge and understanding with you.