为什么ICMPredirect主机发生?

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

 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 PtP: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) 

我有两台连接到这个networking的电脑。 一个IP为10.1.1.12(子网掩码255.255.255.0),另一个为10.1.2.20(子网掩码255.255.255.0)。 我希望能够从10.1.2.20达到10.1.1.12。

由于路由器启用了报文转发function,FORWARD链的策略是ACCEPT(没有其他规则),我知道从10.1.2.20到10.1.1.12 ping通路由器应该没有问题。

不过,这是我得到的:

 $ 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响应与这两个主机在同一个networking,并有一个较短的路线(或者我理解)的事实有关。 他们实际上在同一个物理networking中,但是为什么如果他们不在同一个子网上(他们不能看到对方),为什么会有更好的路由呢?

我错过了什么?

一些额外的信息,你可能想看到:

 # 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 

乍一看,Debian似乎正在扩展发送ICMPredirect的边界; 引用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/2410.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发送redirect。

根据你的要求,你可以通过使eth1的子网类似于10.1.0.0/22 (主机地址从10.1.0.110.1.3.254 )而不是使用个别/24块的接口别名( eth1eth1:0eth1:1eth1:2 ); 如果你这样做了,你需要改变所有主机的networking掩码,除非扩展到/21否则你将无法使用10.1.4.x。

编辑

我们正在冒险超出原始问题的范围,但是我会帮助解决您评论中提到的devise/安全问题。

如果您想隔离办公室中的用户,让我们退后一步,看看您现在拥有的安全问题:

您目前在一个以太网广播域中有四个子网。 在一个广播域中的所有用户不符合你在评论中阐述的安全要求(所有机器将看到来自其他机器的广播,并且可以自发地在第二层发送stream量,不pipe其默认网关是eth1eth1:0eth1:1eth1:2 )。 Debian防火墙没有什么可以改变这一点(或者我应该说,Debian防火墙不应该做任何改变:-)。

  • 您需要根据评论中所述的安全策略将用户分配到Vlans。 正确configuration的Vlan将大大解决上述问题。 如果你的以太网交换机不支持Vlans,你应该得到一个。
  • 对于访问10.1.1.12多个安全域,您有几个select:
    • scheme1 :假设所有用户都需要访问10.1.1.12服务,假设您的以太网交换机支持这个function ,您可以将所有用户放在一个IP子网中,并使用Private Vlans(RFC 5517)实施安全策略。 此选项不需要iptables规则来限制局内stream量跨过安全边界(这是通过私有Vlans完成的)。
    • 选项2 :您可以将用户放入不同的子网(对应于Vlans)并实施iptables规则来部署您的安全策略
  • 在Vlan级别保护您的networking之后,请设置基于源的路由策略,以便将不同的用户从多个上行链路中发送出去。

仅供参考,如果您有支持VRF的路由器,其中一些更容易; IIRC,现场有一台Cisco IOS机器。 取决于你已经拥有的模型和软件镜像,思科可以将你的用户隔离开来实现基于源的路由策略。

这是不是很清楚你想做什么,但我可以说以下。

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

我同意哈立德的评论,也会增加他的短语的结尾:

“这些子网连接到同一个物理接口,当收到的数据包应该通过同一个物理接口转发到同一目的子网时,Linux路由器将返回ICMPredirect消息,然后把请求redirect到下一跳。 这发生在今天我使用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