故障二:ICMP Redirect
  这是个什么问题呢?首先给大家描述一下。虽然路由器在运行时没有出现明显的异常现象,但是却经常看到这样的日志:
   Jul 09 15:54:21 %ACL_LOG-I-PERMIT, ACL [out]
  on "uplink" ICMP 209.24.79.200 -> 219.157.38.52
  Jul 09 15:54:21 %ACL_LOG-I-PERMIT, ACL [out]
  on "uplink" ICMP 209.24.79.200 -> 219.167.139.16
  Jul 09 15:54:21 %ACL_LOG-I-PERMIT, ACL [out]
  on "uplink" ICMP 209.24.79.200 -> 61.132.1.43
  Jul 09 15:54:23 %ACL_LOG-I-PERMIT, ACL [out]
  on "uplink" ICMP 209.24.79.200 -> 24.232.18.109
  Jul 09 15:54:23 %ACL_LOG-I-PERMIT, ACL [out]
  on "uplink" ICMP 209.24.79.200 -> 211.146.112.211
  …………………….
  其中“209.24.79.200”是路由器的上联接口地址,我不知道为什么会出现这么多从路由器发到这些没有规律的IP的ICMP数据包。查查这些IP,有的来自国内各省,有的来自日本,有的来自美国、阿根廷、新加坡,毫无规律。难道是有人在***路由器?或者是内部有肉机被人用来***?而且奇怪的是只有出去的数据包的记录,却没有记录进入的数据包?
  说起ICMP,大家肯定是熟悉不过的了。最常见的ping命令就是使用ICMP的。ICMP的全称是Internet Control Message Protocol(网间报文控制协议),它是IP不可分割的一部分,用来提供错误报告。一旦发现各种错误类型就将其返回原主机,基于ICMP的***方法也多种多样。到底是什么原因导致生成这样的日志?让我带大家一起来查一查。
