ICMP重定向(ICMP Redirect)

By | 2015年3月29日10:37:47

 网络中的路由器通过相互之间的共同努力,将用户的数据包转发到目的地。通常情况下,主机都会将去往远程网络的数据包发送到路由器,路由器再尽最大努力转发数据。但是在某些情况下,收到数据包的路由器可能并不是去往目的地的最优选择,也就是说该路由器并不在源与目标的路径当中,或者说数据源应该将数据交给其它路由器来转发。如果某台路由器真的发现自己不应该为用户转发数据,而希望让用户选择其它路由器来转发数据,那么它就会通过向数据源发送ICMP重定向(ICMP Redirect)来告诉对方,让对方不要再将数据包发向自己,而应该发到其它路由器。

  需要路由器向源发送ICMP重定向的情况有两种:

★ 1当路由器从某个接口收到数据包后,还要将数据包从同一个接口发往目的地,就是路由器收到数据包的接口正是去往目的地的出口时,则会向源发送ICMP重定向,通告对方直接将数据包发向自己的下一跳即可,不要再发给自己。

★ 2数据包的源IP和自己转发时的下一跳IP地址是同网段时,则会向源发送ICMP重定向,通告对方直接将数据包发向自己的下一跳。

 

注:路由器在向数据源发送ICMP重定向的同时,也会正常转发收到的数据包,并不会中断网络。

 

配置ICMP重定向

说明:ICMP重定向是基于接口配置的,默认为开启状态。

 

 

说明:以上图为例,测试ICMP重定向,其中,R1,R2,R3的接口F0/0在10.1.1.0/24网段,R2和R4的接口F0/1在20.1.1.0/24网段,而R3将去往任何目的的数据全部交给R1。

 

1.配置基础网络环境

(1)配置R1:

r1(config)#int f0/0

r1(config-if)#ip address 10.1.1.1 255.255.255.0

r1(config-if)#no sh

r1(config-if)#exit

r1(config)#ip route 0.0.0.0 0.0.0.0 10.1.1.2

说明:R1将去往任何目的地的数据包全部交给10.1.1.2,即交给R2。

 

(2)配置R2:

r2(config)#int f0/0

r2(config-if)#ip add 10.1.1.2 255.255.255.0

r2(config-if)#no sh

r2(config-if)#exit

 

r2(config)#int f0/1

r2(config-if)#ip add 20.1.1.2 255.255.255.0

r2(config-if)#no sh

r2(config-if)#exit

说明:R2同时连接10.1.1.0/24和20.1.1.0/24。

 

(3)配置R3:

r3(config)#int f0/0

r3(config-if)#ip add 10.1.1.3 255.255.255.0

r3(config-if)#no sh

r3(config-if)#exit

r3(config)#ip route 0.0.0.0 0.0.0.0 10.1.1.1

说明:R3将去往任何目的地的数据包全部交给10.1.1.1,即选择R1作为网关。

 

(4)配置R4:

r4(config)#int f0/1

r4(config-if)#ip add 20.1.1.4 255.255.255.0

r4(config-if)#no sh

r4(config-if)#exit

r4(config)#ip route 0.0.0.0 0.0.0.0 20.1.1.2

说明:R4在20.1.1.0/24。

 

2.测试ICMP重定向

(1)在R3上向目标网络20.1.1.0发送数据包来测试ICMP重定向,并且打开debug观察数据包:

r3#debug ip icmp

ICMP packet debugging is on

r3#

r3#ping 20.1.1.4

 

Type escape sequence to abort.

Sending 5, 100-byte ICMP Echos to 20.1.1.4, timeout is 2 seconds:

!!!!!

Success rate is 100 percent (5/5), round-trip min/avg/max = 20/84/200 ms

r3#

*Mar  1 00:15:39.075: ICMP: redirect rcvd from 10.1.1.1- for 20.1.1.4 use gw 10.1.1.2

*Mar  1 00:15:39.175: ICMP: echo reply rcvd, src 20.1.1.4, dst 10.1.1.3

*Mar  1 00:15:39.291: ICMP: echo reply rcvd, src 20.1.1.4, dst 10.1.1.3

*Mar  1 00:15:39.323: ICMP: echo reply rcvd, src 20.1.1.4, dst 10.1.1.3

*Mar  1 00:15:39.383: ICMP: echo reply rcvd, src 20.1.1.4, dst 10.1.1.3

*Mar  1 00:15:39.403: ICMP: echo reply rcvd, src 20.1.1.4, dst 10.1.1.3

r3#

说明:从上面信息可以看出,由于R3的网关是10.1.1.1,所以会将去往20.1.1.0/24的数据包发给网关R1,但是R1从接口F0/0收到数据包后,检查路由表得知需要再将数据包从相同接口F0/0发给10.1.1.2,不仅满足发送ICMP重定向情况的第一条同接口进出,也满足第二条源和下一跳同网段,所以R1向源发送了ICMP重定向,数据包中明确告诉R3将去往20.1.1.4的数据包直接交给10.1.1.2,即交给R2。从上也可以看出,让R1来转发数据包确实是无谓举动。

 

(2)更改R3的路由方式:

r3(config)#ip route 0.0.0.0 0.0.0.0 f0/0

说明:如果将R3的路由改为直接指定出接口,而不使用下一跳IP地址,则不会造成R1发送ICMP重定向,因为R3在此类路由方式下,并不会将数据包发向R1。

 

(3)测试R3更改路由方式后的情况:

r3#debug ip icmp

ICMP packet debugging is on

r3#

r3#ping 20.1.1.4

 

Type escape sequence to abort.

Sending 5, 100-byte ICMP Echos to 20.1.1.4, timeout is 2 seconds:

!!!!!

Success rate is 100 percent (5/5), round-trip min/avg/max = 52/86/176 ms

r3#

*Mar  1 00:33:41.511: ICMP: echo reply rcvd, src 20.1.1.4, dst 10.1.1.3

*Mar  1 00:33:41.607: ICMP: echo reply rcvd, src 20.1.1.4, dst 10.1.1.3

*Mar  1 00:33:41.663: ICMP: echo reply rcvd, src 20.1.1.4, dst 10.1.1.3

*Mar  1 00:33:41.719: ICMP: echo reply rcvd, src 20.1.1.4, dst 10.1.1.3

*Mar  1 00:33:41.779: ICMP: echo reply rcvd, src 20.1.1.4, dst 10.1.1.3

r3#

说明:可以看出,R1并没有再发送ICMP重定向,因为R3并没有将去往20.1.1.0/24的数据包发向R1,具体原因,由普通ARP的原理可以得知。

 

 

3.关闭ICMP重定向

(1)在R1接口上关闭ICMP重定向:

r1(config)#int f0/0

r1(config-if)#no ip redirects

说明:需要开启ICMP重定向,输入命令ip redirects;ICMP重定向功能不建议关闭。

注:在接口上开启HSRP后,默认会关闭ICMP重定向的功能,在IOS 12.1(3)T和以后的版本可以手工开启ICMP重定向功能。

发表评论

电子邮件地址不会被公开。 必填项已用*标注