Wireguard-UI mit Nginx Proxy installieren

Jetzt für nur 1 Euro testen!
Habt Ihr große Hosting-Projekte mit vielen Ressourcen? Mit dem CloudServer (VPS) von hosting.de ist das kein Problem. Dank unserem umfangreichen Angebot an Hosting Tools genießt Ihr absolute Freiheit. Natürlich kann das Betriebssystem per Knopfdruck frei gewählt werden.
Jetzt Cloud Server buchen

Einleitung

Wireguard-UI ist eine Weboberfläche zum verwalten von Wireguard VPN Verbindungen.

Voraussetzungen

  • Sie verfügen über einen hosting.de Cloud Server, welcher einen gültigen DNS-Eintrag, z.B. demo.mustermann-domain.de besitzt.
  • Eine privilegierte Shell auf dem System.

Setup

Wireguard-UI lässt sich sowohl über Docker als auch direkt installieren. Da ein VPN Server möglichst simpel aufgebaut sein sollte um Komplexität und Angriffsoberfläche zu minimieren wird hier die direkte Variante verwendet. Zusätzlich sorgt ein nginx Webserver für TLS gesicherte Verbindungen (Lets Encrypt) zur Weboberfläche.

Info: Zum Zeitpunkt der Artikelerstellung ist das letzte Release von Wireguard UI ca. ein Jahr alt. Falls dieses Projekt nicht mehr aktiv gepflegt wird, sollte der Zugriff auf die Weboberfläche zusätzlich gesichert werden (z.B. basic auth über den nginx Webserver)

Vorbereitungen

Wireguard-UI soll als eigener Benutzer laufen, daher wird ein neuer System Benutzer benötigt.

adduser wireguard-ui --system --group  --home /opt/wireguard-ui

Wireguard installieren

Um Wireguard zu nutzen müssen zuerst die nötigen Tools installiert werden.

apt update
apt install wireguard-tools

Wireguard-UI installieren

Wireguard-UI wird nun von Github heruntergeladen und entpackt. Achten Sie darauf das jeweils letzte Release herunterzuladen.

cd /opt/wireguard-ui
wget https://github.com/ngoduykhanh/wireguard-ui/releases/download/v0.6.2/wireguard-ui-v0.6.2-linux-amd64.tar.gz
tar -xvf wireguard-ui-v0.6.2-linux-amd64.tar.gz
rm wireguard-ui-v0.6.2-linux-amd64.tar.gz
chown wireguard-ui:wireguard-ui wireguard-ui

Jetzt muss Wireguard-UI noch das Recht bekommen die Wireduard Konfigurationsdatei /etc/wireguard/wg0.conf zu bearbeiten

chgrp -R wireguard-ui /etc/wireguard/
chmod g+x /etc/wireguard/
chmod g+rw /etc/wireguard/wg0.conf

Nun wird ein Systemd Unit File für Wireguard-UI erstellt. Dafür legen wir die Datei /etc/systemd/system/wireguard-ui.service mit folgendem Inhalt an:

[Unit]
Description=A Web Interface to configure wireguard
After=network-online.target remote-fs.target nss-lookup.target
Wants=network-online.target

[Service]
Type=exec
ExecStart=/opt/wireguard-ui/wireguard-ui -bind-address 127.0.0.1:8001
WorkingDirectory=/opt/wireguard-ui/
User=wireguard-ui
Group=wireguard-ui

NoNewPrivileges=yes
PrivateTmp=yes
PrivateDevices=yes
DevicePolicy=closed
ProtectKernelTunables=yes
ProtectKernelModules=yes
ProtectControlGroups=yes
ProtectSystem=strict
ProtectHome=yes
MemoryDenyWriteExecute=yes

ReadWritePaths=/etc/wireguard/wg0.conf
ReadWritePaths=/run /opt/wireguard-ui/db

[Install]
WantedBy=multi-user.target

Systemd Konfiguration aktualisieren und Dienst starten.

systemctl daemon-reload
systemctl enable wireguard-ui.service
systemctl start wireguard-ui.service

Ein Kontrolle mit systemctl status wireguard-ui.service sollte jetzt eine ähnliche Ausgabe erzeugen.

● wireguard-ui.service - A Web Interface to configure wireguard
     Loaded: loaded (/etc/systemd/system/wireguard-ui.service; disabled; preset: enabled)
     Active: active (running) since Fri 2025-01-24 23:34:31 UTC; 3s ago
   Main PID: 154486 (wireguard-ui)
      Tasks: 8 (limit: 38467)
     Memory: 10.3M
        CPU: 92ms
     CGroup: /system.slice/wireguard-ui.service
             └─154486 /opt/wireguard-ui/wireguard-ui -bind-address 127.0.0.1:8001

Wireguard-UI Admin Passwort ändern

Die Weboberfläche für die configuration von Wireguard ist nun gestartet und über localhost erreichbar. Aus Sicherheitsgründen sollte man jetzt das Admin Passwort ändern bevor der Dienst öffentlich erreichbar ist. Dafür stellen wir eine neue SSH Verbindung mit ssh -L 127.0.0.1:8001:127.0.0.1:8001 root@demo.mustermann-domain.de her. Danach kann man die Oberfläche im Browser unter http://127.0.0.1:8001 erreichen. Dort mit admin:admin anmelden und oben links auf Administrator: admin klicken um das Passwort zu ändern.

