WireGuard VPN Server mit Web Interface einrichten
Wer aktuell OpenVPN und IPsec als VPN Software einsetzt und sich schon immer mal mit WireGuard auseinander setzen wollte, dem helfe ich mit diesem Tutorial auf die Sprünge.
WireGuard ist eine freie Software zum Aufbau eines virtuellen privaten Netzwerkes (VPN) über eine verschlüsselte Verbindung.
WireGuard ist im Aufbau wesentlich einfacher gestaltet als beispielsweise OpenVPN und verwendet nur ein eingeschränktes Set an Algorithmen. So wird unter anderem für den Schlüsselaustausch das Verfahren Curve25519 und für die eigentliche Verschlüsselung ChaCha20 verwendet.
Vorteile von WireGuard zusammengefasst:
- schneller, auch auf älteren und schwächeren Systemen
- sicherer, dank neuster Verschlüsselungstechnologie
- wirklich einfach einzurichten dank wireguard-ui
Was wird für dieses Tutorial benötigt?
- Server: Debian 11 amd64 (es werden weitere Betriebssysteme unterstützt, siehe wireguard-ui release Seite)
- Client: Windows 10 und Android 10 (es werden viele weitere Betriebssysteme unterstützt)
- Firewall: offener Port 51820/udp
Ziel in diesem Tutorial?
- Ein VPN Netzwerk mit Server und Client innerhalb weniger Minuten einrichten
- Ein Web Interface zur einfachen Einrichtung von Server und Clients
- Mobile Clients einfach per QR Code einrichten
Punkt 1: Debian Pakete installieren
Quelle: https://www.wireguard.com/install/
Wir installieren alle nötigen Pakete und wechseln den Ordner.
1 2 | apt update && apt install -y wireguard curl tar cd /etc/wireguard |
Punkt 2: Firewall Port öffnen
Der Port 51820 für das UDP Protokoll muss auf dem Server erreichbar sein. Beispielsweise so zu öffnen:
1 | ufw allow 51820/udp |
Punkt 3: IP Forwarding aktivieren
Das IP Forwarding sorgt dafür, dass alle Pakete der WireGuard-Schnittstelle weitergeleitet werden.
1 2 3 | echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf echo "net.ipv6.conf.all.forwarding=1" >> /etc/sysctl.conf sysctl -p |
Punkt 4: WireGuard UI Startscript erstellen
Dieses Startscript wird von der Systemd Service Unit (Punkt 5) verwendet um WureGuard UI zu staren und die Datenbank im Ordner /etc/wireguard/db/
abzulegen.
1 2 3 4 5 6 | cat <<EOF > /etc/wireguard/start-wgui.sh #!/bin/bash cd /etc/wireguard ./wireguard-ui -bind-address 0.0.0.0:5000 EOF |
ACHTUNG: Die -bind-address 0.0.0.0:5000 sollte aus Sicherheitsgründen, sobald der erste Tunnel steht, gegen die WireGuard Server IP-Adresse 10.252.1.0 ausgetauscht werden!
Wir machen das Script ausführbar.
1 | chmod +x start-wgui.sh |
Punkt 5: WireGuard UI
Quelle: https://github.com/ngoduykhanh/wireguard-ui
Zuerst legen wir die Systemd Service Unit an.
1 2 3 4 5 6 7 8 9 10 11 | cat <<EOF > /etc/systemd/system/wgui-web.service [Unit] Description=WireGuard UI [Service] Type=simple ExecStart=/etc/wireguard/start-wgui.sh [Install] WantedBy=multi-user.target EOF |
Nun legen wir das WireGuard UI Download und Update Script an.
1 2 3 4 5 6 7 8 9 10 11 12 13 | cat <<EOF > /etc/wireguard/update.sh #!/bin/bash VER=\$(curl -sI https://github.com/ngoduykhanh/wireguard-ui/releases/latest | grep "location:" | cut -d "/" -f8 | tr -d '\r') echo "downloading wireguard-ui \$VER" curl -sL "https://github.com/ngoduykhanh/wireguard-ui/releases/download/\$VER/wireguard-ui-\$VER-linux-amd64.tar.gz" -o wireguard-ui-\$VER-linux-amd64.tar.gz echo -n "extracting "; tar xvf wireguard-ui-\$VER-linux-amd64.tar.gz echo "restarting wgui-web.service" systemctl restart wgui-web.service EOF |
Jetzt können wir das WireGuard UI Update Script das erste Mal ausführen. Der Download startet automatisch und das Web Interface von WireGuard wird gestartet.
1 2 | chmod +x /etc/wireguard/update.sh cd /etc/wireguard; ./update.sh |
Punkt 6: WireGuard Konfigurationsdatei von Systemd überwachen lassen
wg0.conf
zu überwachen und den Service automatisch bei Änderung neustarten zu lassen.1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | cat <<EOF > /etc/systemd/system/wgui.service [Unit] Description=Restart WireGuard After=network.target [Service] Type=oneshot ExecStart=/bin/systemctl restart wg-quick@wg0.service [Install] RequiredBy=wgui.path EOF cat <<EOF > /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 EOF |
Punkt 7: Dienste aktivieren und starten
1 2 3 | touch /etc/wireguard/wg0.conf systemctl enable wgui.{path,service} wg-quick@wg0.service wgui-web.service systemctl start wgui.{path,service} |
Punkt 8: WireGuard UI öffnen und einstellen
- Das WireGuard UI öffnen wir nun im Webbrowser:
http://<PUBLIC IP>:5000
- Melden uns als Benutzer
admin
und dem Passwortadmin
an - Klicken links im Menü auf Global Settings
- Wir prüfen zuerst ob die Endpoint Address stimmt (kann eine Public IP oder Hostname sein)
- Nun löschen wir 1.1.1.1 unter DNS Servers
- Fügen diese beiden dnsforge.de DNS Server hinzu: 176.9.93.198, 176.9.1.117
- Drücken Save
- Im Menü gehen wir nun auf Wireguard Server
- Damit die VPN Clients auch ins Internet können, tragen wir bei Post Up Script diese Zeile ein (anstelle eth0 trage dein öffentliches Interface vom Server ein):
iptables -A FORWARD -i %i -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
- Bei Post Down Script (anstelle eth0 trage dein öffentliches Interface vom Server ein):
iptables -D FORWARD -i %i -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
- Save anklicken
- Im Menü auf Wireguard Clients gehen
- Oben rechts auf New Client klicken
- Einen Namen eingeben
- Email kann auch leer bleiben
- IP Allocation ist die IP, die der Client erhält (WireGuard UI zählt die IP automatisch hoch für jeden neuen Client)
- Allowed IPs ist das Netzwerk, welches der Client über den VPN Tunnel erreichen darf. Dort tragt ihr zusätzlich 10.252.1.0/24 ein. Default ist das komplette Internet 0.0.0.0/0 und somit auch das Routing des gesamten Traffics durch den Tunnel hinterlegt. Ihr könnt dort auch nur eurer VPN Netzwerk eintragen und der normale Internet Traffic geht dann nicht mehr durch den Tunnel.
- Mit Use server DNS werden die WireGuard Nameserver im Client verwendet
- Auf Submit drücken
- Um alles zu aktivieren drücken wir oben rechts auf Apply Config dann auf Apply
Der WireGuard Server ist fertig konfiguriert und eine erste Client-Konfiguration wurde erstellt.
Punkt 9: Android App installieren und einrichten
- Wir installieren uns aus dem F-Droid oder Google Play Store die WireGuard App (gibt es auch für iOS):
https://f-droid.org/en/packages/com.wireguard.android
https://play.google.com/store/apps/details?id=com.wireguard.android - Öffnen die App und klicken unten rechts auf das Plus Zeichen
- Nun drücken wir auf VON QR_CODE SCANNEN und lesen den QR Code des erstellten Clients ein
- Der Tunnel erhält nun einen Namen
- Wir klicken auf den Tunnel und aktivieren diesen am Schalter
- Der Tunnel ist erfolgreich aufgebaut wenn ihr unter Transfer ein paar gesendete Daten seht
- Im Webinterface unter dem Menüpunkt Status seht ihr die aktive Verbindung
Punkt 10: Windows Client einrichten
Der Windows Client lässt sich hier herunterladen: https://www.wireguard.com/install/ (auch für andere Betriebssysteme werdet ihr dort fündig).
- Im WireGuard Webinterface auf Download klicken
- Startet WireGuard
- Klickt auf Tunnel hinzufügen und wählt eure test.conf Datei aus
- Nun klicken wir auf Aktivieren
- Der Tunnel ist nun Aktiv und es werden Daten übermittelt
- Automatisch verbinden bei Windows Start erreichen wir mit diesem Befehl – Eingabeaufforderung als Administrator öffnen (einmalig ausführen reicht!):
wireguard.exe /installtunnelservice "C:\Program Files\WireGuard\Data\Configurations\test.conf.dpapi"
Punkt 11: Absichern
Auf dem Server bearbeiten wir nun unser Startscript und setzen folgende bind-address
.
1 2 3 4 | #!/bin/bash cd /etc/wireguard ./wireguard-ui -bind-address 10.252.1.0:5000 |
Das default Passwort admin ändern wir in dieser Datei ab.
1 2 3 4 | { "username": "admin", "password": "<neues passwort>" } |
Nun starten wir den WireGuard UI Dienst neu.
1 | systemctl restart wgui-web.service |
Ab sofort ist euer Webinterface unter http://10.252.1.0:5000 mit eurem neuen Passwort erreichbar.
Euer adminForge Team
Das Betreiben der Dienste, Webseite und Server machen wir gerne, kostet aber leider auch Geld. Unterstütze unsere Arbeit mit einer Spende. |
hey, thx fuer das tut
leider geht bei mir nur die connection zum srv direkt, weder domains noch andere ip´s kann ich anpingen:
packete gehen auch durch, nur funzt der dns scheinbar nicht richtig, hab deine beiden dns forge bzw. 1.1.1.1 drinn… selbe fehlerbild!
event hast du ein denkanstoss fuer mich
greetz
mhh hast du denn
net.ipv4.ip_forward=1
aktiviert auf dem Server?Siehst du Traffic durch die FORWARD Chain laufen?
Ansonsten versucht einmal deine iptables zu leeren und bei 0 zu beginnen rein für WG.
hey,
yepp… hab gestern ein port scanner drueber laufen lassen und siehe da der port 51820 scheint nicht offen zu sein.
event steckt hier schon der fehler:
sudo iptables -A INPUT -p udp -m udp --dport 51820 -j ACCEPT
sudo iptables -A OUTPUT -p udp -m udp --dport 51820 -j ACCEPT
scheinbar mach ich hier was falsch.
ein paar packete gehen durch
greetz
deine INPUT Policy steht doch auf ACCEPT, dann müsstest du keine Regel hinzufügen.
OUTPUT ist irrelevant da die chain auch auf ACCEPT steht.
am besten leerst du einmal alles und beginnst von neu:
ok, also sollte der befehl schon passen:
sudo iptables -A INPUT -p udp -m udp --dport 51820 -j ACCEPT
hatte gestern nacht noch kurz den output befehl probiert
sollte der befehl -D nicht schon ausreichen:
sudo iptables -D INPUT -p udp -m udp --dport 51820 -j ACCEPT
sudo iptables -D OUTPUT -p udp -m udp --dport 51820 -j ACCEPT
jetzt sind beide regeln wieder raus, quasi nur die docker regeln vorhanden
und das fehlerbild ist unveraendert, kann nur die beiden ip bereiche anpingen, als ob er glatt die regel ignoriert!
meld mich nachm essen nochmal
greetz