Wireguard VPN mit wg-easy

Wireguard VPN mit wg-easy
Photo by Privecstasy / Unsplash

Wireguard ist eine Software zum Aufbau eines virtuellen privaten Netzwerkes über eine verschlüsselte Verbindung. Als Besonderheit ist diese VPN-Technik inzwischen direkt im Linux-Kernel integriert und erlaubt so eine höhere Geschwindigkeit als vergleichbare Lösungen wie IPsec oder OpenVPN.

Bei wg-easy handelt es sich um ein beliebtes Webinterface für Wireguard. Zusätzlich ist in wg-easy bereits Wireguard enthalten. In dieser Anleitung erstellen wir unseren eigenen Wireguard VPN Server auf Basis der Docker Installation mit Traefik und Portainer.

Für die Nutzung des VPN-Tunnels ist am Internet-Router eine Freigabe für den Port 51820/udp oder den selbst gewählten UDP-Port vorzunehmen.
Das Webinterface ist intern unter Docker über Port 51821/tcp und remote durch Traefik über https erreichbar.

Der Port 51820/udp für Wireguard wird direkt im Docker Host freigegeben. Da mein HomeLab für Docker intern nur IPv4 Adressen verwendet, ist der Wireguard Port 51820/udp nur über eine IPv4 Adresse erreichbar. Alternativ müsste Traefik den UDP Port weiterleiten oder Docker für IPv6 konfiguriert werden, was ich hier aber nicht umgesetzt habe.

Die benötigten Parameter lassen sich in Portainer über die "stack.env" einbinden:

PASSWORD=geheim
WG_HOST=vpn.example.com
WG_PORT=51820

# Optional:
# - WG_DEFAULT_ADDRESS=10.8.0.x
# - WG_DEFAULT_DNS=1.1.1.1
# - WG_MTU=1420
# - WG_ALLOWED_IPS=192.168.15.0/24, 10.0.1.0/24
# - WG_PRE_UP=echo "Pre Up" > /etc/wireguard/pre-up.txt
# - WG_POST_UP=echo "Post Up" > /etc/wireguard/post-up.txt
# - WG_PRE_DOWN=echo "Pre Down" > /etc/wireguard/pre-down.txt
# - WG_POST_DOWN=echo "Post Down" > /etc/wireguard/post-down.txt

Stack Konfiguration für Portainer (docker-compose.yml):

version: "3.8"

services:
  wireguard:
    image: weejewel/wg-easy
    container_name: wireguard
    restart: unless-stopped
    env_file: 
      - stack.env
    volumes:
      - config:/etc/wireguard
    ports:
      - "${WG_PORT}:51820/udp"
    cap_add:
      - NET_ADMIN
      - SYS_MODULE
    sysctls:
      - net.ipv4.ip_forward=1
      - net.ipv4.conf.all.src_valid_mark=1
    networks:
      - proxy

    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.wireguard.rule=Host(`${WG_HOST}`)"
      - "traefik.http.routers.wireguard.entrypoints=websecure"
      - "traefik.http.routers.wireguard.service=wireguard"
      - "traefik.http.routers.wireguard.tls.certresolver=leresolver"
      - "traefik.http.services.wireguard.loadbalancer.server.port=51821"
      - "traefik.docker.network=proxy"

volumes:
  config:

networks:
  proxy:
    external: true