Understanding ICMP Redirection
1 预备知识
n
了解
ICMP
的基本内容
n
理解
VRRP
或
HSRP
工作原理
n
掌握基本的组网知识
n
了解访问控制列表(
ACL
)的基本概念
n
了解
IP
子接口的配置
2 ICMP重定向原理
2.1 ICMP重定向报文格式
ICMP
是
IP
层的一个组成部分,它传递差错报文以及其他需要注意的信息。
ICMP
报文通常被
IP
层或更高层协议使用。一些
ICMP
报文把差错报文返回给用户进程。任何
ICMP
差错报文的内容都要包括原来的
IP
报文首部,用以返回主机时能够令主机的应用进行判断分析。其他的字段依具体情况而定。对于重定向
ICMP
报文,其报文格式如下:
Byte 0
|
Byte 1
|
Byte 2
|
Byte 3
|
类型
|
代码
|
校验和
|
重定向网关
IP
|
原包的
IP
首部
|
源
IP
数据报前
8
个字节
|
重定向报文的类型为
5
,代码有效值为
0
到
3
。其中
0
代表网络重定向,
1
代表主机重定向,
2
代表服务类型和网络重定向,
3
代表服务类型和主机重定向。原则上,重定向报文是由路由器产生而供主机使用的。路由器默认发送的重定向报文也只是
1
或者
3
,只是对主机的重定向,而不是对网络的重定向。而主机本身不是路由器,所以这种
ICMP
重定向会导致网络流量的增大。
2.2 何时重定向
对于路由器来说,只有当如下条件同时满足的时候,才进行重定向:
a)
数据包的入接口和路由后的指定的出接口是同一个接口。
b)
数据包的源
IP
地址和该包应走的下一跳
IP
地址属于同一个网段。
c)
数据报非源路由的(这种情况应该比较少见了,源路由多见于
Token Ring
)。
d)
系统开启重定向功能。
具体例子如下:
图
1
ICMP
重定向组网图
两个路由器都开启了
IP
重定向功能。
HostA
的默认网关为
1.1.1.1
。当
HostA
要和不在同一网段中的
HostB
通信的时候,会把数据报递交给默认网关
RT1
。然而
RT1
经过查找发现到达
3.3.3.3
的路径下一跳恰恰是经由自己的
E0/1
口的
RT2
接口
1.1.1.2
。满足上述条件,将会发生重定向。
2.3 重定向报文的处理
主机和路由器对于重定向报文有不同的处理原则。
路由器一般忽略
ICMP
重定向报文。而主机对于重定向报文的感知取决于操作系统。以
Windows
为例,对于网关返回的
ICMP
重定向报文,
Windows
会在主机的路由表中添加一项主机路由。那么以后对于这个目的地址数据报,主机会将其直接送往重定向所指示的路由器。支持重定向报文处理的还有许多的
Unix
系统,如
FreeBSD
的诸多版本等。这类主机收到
ICMP
重定向报文后所采取的行动基本都是增加主机路由。显然,修改默认网关是不合理的。
同时,有的操作系统对于重定向报文是不做任何处理而直接丢弃(虽然也同样经由网络层向上递交),比如
Sun
的某些系统。
某些主机可以启动路由器功能,如
FreeBSD
的某些版本和
Win32
系统。这时主机的行为要特殊一些,会施加一些特殊条件来判断是否处理该重定向报文,这是依系统而异的。比如
BSD
,它检查重定向报文的条件之一是“重定向报文不能让主机本身作为网关”。
2.4 ICMP重定向的利与弊
ICMP
重定向使得客户端的管理工作大大减少,使得对于主机的路由功能要求大大降低。该功能把所有的负担推向路由器学习。但是与此同时
ICMP
重定向也有很多弊端。
就重定向本身的机制来说,
ICMP
重定向增加了网络报文流量,因为主机的报文总是要在网关的直连网段上重复传输。那么更进一步如果主机的操作系统支持重定向(比如
Windows
)会如何?如图
1
,而主机收到重定向报文,会在自己的路由表中产生指向
B
的主机路由,经由
1.1.1.2
。事实上,主机这样可能会引起两点显著问题。
其一是引起性能问题,例如:有一台大型的服务器,要处理数十个子网下的数千台主机的业务。如果要支持重定向,那么服务器将会维护一个庞大的充满主机路由的路由表。这是一笔很大的开销。可能很大程度上降低服务性能,甚至导致网络服务瘫痪。
其二是可能埋下安全隐患。利用这点可以进行攻击和网络窃听。如果目某主机
A
支持
ICMP
重定向,那么主机
B
发一个
IMCP
重定向给它,以后它发出的所有到指定地址的报文都会转发主机
B
,这样
B
就可以达到窃听目的了。当然,拿
windows
操作系统来说,它会对
ICMP
报文进行检查,如果这个重定向不是网关发送的,会被直接丢弃。不过伪造一个网关的数据包很容易。另外,如果刻意伪造许多虚假的
ICMP
重定向报文,主机路由表就可能被改的乱七八糟。
3 ICMP重定向的避免与消除
针对上述
ICMP
重定向引发的问题,我们可以采用一些手段来避免或补救。我们讨论的前提条件是不改变网络拓扑。
3.1 关掉ip redirects
在路由器上取消
ip redirect
。这样路由器不向主机发送
ICMP
重定向报文。或者当起动
HSRP
或
VRRP
的时候,
ICMP
重定向会被关掉。这是相当于一台路由器作备份。有效的避免出现
ICMP
重定向。该方案是看似根本上解决了问题,但是只是
ICMP
重定向报文不会发回主机,解决了安全和主机负荷的问题,网络上的流量却没有减少。
3.2 不同掩码长度子网划分
使用子接口来改变
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
接口是在同一子网的。这种方式要求配置的技巧性比较强,但也并没有减少网络数据流量,只是在安全性和主机负荷上有所改进。
3.3 使用访问控制列表(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
,过滤掉报文。这样做实事上减少了网络流量,保证了主机的安全性,减轻主机负荷。但是会消耗路由器的处理资源。
3.4 代理ARP
代理
ARP
的方法比较直接,干脆在
RT1
上启动代理
ARP
,让自己的。主机广播
ARP
请求后,网关
RT1
返回
RT2
的接口
MAC
地址。这种方法相当于修改了主机的默认网关。其后所有的流量都被导向
RT2
。这样可能会影响原来的业务需求。所以这种方法是不可取的。
3.5 我们走到哪里了
ICMP
重定向的原理在很多文档里都有讲解,但是对于重定向而引发的问题(如本文列举网络流量问题、主机安全问题以及主机负荷问题)谈论比较少。在现实组网中,许多问题都虽然看似细微,事实上却足以导致致命的错误。比如在某项目中,由于某服务器对于
ICMP
重定向不提供支持,而导致路由设备把所有的报文都送上
CPU
,进行转发,最终致使该网络设备宕机。
希望我们今后对于这类问题能够继续深入研究下去。
参考资料
1
华为
3COM
测试中心论坛讨论
2
《
TCP/IP
详解
卷一:协议》
Chapter 6, Chapter 9
3
“
Cisco When Are ICMP Redirects sent
”(
Paper
)
4
《
S5000
系列交换机操作手册》
Chapter 5