Docker 容器流量不通过 VPN 隧道路由:路由和 IP 规则问题

问题描述 投票:0回答:1

我尝试通过 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 容器已连接到自定义桥接网络。

docker ubuntu networking routes vpn
1个回答
0
投票

要通过 Ubuntu 服务器上的 VPN 隧道路由来自 Docker 容器的流量,看起来您已经接近解决方案,但可能需要一些调整。您可以检查和调整以下内容:

1. 确保正确的 VPN 路由

  • 确保 VPN 接口 (
    vti1
    ) 已正确配置为在 Docker 容器子网 (
    172.20.0.0/16
    ) 和远程网络之间路由流量。
  • 确保另一端的 VPN 服务器已设置为处理和转发
    172.20.0.0/16
    子网的数据包。

2. IP 规则和路由表

  • 您的路由表显示来自
    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

3. NAT配置

  • 如果 VPN 的远程端不知道如何到达您的 Docker 子网,您可能需要在 Ubuntu 服务器上使用 NAT(网络地址转换)。
  • 您可以使用 iptables 配置 NAT:
iptables -t nat -A POSTROUTING -s 172.20.0.0/16 -o vti1 -j MASQUERADE

4. VPN 隧道配置

  • 确保 VPN 隧道 (
    vti1
    ) 具有正确的 MTU 设置。不正确的 MTU 可能会导致数据包被静默丢弃。
ip link set dev vti1 mtu 1400

MTU 值 1400 是常见的安全值,但您可能需要根据您的 VPN 提供商进行调整。

5. 测试与调试

  • tcpdump
    界面使用
    vti1
    检查Docker容器的数据包是否确实通过VPN出去。
  • 您还可以在容器内尝试
    ping
    traceroute
    以查看数据包的路由方式。
tcpdump -i vti1
ping -I 172.20.0.2 192.168.200.1

6. 确保 VPN 服务器路由

  • 检查 VPN 服务器配置,确保其具有
    172.20.0.0/16
    子网的路由。
  • 如果您控制 VPN 服务器,请添加到您的 Docker 子网的路由。

7. 检查防火墙规则

  • 确保 Ubuntu 服务器和 VPN 服务器上的防火墙规则不会阻止来自 Docker 子网的流量。
  • 使用
    iptables
    ufw
    验证和调整防火墙规则。
iptables -L -v -n
ufw status

总结

您可能需要调整 NAT 设置并确保正确应用路由规则。如果执行这些步骤后流量仍然无法通过,问题可能在于 VPN 本身的配置方式或远程 VPN 端点上的路由。

© www.soinside.com 2019 - 2024. All rights reserved.