我尝试通过 Ubuntu 服务器上的 VPN 隧道路由来自 Docker 容器的流量,但遇到路由问题。这是设置以及我到目前为止所尝试的:
设置:
Docker 容器 IP 地址:
172.20.0.2
Docker 自定义桥接网络子网:
172.20.0.0/16
VPN 接口:
vti1
VPN 本地 IP 地址:
192.168.200.1
VPN 对等 IP 地址:
10.129.20.2
默认路线:
default via 142.93.128.1 dev eth0
路由表
vpn
: default via 192.168.200.1 dev vti1
当前路由和IP规则:
$ ip route show
default via 192.168.200.1 dev vti1
172.20.0.0/16 via 192.168.200.1 dev vti1
root@dockeronubuntu2204-s-1vcpu-1gb-ams3-01:~# ip route show
default via 142.93.128.1 dev eth0 proto static
10.18.0.0/16 dev eth0 proto kernel scope link src 10.18.0.5
10.110.0.0/20 dev eth1 proto kernel scope link src 10.110.0.2
10.129.20.0/27 dev vti1 scope link
142.93.128.0/20 dev eth0 proto kernel scope link src 142.93.141.70
172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1
172.18.0.0/16 dev br-db5a54d34c53 proto kernel scope link src 172.18.0.1 linkdown
172.20.0.0/16 dev br-60ce34a14131 proto kernel scope link src 172.20.0.1
192.168.200.0/24 via 192.168.200.1 dev vti1
$ ip route show table vpn
default via 192.168.200.1 dev vti1
172.20.0.0/16 via 192.168.200.1 dev vti1
$ ip rule show
0: from all lookup local
216: from 172.20.0.0/16 lookup vpn
217: from 172.18.0.0/16 lookup vpn
218: from 192.168.96.0/20 lookup vpn
220: from all lookup 220
32766: from all lookup main 32767: from all lookup default
ip addr show vti1
给出:
18: vti1@NONE: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1480 qdisc noqueue state UNKNOWN group default qlen 1000
link/ipip 192.168.200.1 peer 10.129.20.2
inet 192.168.200.1/24 scope global vti1
valid_lft forever preferred_lft forever
inet 192.168.200.2/24 scope global secondary vti1
valid_lft forever preferred_lft forever
inet6 fe80::5efe:c0a8:c801/64 scope link
valid_lft forever preferred_lft forever
问题: 当我尝试使用 IP
192.168.200.1
从容器 ping 172.20.0.2
时,流量似乎没有通过 VPN 路由,我使用 tcpdump -i vti1
检查过。另一方面,尝试 ping 192.168.200.0
,我确实看到流量经过 vti1
,并且 ping 返回:From 192.168.200.1 icmp_seq=1 Destination Host Unreachable.
有人知道我错过了什么吗?在我看来,VPN 接口没有正确配置为处理通过 192.168.200.0/24 的流量,尽管我对 IT 很陌生,不知道在哪里可以解决问题。
附加信息:
我在服务器上使用Ubuntu 22.04。
Docker 容器已连接到自定义桥接网络。
要通过 Ubuntu 服务器上的 VPN 隧道路由来自 Docker 容器的流量,看起来您已经接近解决方案,但可能需要一些调整。您可以检查和调整以下内容:
vti1
) 已正确配置为在 Docker 容器子网 (172.20.0.0/16
) 和远程网络之间路由流量。172.20.0.0/16
子网的数据包。172.20.0.0/16
子网的流量应使用 vpn
表。但是,您需要确保 VPN 本身知道如何路由进出该子网的流量。ip rule show
) 和路线 (ip route show
) 是否设置正确。考虑像这样调整路由表:
ip route add 172.20.0.0/16 via 192.168.200.1 dev vti1 table vpn
ip rule add from 172.20.0.0/16 lookup vpn
iptables -t nat -A POSTROUTING -s 172.20.0.0/16 -o vti1 -j MASQUERADE
vti1
) 具有正确的 MTU 设置。不正确的 MTU 可能会导致数据包被静默丢弃。ip link set dev vti1 mtu 1400
MTU 值 1400 是常见的安全值,但您可能需要根据您的 VPN 提供商进行调整。
tcpdump
界面使用vti1
检查Docker容器的数据包是否确实通过VPN出去。ping
或 traceroute
以查看数据包的路由方式。tcpdump -i vti1
ping -I 172.20.0.2 192.168.200.1
172.20.0.0/16
子网的路由。iptables
或 ufw
验证和调整防火墙规则。iptables -L -v -n
ufw status
您可能需要调整 NAT 设置并确保正确应用路由规则。如果执行这些步骤后流量仍然无法通过,问题可能在于 VPN 本身的配置方式或远程 VPN 端点上的路由。