Networking

為什麼會發生 ICMP 重定向主機?

  • March 15, 2020

我正在設置一個 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),另一個具有 10.1.2.20(子網遮罩 255.255.255.0)。我希望能夠從 10.1.2.20 到達 10.1.1.12。

由於在路由器中啟用了數據包轉發,並且 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響應與兩台主機在同一個網路中並且路由較短(或者我理解)這一事實有關。它們實際上在同一個物理網路中,但是如果它們不在同一個子網上(它們彼此看不到),為什麼會有更好的路由呢?

我錯過了什麼?

您可能希望看到的一些額外資訊:

# 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 似乎在擴展發送 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``eth1``eth1:0``eth1:1``eth1:2``/21

編輯

我們冒險超出了原始問題的範圍,但我會幫助解決您評論中提到的設計/安全問題。

如果您想將辦公室中的使用者彼此隔離,讓我們退後一步,看看您現在擁有的一些安全問題:

您目前在一個乙太網廣播域中有四個子網。一個廣播域中的所有使用者都不滿足您在評論中闡明的安全要求(所有機器都將看到來自其他機器的廣播,並且可以在第 2 層自發地相互發送流量,無論它們的預設網關是、eth1eth1:0)。你的 Debian 防火牆無法改變這一點(或者我應該說你的 Debian 防火牆不應該改變這一點:-)。eth1:1``eth1:2

  • 您需要根據評論中所述的安全策略將使用者分配到 Vlan。正確配置的 Vlan 將大大有助於解決上述問題。如果您的乙太網交換機不支持 Vlan,您應該得到一個支持的。

  • 對於多個安全域訪問10.1.1.12,您有兩種選擇:

    • 選項 1:鑑於要求所有使用者訪問服務10.1.1.12,您可以將所有使用者放在一個 IP 子網中,並使用Private Vlans (RFC 5517)實施安全策略,假設您的乙太網交換機支持這一點。此選項不需要iptables規則來限制辦公室內的流量跨越安全邊界(這是通過私有 Vlan 完成的)。
    • 選項 2:您可以將使用者放入不同的子網(對應於 Vlan)並實施iptables規則以部署您的安全策略
  • 在 Vlan 級別保護網路後,設置基於源的路由策略以將不同的使用者發送到多個上行鏈路。

僅供參考,如果您有一個支持VRFs的路由器,其中一些會變得更加容易;IIRC,您在現場有一台 Cisco IOS 機器。根據您已經擁有的模型和軟體映像,思科可以出色地隔離您的使用者實施基於源的路由策略。

引用自:https://serverfault.com/questions/402023