Systemd für die Interaktion von Wireguard-UI mit Wireguard konfigurieren

Bisher kann kann Wireguard-UI die Konfigurationsdatei /etc/wireguard/wg0.conf anpassen, allerdings werden die Änderungen von Wireguard noch nicht übernommen. Hierfür muss Wireguard bei Bedarf automatisch neu gestartet werden.

Die Datei /etc/systemd/system/wgui-update.service mit folgendem Inhalt anlegen:

[Unit]
Description=Restart WireGuard
After=network.target

[Service]
Type=oneshot
ExecStart=/usr/bin/systemctl restart wg-quick@wg0.service

[Install]
RequiredBy=wgui-update.path

Die Datei /etc/systemd/system/wgui-update.path mit folgendem Inhalt anlegen:

[Unit]
Description=Watch /etc/wireguard/wg0.conf for changes

[Path]
PathModified=/etc/wireguard/wg0.conf

[Install]
WantedBy=multi-user.target

Anschließend systemd neu laden lassen und Wireguard-UI aktivieren:

systemctl daemon-reload
systemctl enable wgui-update.{path,service}
systemctl start wgui-update.{path,service}

Firewall und Routing

Damit Verbindungen über Wireguard zu Zielen im Internet funktionieren muss das Forwarding aktiviert werden. Um nur Wireguard Verkehr weiterzuleiten müssen entsprechende iptables Regeln konfiguriert werden.

Die Datei /etc/network/interfaces wie folgt anpassen (pre-up Zeilen hinzufügen):

auto lo
iface lo inet loopback

auto enx<mac>
iface enx<mac> inet static
    address <IP>
    gateway <GW>
    pre-up /usr/sbin/iptables -P FORWARD DROP

iface <mac> inet6 static
    address <IP6>
    gateway <GW6>
    pre-up /usr/sbin/ip6tables -P FORWARD DROP

Die Datei /etc/sysctl.d/99-forward.conf mit folgendem Inhalt anlegen:

net.ipv4.ip_forward=1
net.ipv6.conf.all.forwarding=1

In der Wireguard-UI Oberfläche müssen jetzt iptables Regeln einrichtet werden. In der Weboberfläche im Hauptmenü auf Wireguard Server klicken. Unter Post Up Script folgendes eintragen:

/usr/sbin/iptables -A FORWARD -i wg0 -j ACCEPT && /usr/sbin/iptables -A FORWARD -o wg0 -j ACCEPT && /usr/sbin/iptables -t nat -A POSTROUTING -o <interfacename> -j MASQUERADE && /usr/sbin/ip6tables -A FORWARD -i wg0 -j ACCEPT && /usr/sbin/ip6tables -t nat -A POSTROUTING -o <interfacename> -j MASQUERADE

Unter Post Down Script folgendes eintragen:

/usr/sbin/iptables -D FORWARD -i wg0 -j ACCEPT && /usr/sbin/iptables -D FORWARD -o wg0 -j ACCEPT && /usr/sbin/iptables -t nat -D POSTROUTING -o <interfacename> -j MASQUERADE && /usr/sbin/ip6tables -D FORWARD -i wg0 -j ACCEPT && /usr/sbin/ip6tables -t nat -D POSTROUTING -o <interfacename> -j MASQUERADE

Interfacename ist hierbei der Name der Netzwekschnittstelle (in /etc/network/interfaces konfiguriert). Der Name lässt sich z.B. mit ip route list default abfragen.

Optinal kann man unter Global Settings -> DNS Servers die Resolver vom Wireguard Server eintragen. Für hosting.de ist das 95.129.51.51 und 80.244.244.244.

Abschließend die Wireguard Verbindung in Systemd aktivieren:

systemctl enable wg-quick@wg0.service

Ningx installieren

Falls die Weboberfläche über das Internet erreichbar sein soll muss Nginx installiert und angepasst werden. Nginx mit Let’s Encrypt Zertifikaten installieren.

Nginx Konfiguration für Wireguard-UI erstellen. Dafür muss die Datei /etc/nginx/sites-enabled/demo.mustermann-domain.de angepasst werden:

server {
    server_name demo.mustermann-domain.de;

    include snippets/mozilla-modern.conf;
    . . .

    # allow large file uploads
    client_max_body_size 50000M;

    # Set headers
    proxy_set_header Host              $http_host;
    proxy_set_header X-Real-IP         $remote_addr;
    proxy_set_header X-Forwarded-For   $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;

    # set timeout
    proxy_read_timeout 600s;
    proxy_send_timeout 600s;
    send_timeout       600s;

    location / {
        proxy_pass http://127.0.0.1:8001;
    }
}

Danach sollte man die Nginx Konfiguration mit nginx-t auf Korrektheit prüfen und den Websever neustarten (systemctl restart nginx.service). Die Weboberflächae und der Wireguardserver sind nun unter der eingerichteten Domain (z.B. demo.mustermann-domain.de) erreichbar.

Melde Dich gerne zu unserem Newsletter an



Vielen Dank für Deine Anmeldung zum hosting.de Newsletter!