多个默认路由

多个默认路由

我已经通过 VPN 连接了两台服务器。服务器A托管所有容器,服务器B只是一个简单的路由器。我需要通过 ssh 连接到两台服务器,因此,除了从服务器 A 托管的容器发出的包之外,不应更改 ppp0(服务器 A)和 eth0(服务器 B)的默认路由。这些容器应发送所有流量均流向服务器 B。

Server A                                                                                              Server B
-------------------------------------------------------------------------------------------                 ---------------------------------------------
internet ---- ppp0 (a.b.c.d/32)                                                             eth0 (e.f.g.h/32) ---- internet
                   vpn   (172.16.0.1/16)    -----------------------------------------------    vpn (172.16.0.2/16)
            +---- vswitch (172.17.0.1/16)
            |
            |                                             Container yp
            +---- yp (slave of vswitch)  ----  eth0 (172.17.0.3/16)
            |
            |                                                 Container boot
            +---- boot (slave of vswitch)  ----  eth0 (172.17.0.4/16)

ppp0 不是 VPN 连接,而是本地 ADSL 链路。 ppp0 的 MTU 为 1480。

两个 VPN 链接均构建在 Wireshark 之上。两者的MTU都是1420。

我尝试标记服务器 A 容器的流量并将该流量路由到服务器 B/互联网。此外,我尝试将其设为双向,因为服务器 B 上的未来容器将会出现。

# iptables -t mangle -A PREROUTING -j MARK --set-mark 85 -i vswitch
# iptables -t mangle -A PREROUTING -j MARK --set-mark 95 -i vpn

# ip rule add fwmark 85 lookup 185
# ip rule add fwmark 95 lookup 195

# ip route add table 185 default via 172.16.0.1 dev vpn
# ip route add table 185 default via 172.16.0.1 dev vswitch

当登录到容器 yp 时,我尝试 ping 服务器 B。

[root@yp ~]# ping 172.16.0.2
PING 172.16.0.2 (172.16.0.2) 56(84) bytes of data.
^C
--- 172.16.0.2 ping statistics ---
2 packets transmitted, 0 received, 100% packet loss, time 1004ms

这是服务器A的路由表

# ip r show table all
default via 172.16.0.1 dev vpn table 185 
default via 172.17.0.1 dev vswitch table 195 
default dev ppp0 scope link 
a.b.c.n dev ppp0 proto kernel scope link src a.b.c.d
local a.b.c.d dev ppp0 table local proto kernel scope host src a.b.c.d 
broadcast 127.0.0.0 dev lo table local proto kernel scope link src 127.0.0.1 
local 127.0.0.0/8 dev lo table local proto kernel scope host src 127.0.0.1 
local 127.0.0.1 dev lo table local proto kernel scope host src 127.0.0.1 
broadcast 127.255.255.255 dev lo table local proto kernel scope link src 127.0.0.1 
broadcast 172.16.0.0 dev vpn table local proto kernel scope link src 172.16.0.1 
local 172.16.0.1 dev vpn table local proto kernel scope host src 172.16.0.1 
broadcast 172.16.255.255 dev vpn table local proto kernel scope link src 172.16.0.1 
broadcast 172.17.0.0 dev vswitch table local proto kernel scope link src 172.17.0.1 
local 172.17.0.1 dev vswitch table local proto kernel scope host src 172.17.0.1 
broadcast 172.17.255.255 dev vswitch table local proto kernel scope link src 172.17.0.1 

为了使路由/标记正确,我缺少什么?

答案1

我不确定我是否正确理解了您的图表:您想要做的就是在服务器 A 上设置一条路由,以便来自两个容器中任何一个的数据包都路由到服务器 B,对吗?

无论如何,一般情况下,不要使用iptables路由。 (这是我的一个小烦恼,出于某种原因人们iptables总是尝试使用路由。)还有其他选择,例如策略路由。

所以在你的情况下,类似

ip route add table 250 172.16.0.1/16 dev vpn scope link
ip route add table 250 default via 172.16.0.2
ip rule add from 172.16.0.3 table 250
ip rule add from 172.16.0.4 table 250

(未经测试)应该可以解决问题。有很多关于策略路由的在线教程。

相关内容