ICMP是“InternetControlMessageProtocol”(因特网控制消息协议)的缩写。它是
TCP/IP协议族的一个子协议,用于在IP主机、
路由器之间传递控制消息。控制消息是指
网络通不通、
主机是否可达、路由是否可用等网络本身的消息。这些控制消息虽然并不传输用户数据,但是对于用户数据的传递起着重要的作用。
简介
ICMP协议是一种
面向连接的协议,用于传输出错报告控制信息。它是一个非常重要的协议,它对于网络安全具有极其重要的意义。
它是TCP/IP协议族的一个子协议,属于
网络层协议,主要用于在主机与路由器之间传递控制信息,包括报告错误、交换受限控制和状态信息等。当遇到
IP数据无法访问目标、IP路由器无法按当前的传输速率转发数据包等情况时,会自动发送ICMP消息。
ICMP提供一致易懂的出错报告信息。发送的出错报文返回到发送原数据的设备,因为只有发送设备才是出错报文的逻辑接受者。发送设备随后可根据ICMP报文确定发生错误的类型,并确定如何才能更好地重发失败的数据包。但是ICMP唯一的功能是报告问题而不是纠正错误,纠正错误的任务由发送方完成。
我们在网络中经常会使用到
ICMP协议,比如我们经常使用的用于检查网络通不通的
Ping命令(Linux和Windows中均有),这个“Ping”的过程实际上就是ICMP协议工作的过程。还有其他的
网络命令如
跟踪路由的
Tracert命令也是基于ICMP协议的。
协议内容
ICMP的全称是
InternetControl Message Protocol 。从技术角度来说,ICMP就是一个“错误侦测与回报机制”,其目的就是让我们能够检测网路的连线状况﹐也能确保连线的准确性﹐其功能主要有:
· 侦测远端主机是否存在。
· 重导资料传送路径。
ICMP在沟通之中,主要是透过不同的
类别(Type)与
代码(Code) 让机器来识别不同的连线状况。常用的类别如下表所列﹕ ICMP 是个非常有用的协议﹐尤其是当我们要对网路连接状况进行判断的时候。下面让我们看看常用的 ICMP 实例,以更好了解 ICMP 的功能与作用。
重要性
Internet 控制信息协议(ICMP)是 IP 组的一个整合部分。通过 IP 包传送的 ICMP 信息主要用于涉及网络操作或错误操作的不可达信息。ICMP 包发送是不可靠的,所以主机不能依靠接收 ICMP 包解决任何网络问题。
ICMP协议对于网络安全具有极其重要的意义。ICMP协议本身的特点决定了它非常容易被用于攻击网络上的路由器和主机。例如,在1999年8月海信集团“悬赏”50万元人民币测试防火墙的过程中,其防火墙遭受到的ICMP攻击达334050次之多,占整个攻击总数的90%以上!可见,ICMP的重要性绝不可以忽视!
比如,可以利用操作系统规定的
ICMP数据包最大尺寸不超过64KB这一规定,向主机发起“Ping of Death”(死亡之Ping)攻击。“Ping of Death” 攻击的原理是:如果ICMP数据包的尺寸超过64KB上限时,主机就会出现内存分配错误,导致TCP/IP堆栈崩溃,致使主机死机。
此外,向目标主机长时间、连续、大量地发送ICMP数据包,也会最终使系统瘫痪。大量的ICMP数据包会形成“ICMP风暴”,使得目标主机耗费大量的CPU资源处理,疲于奔命。
技术细节
ICMP消息是在IP层,通常是从一个普通的产生了ICMP响应的IP
数据报中生成的。IP把适当的ICMP消息用一个新的档头(header)封装起来(以把ICMP消息送回原来的发送者),然后把产生的数据报用常规的方式传送回去。
例如,每台转发
IP数据报的机器(例如途中的路由器)都要把IP
报头中的
TTL(time to
live)减1,如果TTL减为了0,一个ICMP超时消息就会被发送到数据报的源发送者。
每个ICMP消息都是直接封装在一个
IP数据报中的,因此,和UDP一样,ICMP是不可靠的。
虽然ICMP是包含在IP数据报中的,但是对ICMP消息通常会特殊处理,会和一般IP数据报的处理不同,而不是作为IP的一个子协议来处理。在很多时候,需要去查看ICMP消息的内容,然后发送适当的错误消息到那个原来产生IP数据包的程序,即那个被提示一个ICMP消息的程序。
很多常用的工具是基于ICMP消息的。traceroute是通过发送包含有特殊的TTL的包,然后查找ICMP超时消息和目标不可达消息来实现的。和traceroute相关的
ping校验算法
以下代码在Visual Studio 2008 + Windows 7下调试通过。
lpsz指定要计算的数据包首地址,_dwSize指定该数据包的长度。
int CalcCheckSum(
char* lpsz,DWORD _dwSize)
{
int dwSize;
{
mov ecx,_dwSize
shr ecx,1
read: //所有
word相加,保存至EBX寄存器
lodsw
loop read
test_dwSize,1 //校验数据是否是奇数位的
lodsb
movzx eax,al
add ebx,eax
calc:
mov eax,ebx //高低位相加
and eax,0ffffh
shr ebx,16
add eax,ebx
not ax
mov dwSize,eax
}
return dwSize;
}
ICMP部分的结构
报头
ICMP报头从IP报头的第160位开始(除非使用了IP报头的可选部分)。
Type- ICMP的类型;
Code- 进一步划分ICMP的类型;例如,ICMP的目标不可达类型可以把这个位设为1至15等来表示不同的意思。
Checksum- 这个字段包含有从ICMP报头和数据部分计算得来的,用于检查错误的数据,with
value0 for this
field.
ID- 这个字段包含了ID值,在ECHO REPLY类型的消息中要返回这个字段。
Sequence- 这个字段包含一个序号,同样要在ECHO REPLY类型的消息中要返回这个字段。
填充数据
填充的数据紧接在ICMP报头的后面(以8位为一组):
基本简介
ICMP协议是一种
面向无连接的协议,用于传输出错报告控制信息。它是一个非常重要的协议,它对于
网络安全具有极其重要的意义。
它是
TCP/IP协议族的一个子协议,属于
网络层协议,主要用于在主机与路由器之间传递控制信息,包括报告错误、交换受限控制和状态信息等。当遇到IP数据无法访问目标、IP路由器无法按当前的传输速率转发
数据包等情况时,会自动发送ICMP消息。
ICMP提供一致易懂的出错报告信息。发送的出错报文返回到发送原数据的设备,因为只有发送设备才是出错报文的逻辑接受者。发送设备随后可根据ICMP报文确定发生错误的类型,并确定如何才能更好地重发失败的数据包。但是ICMP唯一的功能是报告问题而不是纠正错误,纠正错误的任务由发送方完成。
我们在网络中经常会使用到ICMP协议,比如我们经常使用的用于检查
网络通不通的
Ping命令(Linux和Windows中均有),这个“Ping”的过程实际上就是ICMP协议工作的过程。还有其他的
网络命令如
跟踪路由的
Tracert命令也是基于ICMP协议的。
防御方法
选择合适的防火墙
有效防止ICMP攻击,防火墙应该具有状态检测、细致的数据包完整性检查和很好的过滤规则控制功能。
状态检测防火墙通过跟踪它的连接状态,动态允许外出数据包的响应信息进入防火墙所保护的网络。例如,状态检测防火墙可以记录一个出去的 PING(ICMP Echo Request),在接下来的一个确定的时间段内,允许目标主机响应的ICMP Echo Reply直接发送给前面发出了
PING命令的IP,除此之外的其他ICMP Echo Reply消息都会被防火墙阻止。与此形成对比的是,包过滤类型的防火墙允许所有的ICMP Echo Reply消息进入防火墙所保护的网络了。许多路由器和基于
Linux内核2.2或以前版本的
防火墙系统,都属于包过滤型,用户应该避免选择这些系统。
新的攻击不断出现,防火墙仅仅能够防止已知攻击是远远不够的。通过对所有数据包进行细致分析,删除非法的数据包,防火墙可以防止已知和未知的
DoS攻击。这就要求防火墙能够进行数据包
一致性检查。
安全策略需要针对ICMP进行细致的控制。因此防火墙应该允许对ICMP类型、
代码和包大小进行过滤,并且能够控制连接时间和ICMP包的生成速率。
配置防火墙以预防攻击
一旦选择了合适的防火墙,用户应该配置一个合理的安全策略。以下是被普遍认可的防火墙安全配置惯例,可供
管理员在系统安全性和易用性之间作出权衡。
防火墙应该强制执行一个缺省的拒绝策略。除了出站的ICMP Echo Request、出站的ICMP Source Quench、进站的TTL Exceeded和进站的ICMP Destination Unreachable之外,所有的ICMP消息类型都应该被阻止。
详细分析
下面是针对每个ICMP消息类型的过滤规则的详细分析。
Echo Request和Reply(类型8和0):
允许Echo Request消息出站以便于内部用户能够PING一个远程主机。阻止入站Echo Request和出站Echo Reply可以防止外部网络的主机对
内部网络进行扫描。如果您使用了位于外部网络的监视器来监视内部网络,就应该只允许来自于特定外部IP的Echo Request进入您的网络。限制ICMP Echo包的大小可以防止“Ping Floods”攻击,并且可以阻止那些利用Echo Request和Reply来“偷运”数据通过防火墙的
木马程序。
Destination unreachable (类型3):
允许其入站以便于内部网用户可以使用traceroute。需要注意的是,有些攻击者可以使用它来进行针对会话的
DoS攻击,如果您曾经历过类似的攻击,也可以阻止它。阻止出站的ICMP Destination unreachable消息,因为它可能会泄漏内部网络的结构。不过有一个例外,对于那些允许外部网络通过TCP访问的内部主机(如位于
DMZ区的Web 服务器)发出的Destination unreachable,则应该允许它通过。为了能够支持“Path MTU Discovery”,您应该允许出站的“Packet Too Big”消息(类型3,代码4)到达那些主机。
Source quench(类型4):
阻止其入站,因为它可以作为一种DoS攻击,能够降低发送者的发送速度。允许其出站以便于内部主机能够控制发送端发送数据的速度。有些防火墙会忽略所有直接发送到防火墙
端口的Source Quench消息,以防止针对于防火墙的DoS攻击。
Redirect(类型5,9,10):
Redirect、Router announcement、 Router selection(类型5,9,10):这些消息都存在潜在危险,因为它们可以用来把数据
重定向到攻击者的机器。这些消息都应该被阻止。
TTL exceeded(类型11):
允许其进站以便于内部用户可以使用traceroute。“firewalking”使用很低的
TTL值来对网络进行扫描,甚至可以通过防火墙对内网进行扫描,所以应该禁止其出站。一些防火墙可以阻止TTL值小于设定值的数据包进入防火墙。
Parameter problem(类型12):
禁止其入站和出站。通过使用一个能够进行数据包
一致性检查的防火墙,错误和恶意的数据包都会被阻塞。