Docker 搭建 wg-easy 无法访问局域网?一文教你彻底解决 WireGuard 转发问题

当你在 Linux 服务器上使用 Docker + wg-easy 搭建 WireGuard 时,经常会遇到一个问题:

WireGuard 客户端能连接,但无法访问局域网(如 10.10.10.0/24)甚至无法正常上网。

本教程将通过 IP 转发、NAT、FORWARD 规则三部分来彻底解决。


:pushpin: 基本网络信息(示例环境)

项目 网络
宿主机 IP 10.10.10.162
Docker 容器 IP 172.17.0.3
WireGuard 客户端 IP 段 192.168.3.0/24
网卡名称 ens192

:one: 开启 IP 转发

WireGuard 工作依赖内核转发,因此必须启用:

echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf
sysctl -p

确认是否生效:

cat /proc/sys/net/ipv4/ip_forward

返回 1 即可。


:two: 配置 iptables NAT 规则

:rocket:(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 转发出去
  • 实现客户端访问外网、访问宿主机所在的局域网

:rocket:(2)让 wg-easy 容器本身能访问外网

Docker 容器网段 → NAT 出去:

iptables -t nat -A POSTROUTING -s 172.17.0.0/16 -o ens192 -j MASQUERADE

作用:

  • wg-easy 及其他容器网络可以正常访问宿主机外部网络

:rocket:(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 客户端

:three: 检查规则是否加载成功

iptables -t nat -L -n -v
iptables -L -n -v

如需刷新网络:

systemctl restart networking

:four: 测试客户端是否能访问外网

WireGuard 客户端设备 执行:

curl -I https://www.baidu.com

若无法访问,请检查:

  1. NAT 规则是否生效:
iptables -t nat -L -n -v
  1. WireGuard 是否正常连接:
wg show
  1. 客户端路由是否正确:
AllowedIPs = 0.0.0.0/0, ::/0

:five: 持久化 iptables 规则(避免重启失效)

Debian/Ubuntu:

apt install iptables-persistent -y
netfilter-persistent save

重新加载:

netfilter-persistent reload

:tada: 解决效果

配置完成后,WireGuard 客户端将具备:

  • :check_mark: 访问宿主机局域网
  • :check_mark: 访问 Docker 容器网络
  • :check_mark: 访问外部互联网
  • :check_mark: wg-easy 管理面板可正常与 WG 服务互通

彻底解决 Docker 下 wg-easy 无法访问局域网的问题!