Benutzer-Werkzeuge

Webseiten-Werkzeuge


vpn:ubuntu_lts_wireguard_wireguard-ui_fortigate_ein_sicheres_gespann

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

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/

Spezielles ZSH-Prompt aktivieren (optional)

Um dem ganzen ein etwas hübscheres Aussehen mit Funktion zu verleihen, hast du an dieser Stelle die Möglichkeit ein hübsches ZSH-Prompt einzubauen.

  1. Benutzer und Hostname
  2. VPN verbunden
  3. Public IP

Installation und Konfiguration

Folgende Pakete müssen über apt installiert werden:

apt install zsh eza

Danach das Prompt von GitHub laden:

bash <(curl -s https://raw.githubusercontent.com/mh-firouzjah/zsh-config/master/install.sh)

Und die ZSH-Shell für Root aktivieren:

usermod -s /bin/zsh root

Nach einem Relogin ist die Shell aktiv. Um die im Screenshot sichtbare Willkommensnachricht zu aktivieren, editieren wir das File /etc/update-motd.d/99-osit mit diesem Inhalt und machen es ausführbar:

nano /etc/update-motd.d/99-osit
99-osit
#!/bin/sh
 
green="\e[0;92m"
red="\e[31m"
bold="\e[1m"
reset="\e[0m"
 
echo
echo "${green} ----------------------------------------------"
echo " Willkommen am VPN Einwahlserver"
echo " ----------------------------------------------${reset}"
echo
echo
echo
chmod +x /etc/update-motd.d/99-osit

Shellfunktionen aktivieren und Farbe ändern

cp $HOME/.zsh/modules/p10k.zsh $HOME/.p10k.zsh

In dem File gibt es jede Menge Funktionen die man an und abschalten kann. Wir aktivieren 2 Funktionen:

  • public_ip
  • vpn_ip

Dazu einfach die beiden Zeilen in der Config einkommentieren:

nano ~/.p10k.zsh

Zusätzlichen suchen wir in dieser Datei nach POWERLEVEL9K_DIR_BACKGROUND=, und setzen die Farbe mit dem Wert 1 auf Rot.

Für die ~/.zshrc verwenden wir diesen Inhalt:

rm ~/.zshrc
nano ~/.zshrc
/root/.zshrc
# Enable Powerlevel10k instant prompt. Should stay close to the top of ~/.zshrc.
# Initialization code that may require console input (password prompts, [y/n]
# confirmations, etc.) must go above this block; everything else may go below.
 
echo 
docker compose ls
echo
docker ps
echo 
 
 
if [[ -r "${XDG_CACHE_HOME:-$HOME/.cache}/p10k-instant-prompt-${(%):-%n}.zsh" ]]; then
  source "${XDG_CACHE_HOME:-$HOME/.cache}/p10k-instant-prompt-${(%):-%n}.zsh"
fi
 
# Use powerline
USE_POWERLINE="true"
# Has weird character width
# Example:
#    is not a diamond
HAS_WIDECHARS="false"
 
source ~/.zsh/modules/config.zsh
source ~/.zsh/modules/prompt.zsh
 
# Remove folder background on `ls` command
zstyle ':completion:*' list-colors
export LS_COLORS="$LS_COLORS:ow=1;34:tw=1;34:"
 
alias ls='eza  --icons  --git'
 
# To customize prompt, run `p10k configure` or edit ~/.p10k.zsh.
[[ ! -f ~/.p10k.zsh ]] || source ~/.p10k.zsh
 
cd /etc/wireguard

Nach einem Relogin sollte sich das Prompt wie im Screenshot präsentieren.

Weitere Empfehlungen

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