Raspberry Pi mit WireGuard und wireguard-ui Webinterface

wireguard-ui ist ein weiters Webinterface, um die Einrichtung von WireGuard und Verwaltung der Clients zu vereinfachen. Wird auch aktiv gepflegt, mein Favorit!
Für das Webinterface einfach die entsprechende binary herunterladen und auf dem Host ausführen.

Installiert wird auf einem Raspberry Pi 3 mit frisch aufgesetztem Raspberry Pi OS Lite. (64-bit, Kernel 6.1, Bookworm)

Installation

Benötigte Pakete installieren.

apt install -y wget iptables wireguard-tools

wireguard-ui installieren (bei mir nach /opt/wireguard-ui)

mkdir /opt/wireguard-ui
wget https://github.com/ngoduykhanh/wireguard-ui/releases/download/v0.6.2/wireguard-ui-v0.6.2-linux-arm64.tar.gz
tar xvfz wireguard-ui-v0.6.2-linux-arm64.tar.gz -C /opt/wireguard-ui/
rm wireguard-ui-v0.6.2-linux-arm64.tar.gz

systemd scripts erstellen

Diese beiden Services überwachen Veränderungen an der wg0.conf und starten den WireGuard Service neu.

/etc/systemd/system/wgui.service

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

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

[Install]
RequiredBy=wgui.path

/etc/systemd/system/wgui.path

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

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

[Install]
WantedBy=multi-user.target

Leere wg0.conf erstellen. Sonst startet der wgui.service mit einer Fehlermeldung, da noch keine wg0.conf existiert.

touch /etc/wireguard/wg0.conf

Services aktivieren und starten.

systemctl enable wgui.{path,service}
systemctl start wgui.{path,service}

Status der Services.

systemctl status wgui.{path,service}

● wgui.path - Watch /etc/wireguard/wg0.conf for changes
     Loaded: loaded (/etc/systemd/system/wgui.path; enabled; preset: enabled)
     Active: active (waiting) since Sun 2024-02-25 12:25:05 CET; 16min ago
   Triggers: ● wgui.service

Feb 25 12:25:05 pi systemd[1]: Started wgui.path - Watch /etc/wireguard/wg0.conf for changes.

○ wgui.service - Restart WireGuard
     Loaded: loaded (/etc/systemd/system/wgui.service; enabled; preset: enabled)
     Active: inactive (dead) since Sun 2024-02-25 12:27:19 CET; 14min ago
TriggeredBy: ● wgui.path
    Process: 596 ExecStart=/usr/bin/systemctl restart wg-quick@wg0.service (code=exited, status=0/SUCCESS)
   Main PID: 596 (code=exited, status=0/SUCCESS)
        CPU: 48ms

Feb 25 12:25:07 pi systemd[1]: Starting wgui.service - Restart WireGuard...
Feb 25 12:27:19 pi systemd[1]: wgui.service: Deactivated successfully.
Feb 25 12:27:19 pi systemd[1]: Finished wgui.service - Restart WireGuard.

wireguard-ui starten und konfigurieren

cd /opt/wireguard-ui
./wireguard-ui

Wireguard UI
App Version : v0.6.2
Git Commit : 99104e429557a4cd6bda4b0c2550a656cdfe9bb7
Git Ref : refs/tags/v0.6.2
Build Time : 02-25-2024 11:42:42
Git Repo : https://github.com/ngoduykhanh/wireguard-ui
Authentication : true
Bind address : 0.0.0.0:5000
Email from :
Email from name : WireGuard UI
Custom wg.conf :
Base path : /
Subnet ranges :
Valid subnet ranges:
⇨ http server started on [::]:5000

Das Webinterface kann jetzt im Browser aufgerufen werden. (http://ip-adresse:5000, Benutzer: admin, Passwort: admin)
Sollte ein login nicht möglich sein, wireguard-ui beenden nun nochmal neu starten.

Server konfigurieren.

Die beiden Up- und Down Scripte. Ggf. den Namen des Interfaces anpassen. Bei mir ist es eth0.

# Post Up Script
iptables -A FORWARD -i %i -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

# Post Down Script
iptables -D FORWARD -i %i -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE

Clients erstellen.

Damit das Webinterface automatisch beim Start geladen wird, erstelle ich mir noch eine /etc/systemd/system/wgui-webui.service

[Unit]
After=syslog.target network-online.target

[Service]
WorkingDirectory=/opt/wireguard-ui/
ExecStart=/opt/wireguard-ui/wireguard-ui
;if you want to run wireguard-ui on port 80
;ExecStart=/opt/wireguard-ui/wireguard-ui --bind-address="0.0.0.0:80"
PrivateTmp=yes
Restart=always

[Install]
WantedBy=multi-user.target

Service aktivieren.

systemctl enable wgui-webui.service

System neustarten und kontrollieren ob wireguard-ui läuft.

systemctl status wgui-webui.service

● wgui-webui.service
     Loaded: loaded (/etc/systemd/system/wgui-webui.service; enabled; preset: enabled)
     Active: active (running) since Sun 2024-02-25 15:19:27 CET; 3h 33min ago
   Main PID: 457 (wireguard-ui)
      Tasks: 5 (limit: 19014)
     Memory: 6.3M
        CPU: 7.435s
     CGroup: /system.slice/wgui-webui.service
             └─457 /opt/wireguard-ui/wireguard-ui --bind-address=0.0.0.0:80

Feb 25 15:19:27 wireguard wireguard-ui[457]: Authentication        : true
Feb 25 15:19:27 wireguard wireguard-ui[457]: Bind address          : 0.0.0.0:5000
--- SNIP ---

Datenverzeichnis

Nach dem ersten Start der wireguard-ui binary, wird das Verzeichnis /opt/wireguard-ui/db erstellt. Dort wird die Konfiguration gespeichert.

/opt/wireguard-ui# tree db/
db/
├── clients
│   ├── cndi115on21cff1p47fg.json
│   ├── cndi135on21cff1p47g0.json
│   └── cndi175on21cff1p47gg.json
├── server
│   ├── global_settings.json
│   ├── hashes.json
│   ├── interfaces.json
│   └── keypair.json
├── users
│   └── admin.json
└── wake_on_lan_hosts

IPv4 forwarding aktivieren

Auf dem WireGuard Server muss in der /etc/sysctl.conf IPv4 forwarding aktiviert werden.

sysctl -w net.ipv4.ip_forward=1
echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf

Firewall Konfiguration

Der UDP Port 51820 muss an den internen VPN Server weitergeleitet werden. (hier für meinen MikroTik Router)

/ip firewall filter
add action=accept chain=forward dst-port=51820 protocol=udp

/ip firewall nat
add action=dst-nat chain=dstnat dst-port=51820 in-interface=wan protocol=udp to-addresses=192.168.150.200 to-ports=51820

Client

Auf dem Smartphone kann der Tunnel jetzt über den QR-Code importiert werden und sollte sich mit unserem Server verbinden.

Schreibe einen Kommentar