Benutzer-Werkzeuge

Webseiten-Werkzeuge


vpn:ubuntu_lts_wireguard_wireguard-ui_fortigate_ein_sicheres_gespann

Dies ist eine alte Version des Dokuments!


Ubuntu LTS + Wireguard + Wireguard-UI + Fortigate → Ein "sicheres" Gespann

Du möchtest dich gerne für unsere Hilfe erkenntlich zeigen 8-o. Gerne. Wir bedanken uns bei dir für deine Spende! 🙏


Zum frei verfügbaren Apt-Repository
GITLAB:

Dieses HowTo befindet sich noch in der Fertigstellung!

Einleitung

Da ich selbst Fortigate verwende, SSL-VPN mehr als nur unsicher ist, und IPSEC auf Linuxclientseite einfach unkonfgurierbar ist, suchte ich nach einer Lösung die einfach bedienbar und einen aktuellen Sicherheitsstandard aufweist. Wireguard erfüllte diese Dinge zum Zeitpunkt dieses Artikels. Um das ganze noch eleganter zu gestalten, verwenden wir für unser Setup auch zusätzlich Wireguard-UI über Docker. Das besonder ist das Wireguard-UI die Möglichkeit bietet das lokale Wireguard Binary zu verwenden. In Verbindung mit UbuntuPro ist das Wireguard Binary damit auch immer am aktuellsten Stand → es wird direkt von Canonical bereit gestellt. UbuntuPro ist für Privatanwender kostenlos. Zusätzlich installieren wir in diesem HowTo auch einen Nginx-Webserver als Proxy mit TLS-Verschlüsselung, damit das Passwort beim Login im Webinterface auch verschlüsselt übertragen wird.

Voraussetzungen

  • Ubuntu 24.04 LTS in einer bevorzugten Form. Ich verwende es hier auf Proxmox VE als Qemu/KVM.
  • FQDN unseres Server für das HowTo: vpn.supertux.lan
  • Optional: Fortigate → Natürlich es geht auch ohne ;)

Installation und Konfiguration

Logge dich auf deinem Ubuntu Server per SSH ein und installiere folgende Pakete:

apt install nginx wireguard wireguard-tools docker-compose-v2 zsh

Als nächstes erstellen wir unser Compose-File auf Grundlange von hier. Auskommentierte Optionen können bei Bedarf einkommentiert und verwendet werden. Zusätzliche Variablen können von der Dokumenation hinzugefügt werden.

Das folgende File speichere auf einen Ort deiner Wahl ab. Z.B. /docker/compose-files

docker-compose.yml
services:
  wireguard-ui:
    image: ngoduykhanh/wireguard-ui:latest
    restart: always
    container_name: wireguard-ui
    cap_add:
      - NET_ADMIN
    # required to show active clients. with this set, you don't need to expose the ui port (5000) anymore
    network_mode: host
    environment:
     # - SENDGRID_API_KEY
     # - EMAIL_FROM_ADDRESS
     # - EMAIL_FROM_NAME
     # - SESSION_SECRET
      - WGUI_USERNAME=admin
      - WGUI_PASSWORD=admin
      - WGUI_DNS=5.1.66.255,185.150.99.255
     # - WG_CONF_TEMPLATE
      - WGUI_MANAGE_START=false
      - WGUI_MANAGE_RESTART=true
     # - SMTP_HOSTNAME
     # - SMTP_PORT=465
     # - SMTP_USERNAME
     # - SMTP_PASSWORD
     # - SMTP_AUTH_TYPE=LOGIN
     # - SMTP_ENCRYPTION=SSLTLS
      - BIND_ADDRESS=127.0.0.1:5000
    logging:
      driver: json-file
      options:
        max-size: 50m
    volumes:
      - ./db:/app/db
      - /etc/wireguard:/etc/wireguard

Nun kann der Container gestartet werden:

docker compose up -d

Nach dem Start kannst den laufenden Compose wie folgt anzeigen:

docker compose ls

WireGuard-UI kümmert sich nur um die Generierung der Konfiguration. Du kannst systemd verwenden, um die Änderungen zu überwachen und den Dienst neu zu starten:

cd /etc/systemd/system/
cat << EOF > 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
EOF

Und:

cd /etc/systemd/system/
cat << EOF > wgui.path
[Unit]
Description=Watch /etc/wireguard/wg0.conf for changes

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

[Install]
WantedBy=multi-user.target
EOF

Und den Service aktivieren:

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

Damit wäre die Installation von Wireguard selbst, abgeschlossen. Als nächsten konfigurieren wir Nginx.

Nginx Konfiguration

Ein default Zertifikat ist bei Nginx nicht enhalten. Daher bist du für die Bereitstellung eines solchen selbst verantwortlich. Sofern du im Netzwerk einen Nginx Proxy Manager bereits verwendest, kannst auch auf diesen zurück greifen. In diesem HowTo gehe auf die manuelle Konfiguration lokal auf dem Server ein.

