Wireguard-UI mit Nginx Proxy installieren
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.