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?

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.

Punkt 2: Firewall Port öffnen

Der Port 51820 für das UDP Protokoll muss auf dem Server erreichbar sein. Beispielsweise so zu öffnen:

Punkt 3: IP Forwarding aktivieren

Das IP Forwarding sorgt dafür, dass alle Pakete der WireGuard-Schnittstelle weitergeleitet werden.

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.

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.

Punkt 5: WireGuard UI

Quelle: https://github.com/ngoduykhanh/wireguard-ui

Zuerst legen wir die Systemd Service Unit an.

Nun legen wir das WireGuard UI Download und Update Script an.

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.

Punkt 6: WireGuard Konfigurationsdatei von Systemd überwachen lassen

Die folgenden beiden Systemd Units erstellen wir um die WireGuard Konfiguration wg0.conf zu überwachen und den Service automatisch bei Änderung neustarten zu lassen.

Punkt 7: Dienste aktivieren und starten

Punkt 8: WireGuard UI öffnen und einstellen

  1. Das WireGuard UI öffnen wir nun im Webbrowser: http://<PUBLIC IP>:5000
  2. Melden uns als Benutzer admin und dem Passwort admin an
  3. Klicken links im Menü auf Global Settings
  4. Wir prüfen zuerst ob die Endpoint Address stimmt (kann eine Public IP oder Hostname sein)
  5. Nun löschen wir 1.1.1.1 unter DNS Servers
  6. Fügen diese beiden dnsforge.de DNS Server hinzu: 176.9.93.198, 176.9.1.117
  7. Drücken Save
  8. Im Menü gehen wir nun auf Wireguard Server

  9. 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
  10. 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
  11. Save anklicken
  12. Im Menü auf Wireguard Clients gehen
  13. Oben rechts auf New Client klicken
  14. Einen Namen eingeben
  15. Email kann auch leer bleiben
  16. IP Allocation ist die IP, die der Client erhält (WireGuard UI zählt die IP automatisch hoch für jeden neuen Client)
  17. 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.
  18. Mit Use server DNS werden die WireGuard Nameserver im Client verwendet
  19. Auf Submit drücken
  20. 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

  1. 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
  2. Öffnen die App und klicken unten rechts auf das Plus Zeichen
  3. Nun drücken wir auf VON QR_CODE SCANNEN und lesen den QR Code des erstellten Clients ein
  4. Der Tunnel erhält nun einen Namen
  5. Wir klicken auf den Tunnel und aktivieren diesen am Schalter
  6. Der Tunnel ist erfolgreich aufgebaut wenn ihr unter Transfer ein paar gesendete Daten seht
  7. 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).

  1. Im WireGuard Webinterface auf Download klicken
  2. Startet WireGuard
  3. Klickt auf Tunnel hinzufügen und wählt eure test.conf Datei aus
  4. Nun klicken wir auf Aktivieren
  5. Der Tunnel ist nun Aktiv und es werden Daten übermittelt
  6. 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.

Das default Passwort admin ändern wir in dieser Datei ab.

Nun starten wir den WireGuard UI Dienst neu.

Ab sofort ist euer Webinterface unter http://10.252.1.0:5000 mit eurem neuen Passwort erreichbar.

 

Euer adminForge Team

UnterstützenDas Betreiben der Dienste, Webseite und Server machen wir gerne, kostet aber leider auch Geld.
Unterstütze unsere Arbeit mit einer Spende.
13

dominion

Linux Systemadministrator

Das könnte dich auch interessieren …

