WireGuard客户端无法访问Docker Swarm中运行的服务(WG服务器部署在宿主机)
WireGuard客户端无法访问Docker Swarm中运行的服务(WG服务器部署在宿主机)
我之前碰到过好几个类似的场景,大概率是网络路由、Docker网络规则或者Traefik配置的问题,咱们一步步来排查:
1. 先确认Docker Swarm网络的可达性
首先得搞清楚Docker Swarm用的子网段,打开终端跑这个命令:
docker network inspect ingress
在输出里找到Subnet字段(比如常见的是10.0.0.0/16),这就是Swarm服务所在的子网。
- 然后检查你的WireGuard服务器配置(
/etc/wireguard/wg0.conf),看看AllowedIPs字段有没有包含这个Docker子网。比如如果Docker子网是10.0.0.0/16,那服务器端的AllowedIPs应该写成类似192.168.188.0/24,10.0.0.0/16,10.110.0.0/24(把你的内网、WG子网、Docker子网都加进去)。 - 同时检查WireGuard客户端的配置,
AllowedIPs也要包含这个Docker子网,这样客户端访问Docker服务的流量才会走WG隧道。
2. 检查Traefik的监听范围
你之前配置Traefik的时候,是不是只让它监听宿主机的内网接口(比如192.168.188.X)了?如果是这样,Traefik根本接不到来自WireGuard接口(wg0)的请求。
- 打开Traefik的启动命令或者配置文件,确认entrypoints是绑定
0.0.0.0(所有接口),比如启动命令里的--entrypoints.web.address=:80,而不是--entrypoints.web.address=192.168.188.XX:80。 - 也可以在宿主机上用
netstat -tulpn | grep traefik看看Traefik的监听地址,要是只有内网IP的话,改成全接口监听就行。
3. 排查宿主机的iptables和路由规则
宿主机的防火墙或者路由规则可能把WG到Docker的流量拦住了:
- 先看宿主机的路由表,有没有Docker子网到WG子网的转发规则?用
ip route检查,如果没有,手动加一条(假设Docker子网是10.0.0.0/16,WG接口是wg0):
ip route add 10.0.0.0/16 dev wg0 scope link
- 然后检查iptables的FORWARD链,看看有没有允许WG和Docker网络之间的流量:
iptables -L FORWARD -n
如果没看到允许10.110.0.0/24(你的WG子网)到10.0.0.0/16(Docker子网)的规则,手动加两条:
iptables -A FORWARD -i wg0 -o docker_gwbridge -j ACCEPT iptables -A FORWARD -i docker_gwbridge -o wg0 -j ACCEPT
(docker_gwbridge是Swarm默认用来连接宿主机和容器的桥接网络,要是你改了这个名字就换成你自己的)
4. 快速测试定位问题
可以先做个简单测试缩小范围:
- 在WG客户端上ping一下某个Docker容器的IP(用
docker inspect <容器ID> | grep IPAddress拿到),如果ping不通,那肯定是路由或者iptables的问题; - 如果能ping通但访问不了服务,那大概率是Traefik的路由规则没覆盖WG客户端的请求,或者容器本身的端口配置有问题。
备注:内容来源于stack exchange,提问作者Arca Artem
相关产品推荐
相关产品推荐

