Ubuntu LTS 20.04 als Wireguard Server

Einen Ubuntu Server als Wirguard Server einrichten


<<< Wireguard auf dem Raspberry Pi <<< | >>> VPN mit Wireguard und Pi-hole >>>


In diesem Beitrag habe ich bereits die Bereitstellung eines Raspberry Pi als Wireguard Peer, an einem Egde Standort beschrieben.
Hier soll es nun um die „Gegenstelle“ in der Company, einem Lab, einem Cloud Netz oder einem anderen beliebigen Standort gehen, zu welchem ein Tunnel unter Verwendung von Wireguard benötigt wird. Das Paket Wireguard ist in Ubuntu 20.04 Kernel 5.4.0-58 bereits als Repository verfügbar und muss deshalb nur installiert werden, weshalb ich diesen Abschnitt kurz halte. Wer die Details der Konfiguration benötigt, kann sich auch meinen anderen Beitrag dazu anschauen, hier habe ich die einzelnen Parameter näher erläutert. Diese sind prinzipiell für jedes OS und auch jedes Unix Derivat identisch, allein die Installation von Wireguard unterscheidet sich.

Voraussetzungen:

  • Installiertes OS Ubuntu LTS 20.04
  • Netzwerk-Konfiguration abgeschlossen wie im Schema beschrieben, mit der lokalen IP 10.150.150.10/24.
  • Der Server hat Internet Zugriff via https
  • Der Server ist aus dem Internet auf dem UDP Port 51238 erreichbar.

Installation Wireguard auf Ubuntu LTS 20.04

  1. Zunächst natürlich ein Update des Systems:
    sudo apt update
    sudo apt upgrade -y
  2. Jetzt die Installation von Wireguard:
    sudo apt install wireguard -y

Damit ist die Installation auch schon abgeschlossen!

Vorbereitung des Systems

  1. Zuerst öffnen wir mal den UDP Port, falls UFW aktiv ist:
    sudo ufw allow 51238/udp

    und prüfen anschließend den Status:

    sudo ufw status

  2. Jetzt müssen wir doch das IP Forwarding einschalten. Dazu editieren wir die entsprechende System Konfigurationsdatei mit:
    sudo nano /etc/sysctl.conf

    Suchen jetzt nach der Zeile:

    net.ipv4.ip_forward=0

    und ändern diese in:

    net.ipv4.ip_forward=1

    Mit STRG+O -> ENTER speichern und mit STRG+X verlassen wir den Editor wieder…

    Diese Einstellung übernehmen wir jetzt noch mit:

    sudo sysctl -p

Damit sind die Vorbereitungen abgeschlossen.

Konfiguration von Wireguard auf Ubuntu LTS 20.04

  1. Jetzt wechseln wir ins Wireguard Verzeichnis, setzen dort die Rechte für das Verzeichnis (umask…) und erstellen dann das Schlüsselpaar:
    sudo -i
    cd /etc/wireguard/
    umask 077; wg genkey | tee privatekey | wg pubkey > publickey

    und wir lassen uns die Schlüssel zum Abspeichern anzeigen…

    ls -l privatekey publickey
    cat privatekey
    cat publickey

    Später, wenn man nicht mehr als su eleviert ist aber Root Rechte hat, mit:

    sudo cat /etc/wireguard/privatekey

    und

    sudo cat /etc/wireguard/publickey

  2. Jetzt erstellen wir die Konfigurationsdatei
    sudo nano /etc/wireguard/wg0.conf

    und befüllen sie gemäß dem obigen Netzwerk Design…

    [Interface]
    Address = 172.20.20.1/24
    PrivateKey = hier_den_oben_generierten_Privatekey_einfügen
    ListenPort = 51238
    
    PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -A FORWARD -o %i -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
    PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -D FORWARD -o %i -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
    
    [Peer]
    PublicKey = hier_den_generierten_Publickey_des_Raspi_einfügen
    AllowedIPs = 172.20.20.11/32,192.168.100.0/24
    PersistentKeepAlive = 25

    Hinweise:
    Mit AllowedIPs = 172.20.20.11/32,192.168.100.0/24 lassen wir Pakete vom Wireguard Interface des Raspi 172.20.20.11/32 und alle Clients aus dem Edge Netz 192.168.100.0/24 zu.
    Mit PostUp = iptables… leiten wir die Anfragen aus dem Edge Netz in das Lab Netz weiter und führen ein NAT durch, damit Systeme aus dem Lab erfolgreich auf die Anfragen von Clients aus dem Edge Netz antworten können.

  3. Die Konfiguration auf dem Raspi, an unserer Edge Site, sieht passend dazu so aus:
    [Interface]
    Address = 172.20.20.11/24
    PrivateKey = hier_der_generierte_Privatekey_des_Raspi
    ListenPort = 51238
    DNS = 10.1.110.1
    
    PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -A FORWARD -o %i -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
    PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -D FORWARD -o %i -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
    
    [Peer]
    Endpoint = Public_IP_des_Servers_oder_DNS_Name:51238
    PublicKey = hier_der_generierte_Publickey_des_Wireguard_Servers_im_Lab
    AllowedIPs = 172.20.20.0/24,10.150.150.0/24,10.1.110.0/24
    PersistentKeepalive = 25

    Mit AllowedIPs = 172.20.20.0/24,10.150.150.0/24,10.1.110.0/24 routen wir alle Pakete, in diese Netze, direkt am Raspi, für alle Clients aus dem Edge Netz 192.168.100.0/24, direkt in den Wireguard Tunnel.
    Mit DNS = 10.1.110.1 lassen wir DNS Anfragen für bestimmte Domain Namen auf dem DNS Server im Lab auflösen. Hierzu ist dann noch ein DNS Forwarding einzurichten, was wir noch auf dem Raspi, unter Verwendung von Pi-hole realisieren werden. Dieser Beitrag erläutert das genauer…

