From ce469f867941cd071d2ecc3d9d4217f66b422d0c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dani=C3=ABl=20Vos?= Date: Mon, 22 Sep 2025 09:43:49 +0200 Subject: [PATCH] Add routed.md example --- docs/content/examples/tutorials/routed.md | 87 +++++++++++++++++++++++ 1 file changed, 87 insertions(+) create mode 100644 docs/content/examples/tutorials/routed.md diff --git a/docs/content/examples/tutorials/routed.md b/docs/content/examples/tutorials/routed.md new file mode 100644 index 00000000..ac97bfa9 --- /dev/null +++ b/docs/content/examples/tutorials/routed.md @@ -0,0 +1,87 @@ +--- +title: Routed setup (No NAT) +--- + +This guide shows how to run **wg-easy** with a routed setup so packets are forwarded instead of NATed. + +In a routed design, each WireGuard client keeps its own IPv4/IPv6 address. That means you can identify clients by their real addresses instead of seeing everything as the WireGuard server’s IP. + +## Requirements + +1. You know how to add static routes on your router to the WireGuard server. + +## Docker setup + +To make use of our own IPv4/IPv6 addresses, run the container with the `network_mode: host` option. + +```yaml +services: + wg-easy: + image: ghcr.io/wg-easy/wg-easy:15 + container_name: wg-easy + network_mode: "host" + environment: + - INSECURE=true # TEMPORARY for testing only; remove for production + volumes: + - ./config:/etc/wireguard + - /lib/modules:/lib/modules:ro + cap_add: + - NET_ADMIN + devices: + - /dev/net/tun:/dev/net/tun + restart: unless-stopped +``` + +Because we’re on the host network, remove any `ports:` and container `sysctls:` you might have had before. + +## Kernel parameters (on the host) + +With host networking, system sysctls must be set on the **host**. On your host, create `/etc/sysctl.d/90-wireguard.conf`: + +``` +net.ipv4.ip_forward=1 +net.ipv4.conf.all.src_valid_mark=1 +net.ipv6.conf.all.disable_ipv6=0 +net.ipv6.conf.all.forwarding=1 +net.ipv6.conf.default.forwarding=1 +``` + +Apply and verify: +```bash +sysctl -p /etc/sysctl.d/90-wireguard.conf +sysctl -n net.ipv4.ip_forward # should print 1 +``` + +## Add static routes on your router + +Pick an IPv4 and IPv6 subnet for your clients and add static routes on your router, pointing to the wireguard server's LAN addresses. + +### Example + +I want my WireGuard clients in `192.168.0.0/24` and `2001:db8:abc:0::/64`. + +- Routed IPv4 subnet: `192.168.0.0/24` +- Routed IPv6 prefix: `2001:db8:abc:0::/64` +- WireGuard server IPs: `192.168.10.118` and `2001:db8:abc:10:216:3eff:fedb:949e` + +On your router: +- Route `192.168.0.0/24` → next hop `192.168.10.118` +- Route `2001:db8:abc:0::/64` → next hop `2001:db8:abc:10:216:3eff:fedb:949e` + +Don't forget to create the neccesary firewall rules to allow these subnets to travel across your LAN. + +## Wireguard Easy configuration + +In the web UI → Admin → Interface, click Change CIDR and set the IPv4/IPv6 routed subnets you chose above. Save. + +Then go to Admin → Hooks and add: + +PostUp +``` +iptables -A INPUT -p udp -m udp --dport {{port}} -j ACCEPT; iptables -A FORWARD -i wg0 -j ACCEPT; iptables -A FORWARD -o wg0 -j ACCEPT; ip6tables -A INPUT -p udp -m udp --dport {{port}} -j ACCEPT; ip6tables -A FORWARD -i wg0 -j ACCEPT; ip6tables -A FORWARD -o wg0 -j ACCEPT +``` + +PostDown +``` +iptables -D INPUT -p udp -m udp --dport {{port}} -j ACCEPT; iptables -D FORWARD -i wg0 -j ACCEPT; iptables -D FORWARD -o wg0 -j ACCEPT; ip6tables -D INPUT -p udp -m udp --dport {{port}} -j ACCEPT; ip6tables -D FORWARD -i wg0 -j ACCEPT; ip6tables -D FORWARD -o wg0 -j ACCEPT +```