为什么会发生ICMP重定向主机?

为什么会发生ICMP重定向主机?

我正在将 Debian 机器设置为 4 个子网的路由器。为此,我在连接 LAN 的 NIC 上定义了 4 个虚拟接口 ( eth1)。

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:6026521 errors:0 dropped:0 overruns:0 frame:0
          TX packets:35331299 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:673201397 (642.0 MiB)  TX bytes:177276932 (169.0 MiB)
          Interrupt:19 Base address:0x6000 

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:19 Base address:0x6000 

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:19 Base address:0x6000 

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:19 Base address:0x6000 

eth2      Link encap:Ethernet  HWaddr 6c:f0:49:a4:47:38  
          inet addr:192.168.1.10  Bcast:192.168.1.255  Mask:255.255.255.0
          inet6 addr: fe80::6ef0:49ff:fea4:4738/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:199809345 errors:0 dropped:0 overruns:0 frame:0
          TX packets:158362936 errors:0 dropped:0 overruns:0 carrier:1
          collisions:0 txqueuelen:1000 
          RX bytes:3656983762 (3.4 GiB)  TX bytes:1715848473 (1.5 GiB)
          Interrupt:27 

eth3      Link encap:Ethernet  HWaddr 94:0c:6d:82:c8:72  
          inet addr:192.168.2.5  Bcast:192.168.2.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:110814 errors:0 dropped:0 overruns:0 frame:0
          TX packets:73386 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:16044901 (15.3 MiB)  TX bytes:42125647 (40.1 MiB)
          Interrupt:20 Base address:0x2000 

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:22351 errors:0 dropped:0 overruns:0 frame:0
          TX packets:22351 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:2625143 (2.5 MiB)  TX bytes:2625143 (2.5 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:41358924 errors:0 dropped:0 overruns:0 frame:0
          TX packets:23116350 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:100 
          RX bytes:3065505744 (2.8 GiB)  TX bytes:1324358330 (1.2 GiB)

我有另外两台计算机连接到此网络。一台的 IP 为 10.1.1.12(子网掩码为 255.255.255.0),另一台的 IP 为 10.1.2.20(子网掩码为 255.255.255.0)。我希望能够从 10.1.2.20 到达 10.1.1.12。

由于路由器中启用了数据包转发,并且 FORWARD 链的策略为 ACCEPT(并且没有其他规则),我理解从 10.1.2.20 通过路由器 ping 到 10.1.1.12 应该没有问题。

然而,我得到的是这样的:

$ ping -c15 10.1.1.12
PING 10.1.1.12 (10.1.1.12): 56 data bytes
Request timeout for icmp_seq 0
92 bytes from router2.mydomain.com (10.1.2.1): Redirect Host(New addr: 10.1.1.12)
Vr HL TOS  Len   ID Flg  off TTL Pro  cks      Src      Dst
 4  5  00 0054 81d4   0 0000  3f  01 e2b3 10.1.2.20  10.1.1.12 

Request timeout for icmp_seq 1
92 bytes from router2.mydomain.com (10.1.2.1): Redirect Host(New addr: 10.1.1.12)
Vr HL TOS  Len   ID Flg  off TTL Pro  cks      Src      Dst
 4  5  00 0054 899b   0 0000  3f  01 daec 10.1.2.20  10.1.1.12 

Request timeout for icmp_seq 2
92 bytes from router2.mydomain.com (10.1.2.1): Redirect Host(New addr: 10.1.1.12)
Vr HL TOS  Len   ID Flg  off TTL Pro  cks      Src      Dst
 4  5  00 0054 78fe   0 0000  3f  01 eb89 10.1.2.20  10.1.1.12 

Request timeout for icmp_seq 3
92 bytes from router2.mydomain.com (10.1.2.1): Redirect Host(New addr: 10.1.1.12)
Vr HL TOS  Len   ID Flg  off TTL Pro  cks      Src      Dst
 4  5  00 0054 14b8   0 0000  3f  01 4fd0 10.1.2.20  10.1.1.12 

Request timeout for icmp_seq 4
92 bytes from router2.mydomain.com (10.1.2.1): Redirect Host(New addr: 10.1.1.12)
Vr HL TOS  Len   ID Flg  off TTL Pro  cks      Src      Dst
 4  5  00 0054 8ef7   0 0000  3f  01 d590 10.1.2.20  10.1.1.12 

Request timeout for icmp_seq 5
92 bytes from router2.mydomain.com (10.1.2.1): Redirect Host(New addr: 10.1.1.12)
Vr HL TOS  Len   ID Flg  off TTL Pro  cks      Src      Dst
 4  5  00 0054 ec9d   0 0000  3f  01 77ea 10.1.2.20  10.1.1.12 

Request timeout for icmp_seq 6
92 bytes from router2.mydomain.com (10.1.2.1): Redirect Host(New addr: 10.1.1.12)
Vr HL TOS  Len   ID Flg  off TTL Pro  cks      Src      Dst
 4  5  00 0054 70e6   0 0000  3f  01 f3a1 10.1.2.20  10.1.1.12 

Request timeout for icmp_seq 7
92 bytes from router2.mydomain.com (10.1.2.1): Redirect Host(New addr: 10.1.1.12)
Vr HL TOS  Len   ID Flg  off TTL Pro  cks      Src      Dst
 4  5  00 0054 b0d2   0 0000  3f  01 b3b5 10.1.2.20  10.1.1.12 

Request timeout for icmp_seq 8
92 bytes from router2.mydomain.com (10.1.2.1): Redirect Host(New addr: 10.1.1.12)
Vr HL TOS  Len   ID Flg  off TTL Pro  cks      Src      Dst
 4  5  00 0054 f8b4   0 0000  3f  01 6bd3 10.1.2.20  10.1.1.12 

Request timeout for icmp_seq 9
Request timeout for icmp_seq 10
92 bytes from router2.mydomain.com (10.1.2.1): Redirect Host(New addr: 10.1.1.12)
Vr HL TOS  Len   ID Flg  off TTL Pro  cks      Src      Dst
 4  5  00 0054 1c95   0 0000  3f  01 47f3 10.1.2.20  10.1.1.12 

Request timeout for icmp_seq 11
Request timeout for icmp_seq 12
Request timeout for icmp_seq 13
92 bytes from router2.mydomain.com (10.1.2.1): Redirect Host(New addr: 10.1.1.12)
Vr HL TOS  Len   ID Flg  off TTL Pro  cks      Src      Dst
 4  5  00 0054 62bc   0 0000  3f  01 01cc 10.1.2.20  10.1.1.12 

为什么会发生这种情况?

据我所知,Redirect Host响应与两台主机位于同一网络且存在更短的路由有关(至少我是这么理解的)。它们实际上位于同一物理网络中,但如果它们不在同一子网(它们无法看到彼此),为什么会有更好的路由?

我错过了什么?

您可能想要查看一些额外信息:

# 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
127.0.0.1       0.0.0.0         255.255.255.255 UH    0      0        0 lo
192.168.2.0     0.0.0.0         255.255.255.0   U     0      0        0 eth3
10.8.0.0        10.8.0.2        255.255.255.0   UG    0      0        0 tun0
192.168.1.0     0.0.0.0         255.255.255.0   U     1      0        0 eth2
10.1.4.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         192.168.1.1     0.0.0.0         UG    0      0        0 eth2
0.0.0.0         192.168.2.1     0.0.0.0         UG    100    0        0 eth3

# iptables -L -n
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination   

# iptables -L -n -t nat
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination         

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination         
MASQUERADE  all  -- !10.0.0.0/8           10.0.0.0/8          
MASQUERADE  all  --  10.0.0.0/8          !10.0.0.0/8          

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination 

答案1

乍一看,Debian 似乎超出了发送 ICMP 重定向的界限;引用RFC 792(互联网协议)

  The gateway sends a redirect message to a host in the following situation.
  A gateway, G1, receives an internet datagram from a host on a network
  to which the gateway is attached.  The gateway, G1, checks its routing
  table and obtains the address of the next gateway, G2, on the route to
  the datagram's internet destination network, X.  If G2 and the host 
  identified by the internet source address of the datagram are on the same
  network, a redirect message is sent to the host.  The redirect message 
  advises the host to send its traffic for network X directly to gateway
  G2 as this is a shorter path to the destination.  The gateway forwards
  the original datagram's data to its internet destination.

在这种情况下,G1 是10.1.2.1eth1:0以上),X 是10.1.1.0/24,G2 是10.1.1.12,源是10.1.2.20(即G2 and the host identified by the internet source address of the datagram are **NOT** on the same network)。也许这在历史上对于同一接口上的接口别名(或辅助地址)有不同的解释,但严格来说,我不确定我们是否应该看到 Debian 发送该重定向。