Test der Kommunikation über Wireguard

Die Konfiguration von Wireguard ist auf beiden Seiten abgeschlossen, also muss jetzt zunächst mal die Verbindung getestet werden.

  1. Zuerst aktivieren man den Wireguard Tunnel auf beiden Seiten, falls nicht schon geschehen:
    sudo wg-quick up wg0
  2. Die Ausgabe sollte bei erfolgreichem Start von Wireguard in etwa so aussehen…

  3. Jetzt den Status des Tunnels prüfen mit:
    sudo wg
  4. Wenn der Tunnel erfolgreich hergestellt wurde, sieht man anhand der markierten Zeile bereits eingehenden und ausgehenden Traffic…

    Wenn die Zeile keinerlei Traffic ausgibt, kann man davon ausgehen, dass der Tunnel nicht zustande gekommen ist. Hier kann man zunächst mit

    sudo systemctl status wg-quick@wg0

    den Status des Wireguard Service prüen, eventuell gibt es hier schon Hinweise.

    Meine Erfahrung zeigt mir aber, dass es sich in 90% der Fälle um folgende Fehler handelt und diese immer zuerst doppelt zu prüfen sind:

    • Der Wireguard Server wird nicht via UDP auf dem entsprechend gewählten Port erreicht –> DNAT an der Standort-Firewall prüfen
    • In der Konfigurationsdatei wurden die AllowedIPs nicht gemäß dem Design konfiguriert
    • IP Konfiguration passt nicht zum Design –> Konfigurationsdatei prüfen und ggfs. anpassen.
    • IP Forwarding wurde nicht eingeschaltet
    • Client / Server Firewall (UFW, SELINUX, Windows Firewall etc.) lässt keine Kommunikation auf dem gewählten UDP Port zu
    • Kopierfehler oder logisches Vertauschen von Public und Private Key an den Systemen
    • Alles Fehler, die mir selbst schon unterlaufen sind und erst nach Stunden auffielen.
      Deshalb wichtig, immer ans Design halten, konzentrieren und manchmal tat’s auch ’ne Tasse Kaffee und ein freier Kopf! 😉

      Hinweis: Diese beiden Befehle werdet ihr jetzt vermutlich häufig brauchen:
      Anpassen der Konfiguration:

      sudo nano /etc/wireguard/wg0.conf

      und nach jeder Änderung der Konfiguration muss der Wireguard Tunnel mit

      sudo wg-quick down wg0 && sudo wg-quick up wg0

      neu gestartet werden.

    Sind dann alle Fehler behoben und der Wireguard Server und auch die „dahinter“ liegenden Systeme via PING erreichbar, kann man sich dem Thema DNS an der Edge Site widmen, worauf ich in einem weiteren Beitrag näher eingehen werden.