Linux 路由器:ping 响应通过错误的接口

Linux 路由器:ping 响应通过错误的接口

我有一台 Debian 服务器,用作小型网络的路由器。它有 3 个网络接口,一个 LAN 和 2 个 WAN(两个不同的 ISP,我们称之为 A 和 B,每个 ISP 都有一个公共静态 IP 地址)。

LAN 有 5 个子网,一些使用 ISP A 访问互联网,一些使用 ISP B(另外还有一个非常简单的基于脚本的故障转移机制,如果另一个 ISP 发生故障,则它会通过一个 ISP 重定向所有流量和一个 OpenVPN 服务器)。

这种方法已经运行了一段时间了。但到目前为止,我们只使用 ISP A 的公共 IP 地址从外部访问服务器。现在我们需要能够通过两个公共 IP 地址进行访问,而我发现 ISP B 的 IP 地址不起作用。

使用 tcpdump 我发现 ping 请求到达了 ISP B 的网络接口,但响应却没有返回。相反,它们似乎是通过 ISP A 返回的。

我猜我的路由表有问题,但我不确定是什么问题。你能帮我找出原因吗?

路由器如下所示(我已将 ISP A 的实际公网 IP 地址替换为 11.11.11.11,将 ISP B 的实际公网 IP 地址替换为 22.22.22.22):

# ifconfig
eth1      Link encap:Ethernet  HWaddr 94:0c:6d:82:0d:98  
          inet addr:10.1.1.1  Bcast:10.1.1.255  Mask:255.255.255.0
          inet6 addr: fe80::960c:6dff:fe82:d98/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:70084654 errors:0 dropped:713 overruns:0 frame:0
          TX packets:87266365 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:2955150829 (2.7 GiB)  TX bytes:3255030277 (3.0 GiB)
          Interrupt:20 Base address:0x2000 

eth1:0    Link encap:Ethernet  HWaddr 94:0c:6d:82:0d:98  
          inet addr:10.1.2.1  Bcast:10.1.2.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          Interrupt:20 Base address:0x2000 

eth1:1    Link encap:Ethernet  HWaddr 94:0c:6d:82:0d:98  
          inet addr:10.1.3.1  Bcast:10.1.3.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          Interrupt:20 Base address:0x2000 

eth1:2    Link encap:Ethernet  HWaddr 94:0c:6d:82:0d:98  
          inet addr:10.1.4.1  Bcast:10.1.4.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          Interrupt:20 Base address:0x2000 

eth1:3    Link encap:Ethernet  HWaddr 94:0c:6d:82:0d:98  
          inet addr:10.1.5.1  Bcast:10.1.5.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          Interrupt:20 Base address:0x2000 

eth3      Link encap:Ethernet  HWaddr 94:0c:6d:82:c8:72  
          inet addr:22.22.22.22  Bcast:22.22.22.255  Mask:255.255.255.0
          inet6 addr: fe80::960c:6dff:fe82:c872/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:2013773 errors:0 dropped:0 overruns:0 frame:0
          TX packets:52720 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:128125141 (122.1 MiB)  TX bytes:4658309 (4.4 MiB)
          Interrupt:19 Base address:0x6000 

eth4      Link encap:Ethernet  HWaddr 6c:f0:49:84:79:ca  
          inet addr:11.11.11.11  Bcast:255.255.255.255  Mask:255.255.255.0
          inet6 addr: fe80::6ef0:49ff:fe84:79ca/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:57255186 errors:0 dropped:0 overruns:0 frame:0
          TX packets:39862172 errors:0 dropped:0 overruns:0 carrier:1
          collisions:0 txqueuelen:1000 
          RX bytes:1933578821 (1.8 GiB)  TX bytes:328150009 (312.9 MiB)
          Interrupt:27 

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:952741 errors:0 dropped:0 overruns:0 frame:0
          TX packets:952741 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:116644740 (111.2 MiB)  TX bytes:116644740 (111.2 MiB)

tun0      Link encap:UNSPEC  HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00  
          inet addr:10.8.0.1  P-t-P:10.8.0.2  Mask:255.255.255.255
          UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1500  Metric:1
          RX packets:7907032 errors:0 dropped:0 overruns:0 frame:0
          TX packets:6371185 errors:0 dropped:5 overruns:0 carrier:0
          collisions:0 txqueuelen:100 
          RX bytes:497588957 (474.5 MiB)  TX bytes:3980021182 (3.7 GiB)

# ip rule list
0:      from all lookup local 
32763:  from 10.1.5.0/24 lookup adsl 
32764:  from 10.1.3.0/24 lookup adsl 
32765:  from 10.1.2.0/24 lookup adsl 
32766:  from all lookup main 
32767:  from all lookup default  

