Docker容器通过主机WireGuard VPN接口路由后短时间内失去连接的问题排查求助
Docker容器通过主机WireGuard VPN接口路由后短时间内失去连接的问题排查求助
大家好,我最近在尝试让特定Docker容器通过主机上的WireGuard VPN接口对外联网,但遇到了一个奇怪的问题,想请各位帮忙分析一下。
先说说我的环境配置:
Docker Compose配置(自定义bridge网络)
version: '3.7' services: ubuntu: image: ubuntu restart: unless-stopped tty: true networks: wireguard: ipv4_address: 172.18.0.2 networks: wireguard: driver: bridge driver_opts: com.docker.network.bridge.name: 'wireguard' ipam: driver: default config: - subnet: 172.18.0.0/16
WireGuard客户端配置(wg0.conf)
[Interface] Table = off SaveConfig = false PrivateKey = {Client Private Key} Address = 10.8.0.21/32 DNS = 10.8.0.1 # 手动创建仅针对WG相关通信的路由 PostUp = iptables -t mangle -I PREROUTING 1 -i wg0 -m conntrack --ctstate NEW -j CONNMARK --set-mark 2 PostUp = iptables -t mangle -I OUTPUT 1 -m connmark --mark 2 -j CONNMARK --restore-mark PostUp = iptables -t mangle -I PREROUTING 2 -m connmark --mark 2 -j CONNMARK --restore-mark PostUp = ip rule add fwmark 2 lookup 2 PostUp = ip rule add table main suppress_prefixlength 0 PostUp = ip route add default dev wg0 table 2 PostUp = sysctl -q net.ipv4.conf.all.src_valid_mark=1 PostUp = sysctl -w net.ipv4.conf.wg0.rp_filter=2 # 关闭wg0时清理规则 PostDown = iptables -t mangle -D PREROUTING -i wg0 -m conntrack --ctstate NEW -j CONNMARK --set-mark 2 PostDown = iptables -t mangle -D OUTPUT -m connmark --mark 2 -j CONNMARK --restore-mark PostDown = iptables -t mangle -D PREROUTING -m connmark --mark 2 -j CONNMARK --restore-mark PostDown = ip rule del table main suppress_prefixlength 0 PostDown = ip rule flush table 2 [Peer] PublicKey = {VPN Server Public Key} AllowedIPs = 10.8.0.1/32,0.0.0.0/0 Endpoint = {VPN Server Connection Endpoint} PersistentKeepalive = 25
我的目标是让这个自定义Docker网络里的容器全部通过WireGuard VPN对外发起连接,所以在主机shell里执行了以下两条路由规则:
ip rule add from 172.18.0.0/16 lookup 2 ip route add 172.18.0.0/16 dev wg0 table 2
一开始一切正常:进入容器后ping外部地址、查IP都显示是VPN服务器的出口IP,网络完全没问题。但奇怪的是,大概30秒到5分钟之后,容器就完全无法对外联网了,所有请求都超时。
我用tcpdump抓桥接网络的包,发现容器一直在发送ARP请求,试图查找172.18.0.1的MAC地址,但根本得不到回应。
我之前在论坛和社区看到很多人用类似的方法实现Docker容器走指定VPN接口,都成功了,实在搞不清楚自己哪里操作错了,有没有大佬能帮忙排查一下这个问题?
备注:内容来源于stack exchange,提问作者SLG Shark6
相关产品推荐
相关产品推荐

