ICMP重定向原理

ICMP重定向原理
 
 ICMP重定向报文是ICMP控制报文中的一种。在特定的情况下,当路由器检测到一台机器使用非优化路由的时候,它会向该主机发送一个ICMP重定向报文,请求主机改变路由。路由器也会把初始数据报向它的目的地转发

ICMP应用分析-ICMP重定向

  ICMP虽然不是路由协议,但是有时它也可以指导数据包的流向(使数据流向正确的网关)。ICMP协议通过ICMP重定向数据包(类型5、代码0:网络重定向)达到这个目的。
 
 
 图1  ICMP重定向
 
  如图1所示,主机PC要ping路由器R2的loopback 0地址:192.168.3.1,主机将判断出目标属于不同的网段,因此它要将 ICMP请求包发往自己的默认网关192.168.1.253(路由器R1的E0接口)。但是,这之前主机PC首先必须发送ARP请求,请求路由器R1的 E0(192.168.1.253)的MAC地址。

  当路由器R1收到此ARP请求包后,它首先用ARP应答包回答主机PC的ARP请求(通知主机PC:路由器R1自己的E0接口的MAC地址)。然后, 它(路由器R1)将此ICMP请求转发到路由器R2的E0接口:192.168.1.254(要求路由器R1正确配置了到网络 192.168.3.0/24的路由)。此外,路由器R1还要发送一个ICMP重定向消息给主机PC,通知主机PC对于主机PC请求的地址的网关是: 192.168.1.254。

  路由器R2此时会发送一个ARP请求消息请求主机PC的MAC地址,而主机PC会发送ARP应答消息给路由器R2。最后路由器R2通过获得的主机PC的MAC地址信息,将ICMP应答消息发送给主机PC。

  ICMP重定向包的内容如图2、图3所示。注意图2 ICMP包头中的Type和Code字段的值和含义。
 
  图2  ICMP重定向包
 

 
  图3  ICMP重定向包(续)
 
 
  如果还有后续的ICMP请求包,则除了ARP消息,所有的事件序列和上面的叙述相同。如下图所示。
 
何时重定向

a)  数据包的入接口和路由后的指定的出接口是同一个接口。
b)  数据包的源IP地址和该包应走的下一跳IP地址属于同一个网段。
c)  数据报非源路由的(这种情况应该比较少见了,源路由多见于Token Ring)。
d)  系统开启重定向功能。


重定向报文的处理


主机和路由器对于重定向报文有不同的处理原则。
路由器一般忽略ICMP重定向报文。而主机对于重定向报文的感知取决于操作系统。以Windows为例,对于网关返回的ICMP重定向报文,Windows会在主机的路由表中添加一项主机路由。那么以后对于这个目的地址数据报,主机会将其直接送往重定向所指示的路由器。支持重定向报文处理的还有许多的Unix系统,如FreeBSD的诸多版本等。这类主机收到ICMP重定向报文后所采取的行动基本都是增加主机路由。显然,修改默认网关是不合理的。
同时,有的操作系统对于重定向报文是不做任何处理而直接丢弃(虽然也同样经由网络层向上递交),比如Sun的某些系统。
某些主机可以启动路由器功能,如FreeBSD的某些版本和Win32系统。这时主机的行为要特殊一些,会施加一些特殊条件来判断是否处理该重定向报文,这是依系统而异的。比如BSD,它检查重定向报文的条件之一是“重定向报文不能让主机本身作为网关”。
 
ICMP重定向的利与弊


