Probleme beim Zugriff beim Zugriff auf das Heimnetzwerk via Wireguard über einen VPS

Hallo zusammen,
ich hoffe ihr könnt mir bei meinem Problem helfen. Ich bin so langsam ratlos und am Verzweifeln.

Ausgangslage:

Ich hänge an einem Glasfaser Anschluss mit CGNAT. Ich betreibe ein Unfi Gateway, dass direkt am ONT anschlossen ist. Um das CGNAT Problem zu umgehen habe ich mir bei IONOS einen VPS gemietet. Auf dem Server habe ich Docker mit Portainer installiert. Mit Docker habe ich mir WG-Easy inkl. Wireguard bereitgestellt.

Damit möchte damit mit diversen Peers (in diesem Fall ein iPhone) auf mein Heimnetzwerk zugreifen. Ein Exponieren von selbst gehosteten Diensten ist nicht geplant.

Mein Heimnetz hat aktuell folgende Netze:

10.0.10.0/24
(10.0.20.0/24) kommt bald dazu – wird bei der weiteren Problembeschreibung erst einmal nicht berücksichtig

Das Wireguard VPN Netz hat den Netzbereich 10.0.66.0/24.

  • VPS Wireguard Server 10.0.66.1
  • iPhone 10.0.66.2
  • Unifi Gateway 10.0.66.3

Das Problem:

Das Unfi Gateway sowie mein iPhone können sich erfolgreich mit dem Wireguard Server verbinden. Ich kann mit einem tcpdump am Unifi Gateway sehen, dass der Ping auf die IP 10.0.66.3 vom iPhone ankommt. Ein Ping von meinem PC im Heimnetzwerk (10.0.10.124) zum iPhone ist auch erfolgreich und kommt an. Wenn ich allerdings versuche vom iPhone ein System im Heimnetz zu erreichen (zum Bespiel mit der IP 10.0.10.40) kommen keine Datenpakete beim Unfi Gateway an. Tcpdump schweigt in diesem Fall.
Irgendwo habe ich ein Routing Problem und sehe es nicht.

Hier die Config der Docker Compose:

volumes:
  etc_wireguard:

services:
  wg-easy:
    environment:
      # Change Language:
      # (Supports: en, ua, ru, tr, no, pl, fr, de, ca, es, ko, vi, nl, is, pt, chs, cht, it, th, hi, ja, si)
      - LANG=de
      # ⚠️ Required:
      # Change this to your host's public address
      - WG_HOST=<öffentliche Server IP>

      # Optional:
	  # - PORT=51821
      - WG_PORT=51820
      # - WG_CONFIG_PORT=92820
      - WG_DEFAULT_ADDRESS=10.0.66.x
      - WG_DEFAULT_DNS=1.1.1.1
      - WG_MTU=1420
      - WG_ALLOWED_IPS=10.0.66.0/24,10.0.10.0/24
      - WG_PERSISTENT_KEEPALIVE=25
      # - WG_PRE_UP=echo "Pre Up" > /etc/wireguard/pre-up.txt
      - WG_POST_UP=ip route add 10.0.10.0/24 via 10.0.66.3
      # - WG_PRE_DOWN=echo "Pre Down" > /etc/wireguard/pre-down.txt
      - WG_POST_DOWN=ip route del 10.0.10.0/24 via 10.0.66.3

      # - UI_TRAFFIC_STATS=true
      # - UI_CHART_TYPE=0 # (0 Charts disabled, 1 # Line chart, 2 # Area chart, 3 # Bar chart)
      # - WG_ENABLE_ONE_TIME_LINKS=true
      # - UI_ENABLE_SORT_CLIENTS=true
      # - WG_ENABLE_EXPIRES_TIME=true
      # - ENABLE_PROMETHEUS_METRICS=false
    
    image: ghcr.io/wg-easy/wg-easy
    container_name: wg-easy
    volumes:
      - etc_wireguard:/etc/wireguard
    ports:
      - "51820:51820/udp"
      - "51821:51821/tcp"
    restart: unless-stopped
    cap_add:
      - NET_ADMIN
      - SYS_MODULE
      # - NET_RAW # ⚠️ Uncomment if using Podman
    sysctls:
      - net.ipv4.ip_forward=1
      - net.ipv4.conf.all.src_valid_mark=1

Die Wireguard Server wg0.conf sieht wie folgt aus:


