通过WireGuard容器将容器流量路由至非容器主机的问题排查
问题:Prometheus容器无法通过WireGuard隧道访问主机B的node_exporter
环境配置
- 主机A(Host A):运行Prometheus容器与WireGuard容器
- WireGuard容器创建
wg-network网络(子网10.10.10.0/24),自身固定IP为10.10.10.99 - Prometheus容器加入
wg-network(分配IP10.10.10.10),同时需接入其他网络与Grafana、cAdvisor、Traefik通信
- WireGuard容器创建
- 主机B(Host B):非容器化部署WireGuard,运行node_exporter,WireGuard接口配置IP
10.10.10.20/24,目标通过隧道与主机A的Prometheus加密通信
当前问题
- 主机B可正常ping通主机A的两个容器(
10.10.10.10、10.10.10.99) - WireGuard容器可正常访问主机B(
10.10.10.20) - Prometheus容器无法访问主机B的node_exporter地址
http://10.10.10.20:9100/metrics,报错:Get "http://10.10.10.20:9100/metrics": dial tcp 10.10.10.20:9100: connect: no route to host - 备注:Prometheus容器基于busybox镜像,无法使用ping测试;已排除
network_mode: service:<container-name>方案(因需接入多网络,Docker Compose存在配置限制)
相关配置
WireGuard容器Docker Compose配置
services: server: image: procustodibus/wireguard:latest cap_add: - NET_ADMIN networks: wg-network: ipv4_address: 10.10.10.99 ports: - "51822:51822/udp" volumes: - ./wg0.conf:/etc/wireguard/wg0.conf networks: wg-network: name: wg-network ipam: config: - subnet: 10.10.10.0/24
主机A WireGuard配置(wg0.conf)
[Interface] PrivateKey = ******** ListenPort = 51822 PreUp = iptables -t nat -A POSTROUTING -d 10.10.10.0/24 -j MASQUERADE [Peer] PublicKey = ******** Endpoint = *******:51822 AllowedIPs = 10.10.10.20/32
主机B WireGuard配置(wg0.conf)
[Interface] PrivateKey = ******* ListenPort = 51822 [Peer] PublicKey = ******* Endpoint = *******:51822 AllowedIPs = 10.10.10.99/32, 10.10.10.10/32
其他基础配置
- 两台主机均通过UFW开放
51822/udp端口 - 主机B已配置并启用wg0设备,绑定IP
10.10.10.20/24
解决方案
问题核心是Docker内部网络与WireGuard隧道的路由转发规则缺失,需调整iptables与系统转发配置:
1. 更新主机A WireGuard的iptables规则
修改主机Awg0.conf中的PreUp规则为以下内容:
PreUp = iptables -t nat -A POSTROUTING -s 10.10.10.0/24 -o wg0 -j MASQUERADE PreUp = iptables -A FORWARD -i wg0 -o docker0 -m state --state RELATED,ESTABLISHED -j ACCEPT PreUp = iptables -A FORWARD -i docker0 -o wg0 -j ACCEPT
- 第一条规则:为
wg-network子网的流量通过wg0接口转发时做地址伪装 - 后两条规则:允许WireGuard隧道与Docker网桥之间的双向流量转发
2. 启用主机A的IP转发
临时生效:
echo 1 > /proc/sys/net/ipv4/ip_forward
永久生效(编辑/etc/sysctl.conf):
net.ipv4.ip_forward = 1
执行sysctl -p使配置立即生效
3. 调整UFW转发策略
编辑主机A的/etc/default/ufw文件,修改转发策略:
DEFAULT_FORWARD_POLICY="ACCEPT"
重启UFW生效:
ufw reload
4. 验证Prometheus容器路由
进入Prometheus容器,检查路由表(busybox可用ip route命令):
docker exec -it <prometheus容器名称> ip route
确认存在指向10.10.10.0/24的路由,且下一跳指向wg-network网关或WireGuard容器IP10.10.10.99
内容的提问来源于stack exchange,提问作者Nomad
相关产品推荐
相关产品推荐