ICMP重定向使得客户端的管理工作大大减少,使得对于主机的路由功能要求大大降低。该功能把所有的负担推向路由器学习。但是与此同时ICMP重定向也有很多弊端。
就重定向本身的机制来说,ICMP重定向增加了网络报文流量,因为主机的报文总是要在网关的直连网段上重复传输。那么更进一步如果主机的操作系统支持重定向(比如Windows)会如何?如图1,而主机收到重定向报文,会在自己的路由表中产生指向B的主机路由,经由1.1.1.2。事实上,主机这样可能会引起两点显著问题。
其一是引起性能问题,例如:有一台大型的服务器,要处理数十个子网下的数千台主机的业务。如果要支持重定向,那么服务器将会维护一个庞大的充满主机路由的路由表。这是一笔很大的开销。可能很大程度上降低服务性能,甚至导致网络服务瘫痪。
其二是可能埋下安全隐患。利用这点可以进行攻击和网络窃听。如果目某主机A支持ICMP重定向,那么主机B发一个IMCP重定向给它,以后它发出的所有到指定地址的报文都会转发主机B,这样B就可以达到窃听目的了。当然,拿windows操作系统来说,它会对ICMP报文进行检查,如果这个重定向不是网关发送的,会被直接丢弃。不过伪造一个网关的数据包很容易。另外,如果刻意伪造许多虚假的ICMP重定向报文,主机路由表就可能被改的乱七八糟。


ICMP重定向的避免与消除


针对上述ICMP重定向引发的问题,我们可以采用一些手段来避免或补救。我们讨论的前提条件是不改变网络拓扑。


关掉ip redirects


在路由器上取消ip redirect。这样路由器不向主机发送ICMP重定向报文。或者当起动HSRP或VRRP的时候,ICMP重定向会被关掉。这是相当于一台路由器作备份。有效的避免出现ICMP重定向。该方案是看似根本上解决了问题,但是只是ICMP重定向报文不会发回主机,解决了安全和主机负荷的问题,网络上的流量却没有减少。


不同掩码长度子网划分


使用子接口来改变ICMP重定向条件。还是如图1,我们如下配置IP。
HostA: IP Addr = 1.1.1.12/24  Default Gateway = 1.1.1.2/24
RT1  E0/1 IP Addr = 1.1.1.254/25
RT2  E0/1 IP Addr = 1.1.1.2/24   E0/1.1(Sub interface) = 1.1.1.250/25
这种方法的基本思想是:破坏ICMP重定向的条件,哄骗路由器认为用户数据报的入接口和出接口不同。从HostA来看,RT1和RT2都在和自己直连的网段。如此配置从RT2来看,用户数据的入接口和出接口不在同一网段上,数据从1.1.1.2进入,从1.1.1.250路由出去,用户数据纯粹的被路由出去,这样就破坏了ICMP重定向的条件。而且RT2会认为自己的子接口E0/1.1和RT1的E0/1接口是在同一子网的。这种方式要求配置的技巧性比较强,但也并没有减少网络数据流量,只是在安全性和主机负荷上有所改进。


使用访问控制列表(ACL)


在高级的ACL中可以根据报文类型进行过滤,在我司设备上如下配置:
[Quidway]acl number 100 match-order auto
[Quidway-acl-adv-100]rule deny icmp fragment icmp-type net-redirect
[Quidway-Ethernet6/0]firewall packet-filter 100 outbound
在出接口上绑定ACL,过滤掉报文。这样做实事上减少了网络流量,保证了主机的安全性,减轻主机负荷。但是会消耗路由器的处理资源。

代理ARP

代理ARP的方法比较直接,干脆在RT1上启动代理ARP,让自己的。主机广播ARP请求后,网关RT1返回RT2的接口MAC地址。这种方法相当于修改了主机的默认网关。其后所有的流量都被导向RT2。这样可能会影响原来的业务需求。所以这种方法是不可取的。

我们走到哪里了

ICMP重定向的原理在很多文档里都有讲解,但是对于重定向而引发的问题(如本文列举网络流量问题、主机安全问题以及主机负荷问题)谈论比较少。在现实 组网中,许多问题都虽然看似细微,事实上却足以导致致命的错误。比如在某项目中,由于某服务器对于ICMP重定向不提供支持,而导致路由设备把所有的报文都送上CPU,进行转发,最终致使该网络设备宕机。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值