当你在 Linux 服务器上使用 Docker + wg-easy 搭建 WireGuard 时,经常会遇到一个问题:
WireGuard 客户端能连接,但无法访问局域网(如 10.10.10.0/24)甚至无法正常上网。
本教程将通过 IP 转发、NAT、FORWARD 规则三部分来彻底解决。
📌 基本网络信息(示例环境)
| 项目 | 网络 |
|---|---|
| 宿主机 IP | 10.10.10.162 |
| Docker 容器 IP | 172.17.0.3 |
| WireGuard 客户端 IP 段 | 192.168.3.0/24 |
| 网卡名称 | ens192 |
1️⃣ 开启 IP 转发
WireGuard 工作依赖内核转发,因此必须启用:
echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf
sysctl -p
确认是否生效:
cat /proc/sys/net/ipv4/ip_forward
返回 1 即可。
2️⃣ 配置 iptables NAT 规则
🚀(1)让 WireGuard 客户端访问互联网
WireGuard 网段 → NAT 出去
iptables -t nat -A POSTROUTING -s 192.168.3.0/24 -o ens192 -j MASQUERADE
iptables -A FORWARD -i wg0 -o ens192 -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -i ens192 -o wg0 -j ACCEPT
作用:
- 将来自
192.168.3.0/24的 VPN 客户端流量通过ens192转发出去 - 实现客户端访问外网、访问宿主机所在的局域网
🚀(2)让 wg-easy 容器本身能访问外网
Docker 容器网段 → NAT 出去:
iptables -t nat -A POSTROUTING -s 172.17.0.0/16 -o ens192 -j MASQUERADE
作用:
- 让
wg-easy及其他容器网络可以正常访问宿主机外部网络
🚀(3)让 Docker 与 WireGuard 互通
确保 docker0 ↔ wg0 通信:
iptables -A FORWARD -i wg0 -o ens192 -j ACCEPT
iptables -A FORWARD -i ens192 -o wg0 -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -i docker0 -o wg0 -j ACCEPT
iptables -A FORWARD -i wg0 -o docker0 -m state --state RELATED,ESTABLISHED -j ACCEPT
作用:
- WireGuard 客户端可访问 Docker 容器(如 Portainer、NAS 容器等)
- 也允许 Docker 容器访问 WireGuard 客户端
3️⃣ 检查规则是否加载成功
iptables -t nat -L -n -v
iptables -L -n -v
如需刷新网络:
systemctl restart networking
4️⃣ 测试客户端是否能访问外网
在 WireGuard 客户端设备 执行:
curl -I https://www.baidu.com
若无法访问,请检查:
- NAT 规则是否生效:
iptables -t nat -L -n -v - WireGuard 是否正常连接:
wg show - 客户端路由是否正确:
AllowedIPs = 0.0.0.0/0, ::/0
5️⃣ 持久化 iptables 规则(避免重启失效)
Debian/Ubuntu:
apt install iptables-persistent -y
netfilter-persistent save
重新加载:
netfilter-persistent reload
🎉配置完成后,WireGuard 客户端将具备:
- ✔ 访问宿主机局域网
- ✔ 访问 Docker 容器网络
- ✔ 访问外部互联网
- ✔ wg-easy 管理面板可正常与 WG 服务互通
彻底解决 Docker 下 wg-easy 无法访问局域网的问题!








