Dies ist eine alte Version des Dokuments!
Inhaltsverzeichnis
Ubuntu LTS + Wireguard + Wireguard-UI + Fortigate → Ein "sicheres" Gespann
Du möchtest dich gerne für unsere Hilfe erkenntlich zeigen . 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.
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/