# Note: Do not edit this file directly.
# Your changes will be overwritten!

# Server
[Interface]
PrivateKey = xx
Address = 10.0.66.1/24
ListenPort = 51820
PreUp =
PostUp = ip route add 10.0.10.0/24 via 10.0.66.3
PreDown =
PostDown = ip route del 10.0.10.0/24 via 10.0.66.3


# Client: iPhone (xx)
[Peer]
PublicKey = xx
PresharedKey = xx
AllowedIPs = 10.0.66.2/32

# Client: UnifiGateway (xx)
[Peer]
PublicKey = xx
PresharedKey = xx
AllowedIPs = 10.0.66.3/32

Die iPhone Config:


[Interface]
PrivateKey = xx
Address = 10.0.66.2/24
DNS = 1.1.1.1
MTU = 1420

[Peer]
PublicKey = xx
PresharedKey = xx
AllowedIPs = 10.0.66.0/24,10.0.10.0/24
PersistentKeepalive = 25
Endpoint = <öffentliche Server IP>:51820

Die Unfi Gateway Config:


[Interface]
PrivateKey = xx
Address = 10.0.66.3/24
DNS = 1.1.1.1
MTU = 1420

[Peer]
PublicKey = xx
PresharedKey = xx
AllowedIPs = 10.0.66.0/24,10.0.10.0/24
PersistentKeepalive = 25
Endpoint = <öffentliche Server IP>:51820

Hat jemand von euch eine Idee, warum ich nicht vom Peer aus in das Heimnetz komme? Ich sehe den Wald vor lauter Bäumen nicht mehr.

Grüße

Nicht zwangsläufig. Ich kenne dein Unfi Gateway nicht, habe eine pfsense. Und da braucht es neben Routing auch noch die passende Regeln in der Firewall, sonst blockt die die eingehenden Datenpakete. Wie sieht das bei dir aus?

Der Weg von Außen (iphone) zu einem Client im Heimnetz wäre ja eine eingehende Verbindung und da könnte eine Firewall blockieren für den eingehenden Tunnel-Traffic der vom WAN-Interface kommt. Eventuell muss da der Wireguard Port geöffnet sein.

Du hast (der Docker-CT hat) das mit den Allowed-IPs genau falsch rum. Nicht das USG muss in seinen AllowedIPs dein LAN drin haben, sondern dein iPhone und der WG-Container selbst. Sonst verwirft WG das Paket, auch wenn die Route auf das Netz mit dem GW 10.0.66.3 da ist.
Wie man das da in diesem krumigen Docker-CT allerdings ändert / konfiguriert, weiß ich nicht.

Die Firewall Regel ist hinterlegt.
image

Nach meinem Verständnis müsste ich trotz fehlerhafter Firrwall Regel dennoch die ankommenden Pakete sehen wenn ich mit tcpdump am Wireguard Interface des Unifi Gateways horche.

Wie bereits geschrieben, Pakete an die Unifi Wireguard Interface Adresse 10.0.66.3 kommen am Gateway an. Die Pakete die in das 10.0.10.0/24 Netz gehen sollen, kommen nie am Wireguard Interface des Unfi Gateways an.

Der Wireguard ist offen, sonst wäre die Strecke zwischen VPS und Unif Gatway überhaupt nicht nutzbar. Die Pakete an die Unifi Wireguard Interface Adresse 10.0.66.3 kommen am Gateway an.

Ich bin mir nicht sicher, ob ich das richtig verstanden habe.
Meinst du die Peer Konfiguration in der wg0.conf?

# Client: iPhone (xx)
[Peer]
PublicKey = xx
PresharedKey = xx
AllowedIPs = 10.0.66.2/32

# Client: UnifiGateway (xx)
[Peer]
PublicKey = xx
PresharedKey = xx
AllowedIPs = 10.0.66.3/32

Die Konfigdateien für die Peers selber, haben beide Netze drin.

Du musst diese Config auf dem WG-Server / Docker-CT irgendwie anpassen, dass bei dem Client des USG dein LAN (10.0.10.0/24) mit in den AllowedIPs steht, sonst verwirft WireGuard das Paket

Habe ich versucht, die Config habe ich wie folgt angepasst:

# Client: iPhone (xx)
[Peer]
PublicKey = xx
PresharedKey = xx
AllowedIPs = 10.0.66.2/32, 10.0.10.0/24

