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

0
43

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

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

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


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

项目网络
宿主机 IP10.10.10.162
Docker 容器 IP172.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

若无法访问,请检查:

  1. NAT 规则是否生效: iptables -t nat -L -n -v
  2. WireGuard 是否正常连接: wg show
  3. 客户端路由是否正确: 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 无法访问局域网的问题!

发布回复

请输入评论!
请输入你的名字