我正在努力解决当前的问题:
背景信息:戴尔 R710 上的 Ubuntu 20.04
我有 2 个不同的互联网连接,使用 2 个 ISP 提供的路由器。我已将 eno2 连接到 isp1 路由器,并通过永久 dhcp 租约获取 192.168.2.102 ip。我已将 eno3 连接到 isp2 路由器,并通过永久 dhcp 租约获取 192.168.88.254 ip。
知识产权
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eno1: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc mq state DOWN group default qlen 1000
link/ether d4:be:d9:ee:7b:75 brd ff:ff:ff:ff:ff:ff
3: eno2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether d4:be:d9:ee:7b:77 brd ff:ff:ff:ff:ff:ff
inet 192.168.2.102/24 brd 192.168.2.255 scope global dynamic noprefixroute eno2
valid_lft 41588sec preferred_lft 41588sec
inet6 fe80::d6be:d9ff:feee:7b77/64 scope link
valid_lft forever preferred_lft forever
4: eno3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether d4:be:d9:ee:7b:79 brd ff:ff:ff:ff:ff:ff
inet 192.168.88.254/24 brd 192.168.88.255 scope global dynamic noprefixroute eno3
valid_lft 486sec preferred_lft 486sec
inet6 fe80::d6be:d9ff:feee:7b79/64 scope link
valid_lft forever preferred_lft forever
5: eno4: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc mq state DOWN group default qlen 1000
link/ether d4:be:d9:ee:7b:7b brd ff:ff:ff:ff:ff:ff
...
网络状态监测
Kernel IP routing table
Destination Gateway Genmask Flags MSS Window irtt Iface
0.0.0.0 192.168.88.1 0.0.0.0 UG 0 0 0 eno3
0.0.0.0 192.168.2.1 0.0.0.0 UG 0 0 0 eno2
172.17.0.0 0.0.0.0 255.255.0.0 U 0 0 0 docker0
192.168.2.0 0.0.0.0 255.255.255.0 U 0 0 0 eno2
192.168.88.0 0.0.0.0 255.255.255.0 U 0 0 0 eno3
问题是,如果在局域网之外,我一次只能通过 1 个(随机)公共 IP 访问服务器。如果 77.xx.xx.158(isp 2)可以访问,则 5.xx.xx.55(isp 1)无法访问,反之亦然,每次启动后都是随机的。
我需要能够在任何给定时间通过任何公共 IP 访问服务器。
提前感谢您提供任何可能的解决方案。
答案1
您有两条发生冲突的默认路线:
Kernel IP routing table
Destination Gateway Genmask Flags MSS Window irtt Iface
0.0.0.0 192.168.88.1 0.0.0.0 UG 0 0 0 eno3
0.0.0.0 192.168.2.1 0.0.0.0 UG 0 0 0 eno2
这是异常情况。您的 PC/服务器会感到困惑,因为没有确切的规则来决定应该使用两个接口中的哪一个作为 Internet 网关。路由决策取决于动态设置为接口的指标或其他因素,这些因素可能会随机变化。因此,有时首选 eno2 接口,有时首选 eno3 接口作为主网关。
我认为从外部到内部的传入数据包将根据用作目的地的 IP 地址以正确的方式到达您的服务器(从外部用户的角度来看)。
- 从互联网发送到 ISP1 公共地址的 SYN TCP 数据包通过 eno2 进入
- 从互联网发送到 ISP2 公共地址的 SYN TCP 数据包通过 eno3 进入
您可以使用 Wireshark 或 Tshark 或 tcpdump 进行检查。
但是响应数据包(SYN ACK TCP)仅通过系统当前选择的主网关发送回来。两个网关中只有一个是首选,而第二个网关在同一时间根本不使用(除非您进行一些特殊设置)。这意味着针对一个接口的连接工作正常,但第二个连接通过错误的接口响应。这种情况称为“非对称路由”。数据包通过 eno3 进入,响应通过 eno2 离开,例如
提供商通常会检查并丢弃此类数据包,因为它看起来像网络攻击。源 IP 地址与源接口的网络地址不匹配。
服务器的路由决定并不取决于数据包传入方式所用的接口,而是取决于实际首选的主要传出网关。某些连接的传入方式和传出方式不同,这就是问题的原因。
这种情况可以通过高级路由(例如基于策略的路由和每个接口的特殊单独路由表/规则)来解决。搜索 iproute2 示例。
也许这些链接可以帮助到你:
https://www.thomas-krenn.com/en/wiki/Two_Default_Gateways_on_One_System