Kommentare

  1. Avatar for huuu huuu says:

    hey, thx fuer das tut :slight_smile:

    leider geht bei mir nur die connection zum srv direkt, weder domains noch andere ip´s kann ich anpingen:

    mit aktiver vpn verbindung:
    
    "server addi" ping xx.xx.xx.xx
    
    Ping wird ausgeführt für xx.xx.xx.xx mit 32 Bytes Daten:
    Antwort von xx.xx.xx.xx: Bytes=32 Zeit=54ms TTL=64
    Antwort von xx.xx.xx.xx: Bytes=32 Zeit=37ms TTL=64
    Antwort von xx.xx.xx.xx: Bytes=32 Zeit=38ms TTL=64
    Antwort von xx.xx.xx.xx: Bytes=32 Zeit=40ms TTL=64
    
    Ping-Statistik für xx.xx.xx.xx:
        Pakete: Gesendet = 4, Empfangen = 4, Verloren = 0
        (0% Verlust),
    Ca. Zeitangaben in Millisek.:
        Minimum = 37ms, Maximum = 54ms, Mittelwert = 42ms
    
    ping 10.252.1.0
    
    Ping wird ausgeführt für 10.252.1.0 mit 32 Bytes Daten:
    Antwort von 10.252.1.0: Bytes=32 Zeit=78ms TTL=64
    Antwort von 10.252.1.0: Bytes=32 Zeit=41ms TTL=64
    Antwort von 10.252.1.0: Bytes=32 Zeit=37ms TTL=64
    Antwort von 10.252.1.0: Bytes=32 Zeit=39ms TTL=64
    
    Ping-Statistik für 10.252.1.0:
        Pakete: Gesendet = 4, Empfangen = 4, Verloren = 0
        (0% Verlust),
    Ca. Zeitangaben in Millisek.:
        Minimum = 37ms, Maximum = 78ms, Mittelwert = 48ms
    
    
    wireguard webinterface:
    
    status:
    Name	Email	Public Key	ReceiveBytes	TransmitBytes	Connected (Approximation)	LastHandshakeTime
    0	hguard		G4aPZE4=	96364	501252	true	2021-12-12 22:22:16.348955517 +0100 CET
    
    Post Up Script:
    iptables -A FORWARD -i %i -j ACCEPT; iptables -t nat -A POSTROUTING -o enp8s0 -j MASQUERADE
    
    Post Down Script:
    iptables -D FORWARD -i %i -j ACCEPT; iptables -t nat -D POSTROUTING -o enp8s0 -j MASQUERADE
    
    ssh: wg
    interface: wg0
      public key: lsA0gyI=
      private key: (hidden)
      listening port: 51820
    
    peer: 0rkZ32E4=
      preshared key: (hidden)
      endpoint: xx.xx.xx.xx:7126
      allowed ips: 10.252.1.1/32
      latest handshake: 20 seconds ago
      transfer: 135.14 KiB received, 45.37 KiB sent
    
    ip a:
    enp8s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
        link/ether xx:xx:xx:xx:xx brd ff:ff:ff:ff:ff:ff
        inet xx.xx.xx.xx/26 brd xx:xx:xx:xx scope global enp8s0
    
    hab unter debian 11 statt ufw iptables in use:
    
    sudo iptables -L -v
    Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
     pkts bytes target     prot opt in     out     source               destination
        0     0 DROP       all  --  any    any     host48-45-237-212.serverdedicati.aruba.it  anywhere
        0     0 DROP       all  --  any    any     fra07s28-in-f227.1e100.net  anywhere
       18  3168 ACCEPT     udp  --  any    any     anywhere             anywhere             udp dpt:51820
    
    

    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 :scream: :upside_down_face:

    greetz

  2. mhh hast du denn net.ipv4.ip_forward=1 aktiviert auf dem Server?

    Siehst du Traffic durch die FORWARD Chain laufen?

    # iptables -vnL FORWARD
    Chain FORWARD (policy ACCEPT 4216K packets, 5091M bytes)
     pkts bytes target     prot opt in     out     source               destination
    2756K 1410M ACCEPT     all  --  wg0    *       0.0.0.0/0            0.0.0.0/0
    

    Ansonsten versucht einmal deine iptables zu leeren und bei 0 zu beginnen rein für WG.

  3. Avatar for huuu huuu says:

    hey,

    Chain FORWARD (policy DROP 5175 packets, 458K bytes)
     pkts bytes target     prot opt in     out     source               destination
     1089 67555 ACCEPT     all  --  wg0    *       0.0.0.0/0            0.0.0.0/0
    

    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.

    Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
     pkts bytes target     prot opt in     out     source               destination
     7641 1215K ACCEPT     udp  --  any    any     anywhere             anywhere             udp dpt:51820
    
    Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
     pkts bytes target     prot opt in     out     source               destination
        3   999 ACCEPT     udp  --  any    any     anywhere             anywhere             udp dpt:51820
    

    ein paar packete gehen durch

    greetz

  4. 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:

    sudo iptables -P INPUT ACCEPT
    sudo iptables -P FORWARD ACCEPT
    sudo iptables -P OUTPUT ACCEPT
    
    sudo iptables -t nat -F
    sudo iptables -t mangle -F
    sudo iptables -F
    sudo iptables -X
    
  5. Avatar for huuu huuu says:

    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

    sudo iptables -L -v
    Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
     pkts bytes target     prot opt in     out     source               destination
        0     0 DROP       all  --  any    any     host48-45-237-212.serverdedicati.aruba.it  anywhere
        0     0 DROP       all  --  any    any     muc11s11-in-f3.1e100.net  anywhere
     7641 1215K ACCEPT     udp  --  any    any     anywhere             anywhere             udp dpt:51820
    
    Chain FORWARD (policy DROP 5425 packets, 482K bytes)
     pkts bytes target     prot opt in     out     source               destination
    8701K 7488M DOCKER-USER  all  --  any    any     anywhere             anywhere
    8701K 7488M DOCKER-ISOLATION-STAGE-1  all  --  any    any     anywhere             anywhere
    5214K 5045M ACCEPT     all  --  any    br-ab8dff2eebeb  anywhere             anywhere             ctstate RELATED,ESTABLISHED
    13884  832K DOCKER     all  --  any    br-ab8dff2eebeb  anywhere             anywhere
    3463K 2441M ACCEPT     all  --  br-ab8dff2eebeb !br-ab8dff2eebeb  anywhere             anywhere
    13603  816K ACCEPT     all  --  br-ab8dff2eebeb br-ab8dff2eebeb  anywhere             anywhere
        0     0 ACCEPT     all  --  any    docker0  anywhere             anywhere             ctstate RELATED,ESTABLISHED
        0     0 DOCKER     all  --  any    docker0  anywhere             anywhere
        0     0 ACCEPT     all  --  docker0 !docker0  anywhere             anywhere
        0     0 ACCEPT     all  --  docker0 docker0  anywhere             anywhere
      225 13808 ACCEPT     all  --  wg0    any     anywhere             anywhere
    
    Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
     pkts bytes target     prot opt in     out     source               destination
        3   999 ACCEPT     udp  --  any    any     anywhere             anywhere             udp dpt:51820
    
    Chain DOCKER (2 references)
     pkts bytes target     prot opt in     out     source               destination
        0     0 ACCEPT     tcp  --  !br-ab8dff2eebeb br-ab8dff2eebeb  anywhere             172.23.0.2           tcp dpt:https
        0     0 ACCEPT     tcp  --  !br-ab8dff2eebeb br-ab8dff2eebeb  anywhere             172.23.0.2           tcp dpt:http
       18  2372 ACCEPT     udp  --  !br-ab8dff2eebeb br-ab8dff2eebeb  anywhere             172.23.0.4           udp dpt:10000
       11   512 ACCEPT     tcp  --  !br-ab8dff2eebeb br-ab8dff2eebeb  anywhere             172.23.0.4           tcp dpt:4443
      252 13352 ACCEPT     tcp  --  !br-ab8dff2eebeb br-ab8dff2eebeb  anywhere             172.23.0.9           tcp dpt:3000
    
    Chain DOCKER-ISOLATION-STAGE-1 (1 references)
     pkts bytes target     prot opt in     out     source               destination
    3463K 2441M DOCKER-ISOLATION-STAGE-2  all  --  br-ab8dff2eebeb !br-ab8dff2eebeb  anywhere             anywhere
        0     0 DOCKER-ISOLATION-STAGE-2  all  --  docker0 !docker0  anywhere             anywhere
     196M  124G RETURN     all  --  any    any     anywhere             anywhere
    
    Chain DOCKER-ISOLATION-STAGE-2 (2 references)
     pkts bytes target     prot opt in     out     source               destination
        0     0 DROP       all  --  any    br-ab8dff2eebeb  anywhere             anywhere
        0     0 DROP       all  --  any    docker0  anywhere             anywhere
      93M   47G RETURN     all  --  any    any     anywhere             anywhere
    
    Chain DOCKER-USER (1 references)
     pkts bytes target     prot opt in     out     source               destination
     196M  124G RETURN     all  --  any    any     anywhere             anywhere
    

    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

    
    sudo iptables -L -v
    Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
     pkts bytes target     prot opt in     out     source               destination
        0     0 DROP       all  --  any    any     host48-45-237-212.serverdedicati.aruba.it  anywhere
        0     0 DROP       all  --  any    any     muc11s11-in-f3.1e100.net  anywhere
    
    Chain FORWARD (policy DROP 5425 packets, 482K bytes)
     pkts bytes target     prot opt in     out     source               destination
    8790K 7612M DOCKER-USER  all  --  any    any     anywhere             anywhere
    8790K 7612M DOCKER-ISOLATION-STAGE-1  all  --  any    any     anywhere             anywhere
    5273K 5103M ACCEPT     all  --  any    br-ab8dff2eebeb  anywhere             anywhere             ctstate RELATED,ESTABLISHED
    14277  856K DOCKER     all  --  any    br-ab8dff2eebeb  anywhere             anywhere
    3493K 2508M ACCEPT     all  --  br-ab8dff2eebeb !br-ab8dff2eebeb  anywhere             anywhere
    13984  839K ACCEPT     all  --  br-ab8dff2eebeb br-ab8dff2eebeb  anywhere             anywhere
        0     0 ACCEPT     all  --  any    docker0  anywhere             anywhere             ctstate RELATED,ESTABLISHED
        0     0 DOCKER     all  --  any    docker0  anywhere             anywhere
        0     0 ACCEPT     all  --  docker0 !docker0  anywhere             anywhere
        0     0 ACCEPT     all  --  docker0 docker0  anywhere             anywhere
      225 13808 ACCEPT     all  --  wg0    any     anywhere             anywhere
    
    Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
     pkts bytes target     prot opt in     out     source               destination
    
    Chain DOCKER (2 references)
     pkts bytes target     prot opt in     out     source               destination
        0     0 ACCEPT     tcp  --  !br-ab8dff2eebeb br-ab8dff2eebeb  anywhere             172.23.0.2           tcp dpt:https
        0     0 ACCEPT     tcp  --  !br-ab8dff2eebeb br-ab8dff2eebeb  anywhere             172.23.0.2           tcp dpt:http
       18  2372 ACCEPT     udp  --  !br-ab8dff2eebeb br-ab8dff2eebeb  anywhere             172.23.0.4           udp dpt:10000
       11   512 ACCEPT     tcp  --  !br-ab8dff2eebeb br-ab8dff2eebeb  anywhere             172.23.0.4           tcp dpt:4443
      264 13976 ACCEPT     tcp  --  !br-ab8dff2eebeb br-ab8dff2eebeb  anywhere             172.23.0.9           tcp dpt:3000
    
    Chain DOCKER-ISOLATION-STAGE-1 (1 references)
     pkts bytes target     prot opt in     out     source               destination
    3493K 2508M DOCKER-ISOLATION-STAGE-2  all  --  br-ab8dff2eebeb !br-ab8dff2eebeb  anywhere             anywhere
        0     0 DOCKER-ISOLATION-STAGE-2  all  --  docker0 !docker0  anywhere             anywhere
     197M  124G RETURN     all  --  any    any     anywhere             anywhere
    
    Chain DOCKER-ISOLATION-STAGE-2 (2 references)
     pkts bytes target     prot opt in     out     source               destination
        0     0 DROP       all  --  any    br-ab8dff2eebeb  anywhere             anywhere
        0     0 DROP       all  --  any    docker0  anywhere             anywhere
      93M   47G RETURN     all  --  any    any     anywhere             anywhere
    
    Chain DOCKER-USER (1 references)
     pkts bytes target     prot opt in     out     source               destination
     197M  124G RETURN     all  --  any    any     anywhere             anywhere
    

    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 :slight_smile:

    greetz

Setze die Diskussion fort unter community.adminforge.de

43 mehr antworten

Teilnehmer

Avatar for huuu Avatar for dominion Avatar for wahoonie76 Avatar for markush Avatar for thhunder Avatar for wofei Avatar for TheNight_Fighter Avatar for patrickfend Avatar for fred_stu Avatar for mrwsl

Historischer Kommentar Archiv

51 Antworten

  1. DANIEL sagt:

    Is Normal?

    /etc/wireguard# cd /etc/wireguard; ./update.sh
    ./update.sh: line 3: syntax error near unexpected token ('
    ./update.sh: line 3:
    VER=\$(curl -sI https://github.com/ngoduykhanh/wireguard-ui/releases/latest | grep „location:“ | cut -d „/“ -f8 | tr -d ‚\r‘)‘

  2. Johannes sagt:

    Hallo,

    erstmal Danke für das ausführliche Tutorial! Ich habe WireGuard auf einem Plesk-Server installiert und habe nun mächtig Probleme mit der Firewall von Plesk, denn mit aktivierter Firewall komme ich mit einem Client nicht ins Internet. Ist die Firewall deaktiviert, klappts. Ich bin gerade echt an verzweifeln. Du weißt nicht zufällig woran das liegen kann?

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert