왜 ICMP Redirect Host가 발생합니까?


25

데비안 박스를 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 

답변:


22

처음에는, 데비안이 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.1( eth1: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)입니다. 어쩌면 이것은 동일한 인터페이스의 인터페이스 별칭 (또는 보조 주소)의 경우 역사적으로 다르게 해석되었지만 엄밀히 말하면 데비안이 해당 리디렉션을 보내는 것을 확신하지 못합니다.

당신의 요구 사항에 따라 서브넷을 만들어이 문제를 해결 할 수있을 것 eth1같은 10.1.0.0/22(에서 호스트 주소를 10.1.0.1- 10.1.3.254) 대신에 개인 인터페이스 별칭을 사용하여 /24블록 ( eth1, eth1:0, eth1:1, eth1:2); 이 작업을 수행 한 경우 연결된 모든 호스트의 넷 마스크를 변경해야하며로 확장하지 않으면 10.1.4.x를 사용할 수 없습니다 /21.

편집하다

우리는 원래 질문의 범위 밖에서 약간의 노력을 기울이고 있지만 의견에 언급 된 디자인 / 보안 문제를 해결하는 데 도움을 줄 것입니다.

사무실의 사용자를 서로 격리하려면 잠시 뒤로 물러서서 현재 가지고있는 보안 문제를 살펴 보겠습니다.

현재 하나의 이더넷 브로드 캐스트 도메인에 네 개의 서브넷이 있습니다. 하나 개의 브로드 캐스트 도메인의 모든 사용자가 당신이 의견에 관절 보안 요구 사항을 충족하지 않는 (모든 기계는 다른 기계에서 방송을 볼 자발적 레이어 2에서 서로의 트래픽을 보낼 수에 관계없이 기본 게이트웨이 존재의 eth1, eth1:0, eth1:1또는 eth1:2). 데비안 방화벽이 변경 (또는 어쩌면 내가 데비안 방화벽이 아무것도 없다 말을해야 할 수있는 일은 없다 한다 이를 변경하려면 어떻게이 :-).

  • 의견에 명시된 보안 정책에 따라 사용자를 Vlan에 할당해야합니다. 올바르게 구성된 Vlan은 위에서 언급 한 문제를 해결하는 데 많은 도움이됩니다. 이더넷 스위치가 Vlan을 지원하지 않는 경우 VLAN을 지원해야합니다.
  • 에 액세스하는 여러 보안 도메인과 관련하여 10.1.1.12몇 가지 옵션이 있습니다.
    • 옵션 1 : 모든 사용자가 서비스에 액세스해야한다는 조건을 고려할 때 이더넷 스위치가이를 지원한다고 가정하면 10.1.1.12모든 사용자를 하나의 IP 서브넷에 배치하고 Private Vlans (RFC 5517)로 보안 정책을 구현할 수 있습니다. 이 옵션은 iptables사무실 간 트래픽이 보안 경계를 넘지 않도록 제한 하는 규칙이 필요하지 않습니다 (개인용 Vlan으로 수행됨).
    • 옵션 2 : 당신은 할 수 서로 다른 서브넷에 사용자가 (VLAN에 해당) 넣어 구현하는 iptables보안 정책을 배포하는 규칙을
  • Vlan 수준에서 네트워크를 보호 한 후에는 여러 사용자에게 여러 업 링크를 보내도록 소스 기반 라우팅 정책 을 설정 하십시오.

참고로 VRF 를 지원하는 라우터가 있다면 이 중 일부가 훨씬 쉬워집니다. IIRC, Cisco IOS 머신이 현장에 있습니다. 시스코는 서로 사용자를 분리 환상적인 일을 할 수 있다는 것을, 당신이 이미 가지고있는 모델 및 소프트웨어 이미지에 따라 소스 기반 라우팅 정책을 구현합니다.


기본적으로 필요한 것은 사무실의 다른 영역에 대해 4 개의 서브넷을 갖는 것입니다. 일부 서브넷은 한 ISP를 사용하여 인터넷으로 나가고 다른 서브넷은 다른 ISP를 사용합니다. 다른 서브넷의 컴퓨터는 서로를 보거나 연결할 수 없어야합니다. 호스트 10.1.1.12를 제외하고 모두 사용할 수있는 일부 서비스를 제공합니다. 현재 적절한 FORWARD 규칙을 설정하지 않았습니다. 그러나 모든 전달이 허용되므로 10.1.2.20에서 10.1.1.12로 핑할 수 있어야한다고 생각했습니다.
El Barto 2016 년

흠 ... 좋아, 마이크 고마워. VLAN을보다 자세히 살펴 보겠습니다. 나는이 모든 것을 시작하기 전에 그것에 대해 생각했고 그것이 필요하지 않다고 생각했다. 우리가 관리하는 스위치는 관리되지 않는 스위치이지만 VLAN을 지원하므로 틀린 것이 아니라면 데비안 라우터에서 태그를 지정해야한다고 생각합니까? 서브넷 격리는 실제로이 사무실에서 중요한 문제는 아니지만 너무 많은 추가 작업이 필요하지 않으면 좋을 것이라고 생각합니다. 나는 그것을 조사하고 내가 무엇을 할 수 있는지 볼 것이다 :)
El Barto

@ElBarto, 스위치가 Vlan 태깅을 지원하지 않는 경우 (그리고 관리되지 않는 경우는 아님) 데비안에서 태깅하는 것만으로는 도움이되지 않습니다. 사무실 내 서브넷 격리가 중요한 문제가 아닌 경우 모든 사람을 두 개의 서로 다른 서브넷에 배치하고 작업을 수월하게 만듭니다 (두 개의 서브넷을 사용하면 데비안에서 정책을 라우팅 할 수 있습니다). 데비안 인터페이스 별명이 4 개인 현재 체계는 실제 서브넷 격리를 제공하지 않으며 훨씬 더 복잡해집니다.
Mike Pennington

사용자 설명서에서 이해 한 바에 따르면 스위치는 "태그 유지"를 지원하지만 "실제 태깅"은 지원하지 않습니다. 데비안에 관한 설명을 해주셔서 감사합니다. 문제는 두 개의 서브넷을 유지하더라도 10.1.1.12에 액세스하려면 여전히 서브넷 10.1.2.0/24의 머신이 필요하다는 것입니다.
El Barto

다른 서브넷에있는 머신은 여전히 ​​액세스 할 수 있어야합니다 10.1.1.12. 로 리눅스가 ICMP에 도달 할 수없는 것을 보내지 못하도록 차단 iptables하더라도 ICMP 메시지를 보내는 CPU는 여전히 CPU를 굽게되지만 최소한 호스트 테이블에는 설치되지 않습니다. 즉, 데비안에 다른 이더넷 인터페이스를 추가하면 (즉, 사용자 '클래스'당 하나의 인터페이스를 전용으로) 데비안 더 이상 ICMP 도달 불가능을 보내지 않아야합니다 . 즉, 각 사용자 '클래스'당 하나씩 두 개의 서로 다른 이더넷 스위치가 있음을 의미합니다. 케이블 연결 기술자가 싫어하지만 작업이 완료됩니다
Mike Pennington

3

당신이 무엇을하려고하는지 분명하지 않지만, 나는 다음을 말할 수 있습니다.

이러한 서브넷은 동일한 물리적 인터페이스에 연결됩니다. Linux 라우터는 수신 된 패킷이 동일한 물리적 인터페이스를 통해 전달되어야 할 때 ICMP 리디렉션 메시지를 반환합니다.


모두 동일한 NIC를 통해 연결된이 4 개의 서브넷을 처리해야합니다. 다른 서브넷의 호스트는 모두 사용할 수있는 호스트 10.1.1.12를 제외하고 서로 연결할 수 없어야합니다. 아직 이에 대한 전달 규칙을 정의하지 않았으므로 해당 서브넷의 호스트가 10.1.1.12에 도달 할 수 있어야한다고 생각했습니다. ICMP 리디렉션을 피할 수있는 방법이 있습니까?
El Barto 2016 년

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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.