根据您的要求,您可以通过为eth1类似10.1.0.0/22(主机地址来自10.1.0.1- 10.1.3.254)的内容创建子网来解决这个问题,而不是使用单个/24块的接口别名(eth1eth1:0eth1:1, );如果这样做,您将需要更改所有连接主机的网络掩码,并且除非您扩展到,eth1:2否则您将无法使用 10.1.4.x。/21

编辑

我们稍微超出了原始问题的范围,但我会帮助解决您在评论中提到的设计/安全问题。

如果您想将办公室内的用户彼此隔离,让我们退一步来看看您现在面临的一些安全问题:

您目前在一个以太网广播域中有四个子网。一个广播域中的所有用户都不符合您在评论中阐明的安全要求(所有机器都会看到来自其他机器的广播,并且可以自发地在 Layer2 上相互发送流量,无论它们的默认网关是eth1eth1:0还是)。您的 Debian 防火墙无法改变这种情况(或者我应该说您的 Debian 防火墙无法改变这种情况eth1:1eth1:2应该做些什么来改变这一点:-)。

  • 获取支持 VLAN 和 dot1q 标记的托管以太网交换机
  • 将所有用户接入以太网交换机
  • 将用户分配到 Vlan(在 Linux 和以太网交换机上)基于评论中所述的安全策略。正确配置的 Vlan 将大大有助于解决上述问题。
  • 对于多个安全域访问10.1.1.12,您有以下几种选择:
    • 选项1:考虑到所有用户访问服务的要求10.1.1.12,您可以将所有用户放在一个 IP 子网中,并使用私有 Vlan(RFC 5517),假设您的以太网交换机支持此功能。此选项不需要iptables规则来限制办公室内流量跨越安全边界(通过私有 Vlan 实现)。
    • 选项 2: 你可以将用户放入不同的子网(对应 Vlan)并实施iptables规则来部署安全策略
  • 在 Vlan 级别保护好网络后,设置基于源的路由策略将不同的用户从您的多个上行链路发送出去。

