You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

通过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通信
  • 主机B(Host B):非容器化部署WireGuard,运行node_exporter,WireGuard接口配置IP10.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设备,绑定IP10.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 18:00:03