# Client: UnifiGateway (xx)
[Peer]
PublicKey = xx
PresharedKey = xx
AllowedIPs = 10.0.66.3/32, 10.0.10.0/24

Allerdings bekomme ich so den WG-Dienst nicht mehr gestartet. Der fällt dann auf die Nase.

Wenn du vom iPhone pingst, siehst du die Pakete sowohl am WG-Server als auch am UniFi-Gateway?

Das ist das Problem bei so Docker-Containern, deswegen hasse ich sowas…
Ich würde dir empfehlen, das WG nativ auf dem Linux laufen zu lassen.

Nein, nicht bei beiden, aber ich bezweifel, dass es dann wieder startet.

OK, ich setze den VPS neu auf und versuche es einmal mit der nativen Wireguard Installation. Ich werde berichten.

Hi! Schau dir am besten mal das YouTube-Video an: https://www.youtube.com/watch?v=yOmYfxAFMnM. Vielleicht ist bei der Konfiguration auch schon etwas schiefgelaufen. Liebe Grüße und viel Glück.
:sparkles:

Nicht wieder Docker für Wireguard

Meld dich gerne, wenn du Hilfe brauchst

1 Like

So, aktueller Stand:
Ich habe den VPS neu aufgesetzt und Wireguard nativ auf den Server installiert ohne Docker. Konfiguriert und stehe aktuell immer noch vor dem gleichen Problem.

Ping iPhone (10.0.66.2) zu Wireguard Server (10.0.66.1) funktioniert.
Ping iPhone (10.0.66.2) zu Unfi Gateway (10.0.66.3) funktioniert.
Ping iPhone (10.0.66.2) zu Server hinterm Unfi Gateway (10.0.10.40) funktioniert nicht.
Ping vom Wireguard Server zu Unfi (10.0.66.3) funktioniert.
Ping vom Wireguard Server zu Server hinterm Unfi Gateway (10.0.10.40) erfolglos. Ich sehe auf dem Unfi Gateway mit tcpdump auch keine Pakete die vom Wireguard Server gesendet werden.

Jetzt bin ich bei der weiteren Recherche über eine Sache gestolpert.
Ich habe gelesen, dass man bei neueren Linux Distributionen nftables anstelle von iptables nutzen soll. Mein VPS läuft auf Debian Bookworm.

Kann das sein das die wg0.conf

PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o ens6 -j MASQUERADE
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o ens6 -j MASQUERADE

hier nicht funktionieren und anders gestaltet werden müssen?

Sollte funktionieren, wenn keine Fehlermeldung beim wg-quick up wg0 kommt. Und man braucht diese IPtables-Allow-Regeln auch gar nicht immer, eigentlich ist nämlich auf Debian bei iptables sowieso per Defautl alles erlaubt. Aber du musst

  1. in der /etc/sysctl.conf net.ipv4.ip_forward=1 aktivieren
  2. Zeig bitte die komplette Config

Also wg-quick up funktioniert.

root@vps:~# wg-quick up wg0
[#] ip link add wg0 type wireguard
[#] wg setconf wg0 /dev/fd/63
[#] ip -4 address add 10.0.66.1/32 dev wg0
[#] ip link set mtu 1420 up dev wg0
[#] ip -4 route add 10.0.66.3/32 dev wg0
[#] ip -4 route add 10.0.66.2/32 dev wg0
[#] iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o ens6 -j MASQUERADE

Das forwaring ist aktiviert.

# Uncomment the next line to enable packet forwarding for IPv4
net.ipv4.ip_forward=1

# Uncomment the next line to enable packet forwarding for IPv6
#  Enabling this option disables Stateless Address Autoconfiguration
#  based on Router Advertisements for this host
#net.ipv6.conf.all.forwarding=1

Hier ist die aktuelle wg0.conf:

[Interface]
Address = 10.0.66.1/32
SaveConfig = true
PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o ens6 -j MASQUERADE
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o ens6 -j MASQUERADE
ListenPort = 51820
PrivateKey = xxx

[Peer]
PublicKey = xxx
AllowedIPs = 10.0.66.2/32
Endpoint = xx.xx.xx.xx:49382

[Peer]
PublicKey = xxx
AllowedIPs = 10.0.66.3/32
Endpoint = xx.xx.xx.xx:42798

Jetzt hast du wieder in den Allowed-IPs dein Netz vergessen. Und ich würde auch keinen Endpoint eintragen, sondern nur im UniFi den Endpoint setzen.