仅供参考,如果你有支持虚拟资源库,其中一些甚至变得更加简单;如果我没记错的话,您现场有一台 Cisco IOS 机器。根据您已有的型号和软件映像,Cisco 可以出色地将您的用户彼此隔离实施基于源的路由策略。

答案2

目前尚不清楚您想做什么,但我可以说以下内容。

这些子网连接到同一个物理接口。当收到的数据包应通过同一个物理接口转发时,Linux 路由器将返回 ICMP 重定向消息。

答案3

我同意 Khaled 的评论,并想补充一下他的话:

“这些子网连接到同一个物理接口。当收到的数据包应通过同一个物理接口转发时,Linux 路由器将返回 ICMP 重定向消息”到同一目标子网然后将请求重定向到下一跳。今天我使用 Mikrotik Linux 路由器和 F5 bigip LTM 设备时就遇到了这种情况。

root@(primaryadc)(cfg-sync In Sync)(Standby)(/Common)(tmos)# ping 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
From 192.168.153.20: icmp_seq=1 Redirect Host(New nexthop: 192.168.153.2)
64 bytes from 8.8.8.8: icmp_seq=1 ttl=128 time=82.8 ms
From 192.168.153.20: icmp_seq=2 Redirect Host(New nexthop: 192.168.153.2)
64 bytes from 8.8.8.8: icmp_seq=2 ttl=128 time=123 ms
**routing table**
0.0.0.0  192.168.153.20  0.0.0.0         UG        0 0          0 external

答案4

这里的基本问题是“为什么会发生这种情况”,就显示的 ping 输出而言,其中发生了两件事:

  1. 所有 ping 请求都超时了
  2. 路由器(如10.1.2.1)通过 ICMP 重定向向主机指示目标主机可通过10.1.1.12(换句话说,直接在同一个接口上)访问

为避免疑问,问题中的虚拟接口(eth1:0eth1:1等等)不是 VLAN ——这种表示法并不暗示 Linux 中的 VLAN,而且问题中也没有提到 VLAN。

至于为什么 ping 不起作用的基本问题,我们不知道。显示的配置没有任何问题(假设 iptables 输出中的那些与 NAT 相关的规则不在任何相关接口上——我们无法从输出中看出——但它们可能不是,因为问题中没有其他关于 NAT 的讨论)。客户端提到的 IP 和子网掩码没问题,但除此之外没有提供客户端详细信息。也许客户端路由详细信息有误。这可能很简单,比如错过了设置默认网关,或者错过了创建静态路由,具体取决于客户端侧的路由配置。

至于 ICMP 重定向,这种情况完全正常,与 ping 失败无关。路由器除了中继原始数据包外,还会发送 ICMP 重定向消息,而不是代替它——ICMP 重定向只是对未来数据包的优化。处理 ICMP 重定向实际上是可选的。至于 ICMP 重定向的条件,“有一条更短的路由”有点夸大了路由器的功能;情况实际上非常简单:路由器正在将数据包路由到它进入的同一接口,因此如果任何节点将其传递给路由器,而是直接将其传递到下一跳,它必然会节省一跳。在一般情况下,当路由器将数据包路由到广播域中它有路由表条目但前一个路由器没有的其他网关时,就会发生这种情况。这是一个简单情况,下一跳是目标主机本身,因为目标主机位于广播域中。

相关内容