我校的拓扑结构是一个简单的星型结构,中心节点就是一台三层交换式路由器(Enterasys 公司的×××8000)。其中一个端口上联到CERNET,其他端口都是内部连接,且为内部网络基于端口划分了多个VLAN。为了查看该信息是否从网络内部发出,又给内部VLAN的各个接口设置了日志,还是没有相关的ICMP记录(原先的日志只是记录上联接口的数据)。排除了内部计算机发出ICMP数据包的可能,那问题就可能出现在上联接口上,而日志记录只能记录到协议层的信息,不能记录更深层次的数据包。如何查看上联接口的数据包呢,比较方便的方法就是使用端口镜像功能,利用连接在镜像端口上的计算机来抓取和分析数据包。
  首先下载数据包分析软件WINDUMP(下载地址:http://windump.polito.it)。在A计算机上,安装之,然后连接到将要镜像的RJ45端口上。再在B计算机上,也安装WINDUMP,并连接到当前的VLAN1(网关:222.222.222.1,掩码:255.255.255.0)中。
  一切准备就绪后,接着就是开始端口镜像。使用计算机B登录到路由器,进入配置模式,输入以下命令:
   ×××(config)# port mirroring dst-ports et.1.3 src-ports gi.4.1
  上面的命令把上联端口(gi.4.1)镜像到目标端口(et.1.3),目标端口就是计算机A连接的端口。在计算机A上,进入DOS提示符,转到WINDUMP所在的目录,输入命令:
   C:> WINDUMP –N
  windump30alpha: listening on DeviceNPF_{911DB410-C01E-49E8-B524-50132C6A56A8}
  ………
  15:57:17.516203 IP 222.222.222.17.80 > 221.215.142.50.1264:
  . 46721:48181(1460) ack 0 win 16336 (DF)
  15:57:17.516337 IP 222.222.222.17.80 > 221.215.142.50.1264:
. 48181:49641(1460) ack 0 win 16336 (DF)
  15:57:17.518043 IP 220.198.22.202.3196 > 222.222.222.99.8882:
  . 137236:138676(1440) ack 260501 win 64800 (DF)
  15:57:17.518162 IP 218.79.246.212.64627 > 222.222.222.191.16881:
  S 2898301189:2898301189(0) win 64240 (DF)
  15:57:17.518558 IP 209.24.79.200> 218.79.246.212: icmp 36:
  host 222.222.222.191 unreachable (DF)
  ………..
  (上面的记录已做过筛选。第一句的参数“-N”表示IP地址或者端口号转换为主机名或端口名,第二句表示windump开始在所选网卡上监听,第三句开始就是WINDUMP记录的信息。)
  同样在计算机B上也运行WINDUMP:
   C:> WINDUMP –N
  windump30alpha: listening on DeviceNPF_{911DB410-C01E-49E8-B524-50132C6A56B4}
  …………
  15:57:54.695935 arp who-has 222.222.222.191 tell 222.222.222.1
  15:57:55.191475 arp who-has 222.222.222.136 tell 222.222.222.1
  15:57:57.033354 arp who-has 222.222.222.210 tell 222.222.222.1
  15:57:57.039057 arp who-has 222.222.222.69 tell 222.222.222.1
  …………(已作筛选)
  查看路由器上的日志,我任意找到其中一条关于ICMP的记录:
  Jul 09 15:51:50 %ACL_LOG-I-PERMIT, ACL [out]
  on "uplink" ICMP 210.29.42.70 -> 218.79.246.212
  经查,在计算机A上采集的数据中,有几条记录(最后两条)包含“218.79.246.212”的IP和此记录匹配。从这两句的记录来看,第一行表明从218.79.246.212的tcp端口64627向222.222.222.191的16881端口发送报文。S标志表明设置了SYN标志,报文的流序号是2898301189,没有数据,有效的接收窗口是4096字节,最大段大小(max-segment-size)的选项,请求设置mss为1452字节。很明显,这是一个请求报文。而第二句表明路由器给218.79.246.212返回了一个“unreachable(主机不可达)”ICMP 信息。这说明在这个网段中没有找到IP地址为“222.222.222.191”的计算机。
 原来,当路由器接收到一个不知道IP地址(也就是说,路由器不知道目标路由)的数据包时,它会尝试发送ARP广播来解析,如果有目标主机回应这个ARP广播,则路由器会把数据包转发给目标主机。如果路由器没有接收到回应,它将会为接下来的4个数据包发送ARP请求,如果当第6个数据包到达时,还没有解析出目标主机的MAC地址,默认情况下,路由器将会在接下来的20秒钟内丢弃第6个以及后续的数据包,并且返回“主机不可达”的ICMP信息给源主机。
  从计算机B的记录中的第一句也可以得到证明,路由器向该网段中发出一个ARP查询,查找IP为“222.222.222.191”的计算机,结果没有计算机相应,路由器则认为该网段中没有目标主机,所以返回一个ICMP信息给源计算机说明目标主机不可到达,以通知源主机这里存在问题,同时丢弃原始数据包。
  至此问题已经明朗,原来路由器记录的ICMP都是路由器发送给源地址的“Destination Unreachable”信息。那么为什么这些外面的IP地址会找校内的计算机呢?从采集的数据分析不难发现,这些外部主机主要是找内部的固定的三个计算机。经过历史日志的检查,可以发现这三台计算机的主要相同的记录:
   07:52:19 Jul 09 07:50:02 %ACL_LOG-I-PERMIT, ACL [out]
  on "uplink" TCP 222.222.222.136:3159 -> 61.173.209.101:6881
  08:00:15 Jul 09 07:53:50 %ACL_LOG-I-DENY, ACL [out]
  on "uplink" TCP 222.222.222.12:3194 -> 219.121.133.197:6883
  08:00:15 Jul 09 07:57:59 %ACL_LOG-I-DENY, ACL [out]
  on "uplink" TCP 222.222.222.220:3196 -> 210.238.6.177:6881 
这三台主机连接目标主机的端口固定在6881到6889之间,而这些端口正是现在比较流行的BT下载的常用端口。难怪以前没有出现过此类日志,直到最近BT流行时,才出现的。主要原因是,这些主机使用BT下载时,在BT服务器上留下了记录,以便其他的主机到这些主机上下载资源,而当这些主机关机后,路由器就告诉它们找不到这些主机了。
  由于日志服务所记录的是第三层以上的信息,而路由器接收到的数据包在第二层上就被丢弃了,所以没有在日志中记录这些输入的异常数据包。为了减少路由器的日志量,在配置模式下使用“ip disable icmp-messages destination-unreachables”来禁止此类信息的转发。
  这两个故障均由ICMP引发,而且从某种角度上讲都不是系统配置上的问题,而是由于外部因素引起的。此类故障需要我们经过一定的分析才能查出原因,再作相应的配置才能排除故障。