# ip route show table main
10.8.0.2 dev tun0  proto kernel  scope link  src 10.8.0.1 
10.8.0.0/24 via 10.8.0.2 dev tun0 
11.11.11.0/24 dev eth4  proto kernel  scope link  src 11.11.11.11 
22.22.22.0/24 dev eth3  proto kernel  scope link  src 22.22.22.22 
10.1.4.0/24 dev eth1  proto kernel  scope link  src 10.1.4.1 
10.1.5.0/24 dev eth1  proto kernel  scope link  src 10.1.5.1 
10.1.1.0/24 dev eth1  proto kernel  scope link  src 10.1.1.1 
10.1.2.0/24 dev eth1  proto kernel  scope link  src 10.1.2.1 
10.1.3.0/24 dev eth1  proto kernel  scope link  src 10.1.3.1 
default via 11.11.11.1 dev eth4 
default via 22.22.22.1 dev eth3  metric 100 

# ip route show table adsl
10.8.0.2 dev tun0  proto kernel  scope link  src 10.8.0.1 
22.22.22.0/24 dev eth3  proto kernel  scope link  src 22.22.22.22 
11.11.11.0/24 dev eth4  proto kernel  scope link  src 11.11.11.11 
10.8.0.0/24 via 10.8.0.2 dev tun0 
10.1.4.0/24 dev eth1  proto kernel  scope link  src 10.1.4.1 
10.1.5.0/24 dev eth1  proto kernel  scope link  src 10.1.5.1 
10.1.1.0/24 dev eth1  proto kernel  scope link  src 10.1.1.1 
10.1.2.0/24 dev eth1  proto kernel  scope link  src 10.1.2.1 
10.1.3.0/24 dev eth1  proto kernel  scope link  src 10.1.3.1 
default via 22.22.22.1 dev eth3 

# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
10.8.0.2        0.0.0.0         255.255.255.255 UH    0      0        0 tun0
10.8.0.0        10.8.0.2        255.255.255.0   UG    0      0        0 tun0
11.11.11.0      0.0.0.0         255.255.255.0   U     0      0        0 eth4
22.22.22.0      0.0.0.0         255.255.255.0   U     0      0        0 eth3
10.1.4.0        0.0.0.0         255.255.255.0   U     0      0        0 eth1
10.1.5.0        0.0.0.0         255.255.255.0   U     0      0        0 eth1
10.1.1.0        0.0.0.0         255.255.255.0   U     0      0        0 eth1
10.1.2.0        0.0.0.0         255.255.255.0   U     0      0        0 eth1
10.1.3.0        0.0.0.0         255.255.255.0   U     0      0        0 eth1
0.0.0.0         11.11.11.1   0.0.0.0         UG    0      0        0 eth4
0.0.0.0         22.22.22.1    0.0.0.0         UG    100    0        0 eth3

以下是 tcpdump 测试(其中 22.22.22.22 是 ISP B 的 IP,而 99.99.99.99 是我正在 ping 的远程机器的 IP):

# Here's ISP B's interface, eth3
# tcpdump -i eth3 -qtln icmp
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth3, link-type EN10MB (Ethernet), capture size 65535 bytes
IP 99.99.99.99 > 22.22.22.22: ICMP echo request, id 8099, seq 1, length 64
IP 99.99.99.99 > 22.22.22.22: ICMP echo request, id 8099, seq 2, length 64
IP 99.99.99.99 > 22.22.22.22: ICMP echo request, id 8099, seq 3, length 64
IP 99.99.99.99 > 22.22.22.22: ICMP echo request, id 8099, seq 4, length 64

# Here's ISP A's interface, eth4
# tcpdump -i eth4 -qtln icmp
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth4, link-type EN10MB (Ethernet), capture size 65535 bytes
IP 22.22.22.22 > 99.99.99.99: ICMP echo reply, id 8099, seq 9, length 64
IP 22.22.22.22 > 99.99.99.99: ICMP echo reply, id 8099, seq 10, length 64
IP 22.22.22.22 > 99.99.99.99: ICMP echo reply, id 8099, seq 11, length 64
IP 22.22.22.22 > 99.99.99.99: ICMP echo reply, id 8099, seq 12, length 64

答案1

您忘记了每个接口的规则。为了提高可读性,最好创建 2 个表,而不是主表和 adsl 表,例如 ispa 和 ispb

对于 eth4 添加(您可以通过 /etc/network/interface 中的 post-up 来执行此操作):

ip route add 11.11.11.12/32 dev eth4 src 11.11.11.11 table ispa
ip route add default via 11.11.11.12 table ispa
ip rule add from 11.11.11.11 table ispa

(将 11.11.11.12/32 与网关的 IP 交换)。

eth3 及其地址也是如此。

我不知道是否需要子网的静态路由(也许是),您应该考虑平衡两个 wan 接口之间的流量。

如果您需要任何帮助,这对于设置多个上行链路的路由很有帮助:

http://www.debian-administration.org/article/377/Routing_for_multiple_uplinks

答案2

您所遇到的行为是意料之中的。这篇博文有点旧了,但很好地解释了如何让它按您的意愿工作: 在 Linux 中配置多个默认路由

编辑:使用默认路由,您的传出数据包将通过具有最大优先级的默认路由进行路由,无论它们通过哪种方式进入。

您需要使用基于策略的路由,因此我认为在您的情况下您只需添加以下内容:

ip rule add from 11.11.11.11 table main
ip rule add from 22.22.22.22 table adsl

检查您的规则是否放置正确ip rule list。无论如何,这最终与@Broco 的答案相同。

相关内容