Eine lokale eigene CA + Zertfikat kannst du sehr einfach mit XCA GUI generieren. XCA ist in den Ubuntuquellen vorhanden und kann bequem über das Paketmanagement auf einem Desktoprechner nach installiert werden. Ich empfehle dir mit XCA gleich ein Wildcard Zertifikat für deine Domäne zu generieren. Damit kannst du das Zertifikat auf all deine Server im Netzwerk anwenden die diese Domäne verwenden.

Let's Encrypt wäre eine alternative Möglichkeit.

Nachdem du Zertifikat + CA + Key auf dem Ubuntu-Server in einem Verzeichnis bereits zur Verwendung abgelegt hast, fahren wir mit der Konfiguration fort. Als nächster erstellen wir die Config für unseren Vhost:

nano /etc/nginx/sites-available/wireguard
map $http_upgrade $connection_upgrade {
        default upgrade;
        ''      close;
}
 
upstream vpn.supertux.lan {
        server 127.0.0.1:5000;
}
 
server {
        listen 80;
        server_name vpn.supertux.lan;
        access_log /var/log/nginx/vpn_access.log;
        error_log /var/log/nginx/vpn_error.log;
        return 301 https://vpn.supertux.lan$request_uri;
 
}
 
server {
    listen 443 ssl;
    server_name vpn.supertux.lan;
    access_log /var/log/nginx/vpn_access.log;
    error_log /var/log/nginx/vpn_error.log;
 
    client_max_body_size 100M;
 
    # SSL
    ssl_certificate /docker/appdata/certs/wildcard-supertux-apache.crt;
    ssl_certificate_key /docker/appdata/certs/wildcard-supertux-apache.key;
    ssl_trusted_certificate /usr/local/share/ca-certificates/wildcard-supertux-root-ca.crt;
 
 
    ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;    
    add_header Strict-Transport-Security "max-age=63072000" always;
 
    ssl_session_timeout 1d;
    ssl_session_cache shared:MozSSL:10m;  # about 40000 sessions
    ssl_session_tickets off;
 
        location / {
        proxy_set_header Host $http_host;
        proxy_pass http://vpn.supertux.lan;
        proxy_set_header X-Forwarded-Proto $scheme;
        }
 
 
 
        location /websockify {
                proxy_pass http://vpn.supertux.lan;
                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;
 
                 }
 
 
        }

Stelle sicher das deine Zertifikate in den richtigen Verzeichnissen liegen:

mkdir -p /docker/appdata/certs
  • Zertificate: /docker/appdata/certs/wildcard-supertux-apache.crt
  • Schlüssel: /docker/appdata/certs/wildcard-supertux-apache.key
  • Root-CA: /usr/local/share/ca-certificates/wildcard-supertux-root-ca.crt

Um die Root-CA dem System bekannt zu machen, führe folgendes Kommando aus: update-ca-certificates Damit auf deinem Client/Desktop mit dem du in weiterer Folge auf das Webinterface von Wireguard-UI zugreifst keine Fehlermeldung im Webbrowser produziert, kopiere die Root-CA auf deinem Client in das selbe Verzeichnis und aktualisiere die lokale Zertifikatsdatenbank mit dem obigen Befehl. Nach einem Neustart des Webbrowser sollte die „untrusted“ Meldung verschwunden sein. Sollte dies nicht der Falls sein, benutzt dein Webbrowser einen eigenen Zertifikatsstore. Dann muss die Root-CA im Webbrowser dort manuell importiert werden.

Nun ist es an der Zeit den Vhost zu aktivieren und Nginx zu starten:

ln -s /etc/nginx/sites-available/wireguard /etc/nginx/sites-enabled/.

Nginx Konfiguration prüfen:

nginx -t

Ist alles ok, starte nun den Nginx Reverse Proxy:

systemctl start nginx.service

Kommt keine Fehlermeldung läuft Nginx und du solltest dich bereits mit dem FQDN deines Server auf das Webinterfaces der Wireguard-UI einloggen können.

https://vpn.supertux.lan

Voraussetzung ist natürlich das der Server in deinem lokalen DNS Server hinterlegt wurde. Zu Testzwecken kannst du diesen auch in deiner /etc/hosts Datei temporär eintragen. z.B.

127.0.1.1 desktop-rechner.supertux.lan desktoprechner
127.0.0.1 localhost

# The following lines are desirable for IPv6 capable hosts
::1 localhost ip6-localhost ip6-loopback
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters

192.168.9.9	vpn.supertux.lan

UbuntuPro aktivieren

Ich empfehle dir UbuntuPro jetzt auf deiner LTS-Version zu aktivieren. Dies ist Recht einfach und sollte sich schnell erledigen lassen: https://wiki.ubuntuusers.de/Ubuntu_Pro/

vpn/ubuntu_lts_wireguard_wireguard-ui_fortigate_ein_sicheres_gespann.1751923404.txt.gz · Zuletzt geändert: von loma