Einleitung

VPNs werden immer beliebter, um die Privatsphäre zu schützen. Ich möchte hier ein kurzes Tutorial zu einem VPN auf wireguard-Basis in einem Docker-Contaier geben.

Kernel Modules

Bevor man Wireguard (mit diesem Docker Image) in einem Docker Container laufen lassen kann, muss man zuerst die Kernel Header und das Kernel Modul installieren. Unter Manjaro geht das so:

$ sudo pacman -S linux-headers

Anmerkung: Es wird nun gefragt, welchen Header er installieren soll, man wählt hier den Header für die Version des installieren Linux Kernels aus. Wenn man gerade nicht weiß, welche Version man installiert hat, kann man das über diesen Befehl herausfinden: uname -r

Als nächstes installiert man das Kernel Modul über diesen Befehl:

sudo pacman -S dkms wireguard-dkms wireguard-tools

Wireguard im Docker Container

Als erstes sucht man sich einen Ordner und erstellt in diesem als Beispielkonfiguration (updated) folgende docker-compose.yml:

version: "2"
services:
 vpn:
  image: cmulk/wireguard-docker
  container_name: wireguard
  volumes:
   - ./etc-wireguard:/etc/wireguard
  networks:
   - net
  ports:
   - port-external:port-internal/udp
  restart: unless-stopped
  cap_add:
   - NET_ADMIN
   - SYS_MODULE
  environment:
   - IPTABLES_MASQ=1

 wg-gen-web:
  image: vx3r/wg-gen-web:latest
  container_name: wg-gen-web
  restart: unless-stopped
  ports:
   - port-external:8080
  environment:
   - WG_CONF_DIR=/data
   - WG_INTERFACE_NAME=wg0.conf
   - SMTP_HOST=mailserver.example.com
   - SMTP_PORT=465
   - SMTP_USERNAME=mail@example.com
   - SMTP_PASSWORD=password
   - SMTP_FROM=Wg Gen Web <mail@example.com>
   - OAUTH2_PROVIDER_NAME=oauth2oidc
   - OAUTH2_PROVIDER=https://gitlab.example.com
   - OAUTH2_CLIENT_ID=*
   - OAUTH2_CLIENT_SECRET=*
   - OAUTH2_REDIRECT_URL=https://wireguard.example.com
  volumes:
      - ./etc-wireguard:/data

networks:
  net:

Updated (automatische Konfiguration über das Webinterface)

Als nächstes erstellt man zwei Dateien, damit sich bei Änderungen über das Webinterface der wireguard docker container neu startet.

  1. sudo nano /etc/systemd/system/wg-gen-web.path

    [Unit]
    Description=Watch etc-wireguard for changes
    [Path]
    PathModified=/path/of/docker-wireguard-config/etc-wireguard
    [Install]
    WantedBy=multi-user.target
  2. sudo nano /etc/systemd/system/wg-gen-web.service

    [Unit]
    Description=Restart WireGuard Docker
    After=network.target
    [Service]
    Type=oneshot
    ExecStart=/usr/bin/docker restart wireguard
    [Install]
    WantedBy=multi-user.target
  3. sudo systemctl daemon-reload

nginx Konfiguration

sudo nano /etc/nginx/sites-enabled/wireguard.example.com.conf Hier den Reverse Proxy je nach vergebener Portnummer konfigurieren.

Archiv (manuelle Konfiguration ohne Webinterface)

Als nächstes erstellt man über mkdir etc-wireguard den entsprechenden Ordner für die Konfiguarationsdateien. server.conf

[Interface]
Address = 192.168.20.1/24
PrivateKey = <server-private-key>
ListenPort = 7777

[Peer]
PublicKey = <client-public-key>
AllowedIPs = 192.168.20.2

*client.config

[Interface]
Address = 192.168.20.2/24
PrivateKey = <client-private-key>
ListenPort = 0 #needed for some clients to accept the config

[Peer]
PublicKey = <server-public-key>
Endpoint = 24.134.225.237:7777
AllowedIPs = 0.0.0.0/0,::/0 #makes sure ALL traffic routed through VPN
PersistentKeepalive = 25

Die entsprechenden "private-keys" und "public-keys" lassen sich zum Beispiel über die Android-App oder die iOS-App. Jeweils zwei Konfigurationen anfangen zu erstellen und dort die entsprechenden Schlüssel generieren. Das ganze macht man zweimal, einmal für den Server und einmal für den Client und modifiziert dann die jeweiligen Konfiguarationsdateien. Die fertige Client-Konfiguration lässt sich dann einfach importieren. Zum Schluss wechselt man wieder in den Oder der "docker-compose.yml" und startet den Conatainer per sudo docker-compose up -d

Quellen

Nächster Beitrag Vorheriger Beitrag