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


25

我正在将Debian盒设置为4个子网的路由器。为此,我在连接LAN(eth1)的NIC上定义了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  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),另一个具有10.1.2.20(子网掩码255.255.255.0)。我希望能够从10.1.2.20达到10.1.1.12。

由于在路由器中启用了数据包转发,并且FORWARD链的策略为ACCEPT(并且没有其他规则),因此我知道从路由器ping从10.1.2.20到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 

Answers:


22

乍一看,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:1eth1:2); 如果你这样做,你需要改变连接所有主机的网络掩码,你将无法使用10.1.4.x,除非你扩展到/21

编辑

我们正在尝试超出原始问题的范围,但是我将帮助您解决评论中提到的设计/安全问题。

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

当前,您在一个以太网广播域中有四个子网。在一个广播域中的所有用户都不能满足您的意见阐述的安全要求(所有机器将看到来自其他机器的广播,并可能自发地二层流量发送给对方,不论其默认网关之中的eth1eth1:0eth1:1eth1:2)。没有什么您的Debian防火墙可以做些什么来改变这个(或者我应该说没有什么您的Debian防火墙应该做些什么来改变这个:-)。

  • 您需要根据注释中所述的安全策略将用户分配到VLAN中。正确配置的Vlan将大大有助于解决上述问题。如果您的以太网交换机不支持VLAN,则应选择支持该功能的交换机。
  • 关于多个安全域的访问10.1.1.12,您有两种选择:
    • 选项1:考虑到所有用户都必须访问服务的要求10.1.1.12,您可以将所有用户置于一个IP子网中,并通过专用VLAN(RFC 5517)实施安全策略,前提是您的以太网交换机支持此功能。此选项将不需要iptables规则来限制局内流量越过安全边界(通过专用VLAN来实现)。
    • 选项2:您可以将用户放入不同的子网(对应于Vlan),并实施iptables规则以部署安全策略
  • 在Vlan级别保护网络安全之后,请设置基于源的路由策略,以将不同的用户发送到多个上行链路。

仅供参考,如果您有一台支持VRF的路由器,那么其中的一些功能甚至会变得更加简单;IIRC,您现场有一台Cisco IOS计算机。根据您已经拥有的型号和软件映像,思科可以做出色的工作来将您的用户彼此隔离,实施基于源的路由策略。


基本上,我需要为办公室的不同区域提供4个子网。一些子网将使用一个ISP进入Internet,而另一些子网将使用另一个。来自不同子网的计算机不应该能够看到或彼此连接。主机10.1.1.12除外,它提供了一些应为所有人使用的服务。目前,我尚未为此设置适当的FORWARD规则。但是,由于所有前锋都被接受,我认为我应该能够从10.1.2.20 ping到10.1.1.12。
巴托

嗯...好,谢谢迈克。我将更深入地研究VLAN。在开始所有这些之前,我已经考虑过了,并认为我不需要它。我们拥有的交换机支持VLAN,尽管它们是非托管交换机,所以,如果我没有记错的话,我想我将不得不在Debian路由器上进行标记,对吗?子网的隔离实际上不是办公室中的关键问题,但是我认为如果不需要太多额外的工作,那么拥有它将会是一件好事。我会调查一下,看看我能做什么:)
巴托

@ElBarto,如果您的开关不支持Vlan标记(如果不受管,则不太可能),那么仅在Debian上标记将无济于事。如果办公室内子网隔离不是关键问题,则将每个人都放在两个不同的子网中并简化操作(两个子网可确保您可以在Debian上制定路由策略)。我要说的是,当前具有四个Debian接口别名的方案没有提供真正的子网隔离,并且增加了更多的复杂性。
Mike Pennington 2012年

没错,据我从用户手册中了解到,这些开关支持“保留标签”,但不支持“进行实际标签”。感谢您对Debian的澄清。事实是,即使我保留两个子网,我仍然需要来自子网10.1.2.0/24的计算机才能访问10.1.1.12。
巴托

其他子网中的计算机仍应可以访问10.1.1.12。如果您使用阻止linux发送ICMP unreachables iptables,那么您仍然会从它发送ICMP消息的过程中刻录CPU,但至少它们不会安装在主机表中。也就是说,如果您在Debian上添加另一个以太网接口(即,每个用户“类”专用一个接口),则Debian 不应再发送ICMP不可达消息;这意味着您有两个不同的以太网交换机:每个用户“类”一个。您的布线技术人员会不喜欢它,但是它可以完成工作
Mike Pennington 2012年

3

目前还不清楚您要做什么,但是我可以说以下几点。

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


我需要处理这四个通过相同NIC连接的子网。这个想法是,除了主机10.1.1.12应该对所有人可用之外,其他子网中的主机不应该能够相互连接。我尚未为此定义转发规则,因此我认为来自这些子网中任何一个的主机都应能够达到10.1.1.12。有什么方法可以避免ICMP重定向?
巴托

1
@ElBarto,一种方法是添加iptables删除掉重定向的规则eth1
Mike Pennington

1

我同意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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.