一. ICMP协议相关

1. ICMP协议

(1) 功能

ICMP,Internet控制报文协议,用于在IP主机、路由器之间传递控制消息,控制信息指网络通不通,主机是否可达,路由是否可用等等

比如我们ping百度

能够ping通就说明,你能连上外网,百度那面的服务器没问题,你的路由器,路由表没问题,你的DNS解析没问题……

我们随便ping一个IP

发现ping不通,由于我们上面能够ping通百度,说明我们这里应该是没有问题的,既然这次ping不通,就说明是对方的问题。这时就有两个可能,到达了目的方,没做响应;没到达目的方。

我们搜一下这个IP

这个是一个美国IP,我还用了VPN,这还是个外网IP,按道理是能ping通的,我们访问一下

可以看见,是对面网站出了问题。

(2) 封装结构

ICMP是网络层协议,封装在传输层与网络层之间,它的封装结构如下

我们抓个包来看一下它的报文

可以看到这个报文还是比较简单的。

2. ICMP报文格式

这里面有两个是’Type’和’Code’,这两个通常一起来看

‘8,0’组合的都是请求报文,比如上面那张图展示的Type是8,Code为0

我们看一下响应的Type

可以看待,响应的报文中的Type就是’0’,Code为’0’,**’0,0’组合代表比较正常的应答**

我们再看一个不正常的

这个的Type是’3’,说明’目的地不可达’,Code为’3’代表端口不可达

‘3,3’组合就是说目标不可达,或者说端口不可达

还有的是 ‘11,0’,代表’生存时间为0’,说白了就是超时了,比如下图

还有的是 ‘3,1’,代表目标不可达,或者说是主机不可达,如下图

除此之外,还有

  • ‘5,0’代表网络重定向
  • ‘5,1’代表主机重定向

当Type等于13时,代表是时间戳请求,等于14时代表是时间戳应答

二. ICMP重定向

1. ICMP重定向简介

(1) 正常情况

现在有这样的一个网络

我们现在想要主机访问 192.168.2.1,你们觉得能不能访问到?

很明显访问不到,因为’192.168.1.10’访问外网的时候,会将自己的数据交给网关,即’192.168.1.254’那台R2路由器,而R2连的是’192.168.3.1’,没连’192.168.2.1’,路由表里就没有’192.168.2.1’的条目,所以主机是访问不了’192.168.2.1’的。

那这个时候怎么办,我们在R2上面配置一条路由,’192.168.1.253’对应’192.168.3.1’,这样数据传递就成了这样。

主机192.168.1.10访问192.168.3.1,数据交给网关R2,然后R2看路由表,发现192.168.3.1对应192.168.1.253,然后把数据交给R1,然后再交给192.168.3.1。

我们这里是通过R1把数据交给了R2,这个过程有点麻烦,于是就有了重定向。

(2) 重定向

重定向是这样的

这张图,我们知道R1无法发送数据给 192.168.3.1 ,于是我们在R1设置了一条路由,将数据指向R2

假如 192.168.1.10 向 192.168.3.1 发送4个ICMP包,第一次的时候会发给自己的网关R1,但是R1无法发送给 192.168.3.1。

这个时候R1会看路由表,发现R2能发,就会发送一个重定向的包给主机。

主机接收后,以后的数据就会直接发给R2.

就是说第一次的包发给R1,后面三次的包是直接发给R2的。

所以ICMP重定向就是:在某些特定情况下,路由器检测到主机使用非优化路由时候,会向主机发送一个ICMP重定向报文,是主机的路由改变

如果有一个攻击方将主机的路由给重定向了,就可能导致主机无法通信

比如这样

攻击方把主机路由重定向到192.168.1.200,这样就实现了一个ICMP重定向攻击。当我们把它重定向到其他的地方,就会造成无法访问的情况。

2. 实验模拟

(1) 环境配置

在GNS3中配置这样的一个网络

然后我们用虚拟机来模拟一台主机,GNS3可以连虚拟机

设置为主机模式

进入系统后配置IP

(2) 实验开始

我们在主机上ping一下网关和另一台路由器,都是一个网段的,应该都能ping通

我们ping一下3.1,应该是ping不通的。

我们开启抓包

现在我们想要让主机ping通3.1怎么办呢?我们可以直接在R1上配置一条路由,使得通过R1,转发给R2再转发给R2

1
2
conf t
ip route 192.168.3.0 255.255.255.0 192.168.1.253

我们再用主机ping一下3.1

可以看到现在ping通了。

不过这里第一次请求超时了。

(3) 观察数据包

我们看一下抓的包

1、链路1(主机到交换机)

我们先看主机到交换机的这条链路

就是这条链路

我们最开始的时候,ICMP请求失败,然后返回了一个’5,0’的响应,这个上面讲了,代表网络重定向

我们看下一个请求

可以看到返回’8,0’请求成功。

2、链路2(交换机到R1)

我们看一下左面的那条链路

就是这条,我们看一下抓包

这里就两个,一开始 192.68.1.10 请求 192.168.3.1,没通,然后它发现自己的路由表中有一个和 192.168.3.1 相关的路由条目,做了一个重定向的响应,然后返回给了主机。

之后根据路由表找到 192.168.3.1 对应的是 192.168.1.253,然后R1马上广播。

“谁的IP地址是 192.168.1.253,把你的MAC地址发过来。””

然后就转过去了。

3、链路3(交换机和R2)

我们看一下右面的那条链路

我们分析数据包

这个就简单了,正常的ICMP。数据就不经过R1,直接发给R2了。

(4) 看主机路由表

我们看一下主机的路由表

发现了一个问题,我们这个路由表还是 192.168.1.254 对应 192.168.1.10。

所以重定向的路由时不会写道主机的路由表中,只有当路由器发送了一个重定向报文后,后续的请求才会进行重定向。