ICMP协议(Internet Control Message Protocol)

转:http://blog.csdn.net/qy532846454/article/details/5384086

ICMP协议是一种发送各种消息报告状态的协态,与IP协议一样属于网络层

  报文格式:

        

  完整的Type表:

               

  1. ICMP Echo

      作用:探测主机地址是否存活

   回送消息

         

   回送响应消息

         

 

  2. 超时报文

  作用:通知源主机超时信息

      

  Code: 0 - 由网关发送;网关在处理数据报时发现生存周期为0,则此数据报必须抛弃,通过超时信息通知源主机

      1 - 由主机发送;主机在组装分段的数据报时因为丢失段未能在规定时间内组装数据,此数据报必须抛弃,发送超时信息通知源                     主机

 

  3. 目标主机不可达报文

  

  Code: 0 - 网络不可达;指定的网络不可达,由网关发送不可达信息

      1 - 主机不可达;网关决定目的主机不可达,由网关发送不可达信息

      2 - 协议不可用;在目的主机,因指定协议模块不可用,由目的主机发送不可达信息

      3 - 端口不可达;在目的主机,因进程端口不可用,由目的主机发送不可达信息

      4 - 需要段和DF设置;当数据报必须分段传送,但“不可分段”位设置,网关发送不可达信息

      5 - 源路由失败

 

  4. 重定向报文

  作用:当路由器的接口收到报文,又要从该接口转发出去的时候,则向主机发送ICMP重定向报文,通知该主机在主机路由表上加上一条主机路由

      

  Code: 0 - 网络重定向

      1 - 主机重定向

      2 - 服务类型和网络重定向

      3 - 服务类型和主机重定向

 

  5. 时间戳报文

  作用:允许系统向另一个系统查询当前的时间

   时间戳请求

   

    请求端填写发起时间戳

 

   时间戳应答

   

    应答系统收到请求报文时填写接收时间戳;发送应答时填写发送时间戳

 

   6. 路由器通告

   作用:路由器发现使用ICMP路由器通告及路由器请求信息,允许主机发现子网上运作的路由器地址

    路由器请求

        

 

    路由器通告

    

     Num Addrs - 信息中广告的路由器地址号。

 

      Addr Entry Size - 具有32位字信息的每个路由器地址号(本协议中是2)。

              Lifetime - 路由器有效时间最大值。

              Router Address[i] - 在发送信息的 i = 1..Num Addrs 接口发送路由器的 IP 地址。

              Preference Level[i] - 每个路由器地址[i] i = 1..Num Addrs 作为缺省路由器地址,与同一子网中的其它路由器相关。

 

 关于CheckSum

 

 

   首先要注意的起止位置,从Type字段开始,到数据部分结束

          

   每16bit为单位求和(此时CheckSum字段应设为全0),高低位相加[与RFC不一样???],然后取反得到

   经典的计算公式:

 

  1. unsigned short chksum(addr,len)      
  2.     unsigned short *addr;  /* 校验数据开始地址(注意是以2字节为单位) */      
  3.     int len;                /* 校验数据的长度大小,以字节为单位 */  
  4. {     
  5.     int sum = 0;        /* 校验和 */      
  6.     int nleft = len;    /* 未累加的数据长度 */      
  7.     unsigned short *p;  /* 走动的临时指针,2字节为单位 */      
  8.     unsigned short tmp = 0; /* 奇数字节长度时用到 */      
  9.    while( nleft > 1)      
  10.    {          
  11.        sum += *p++;    /* 累加 */          
  12.        nleft -= 2;      
  13.     }      
  14.    if(nleft == 1)      /* 奇数字节长度 */      
  15.    {          
  16.        *(unsigned char *)&tmp = *(&(unsigned char *)p); /* 将最后字节压如2字节的高位 */         
  17.        sum += tmp;      
  18.    }     
  19.     sum += (sum >> 16) + (sum & 0xffff);    /* 高位低位相加 */      
  20.     sum += sum >> 16;                       /* 上一步溢出时,将溢出位也加到sum中 */      
  21.     tmp = ~sum;     /* 注意类型转换,现在的校验和为16位 */       
  22.     return tmp;  
  23. }  

 

 数据结构

  主要用到的是IP和ICMP的数据结构,包含的头文件是<netinet/ip.h>和<netinet/ip_icmp.h>

 

  1. struct ip  
  2.   {  
  3. #if __BYTE_ORDER == __LITTLE_ENDIAN  
  4.     unsigned int ip_hl:4;       /* header length */  
  5.     unsigned int ip_v:4;        /* version */  
  6. #endif  
  7. #if __BYTE_ORDER == __BIG_ENDIAN  
  8.     unsigned int ip_v:4;        /* version */  
  9.     unsigned int ip_hl:4;       /* header length */  
  10. #endif  
  11.     u_int8_t ip_tos;            /* type of service */  
  12.     u_short ip_len;         /* total length */  
  13.     u_short ip_id;          /* identification */  
  14.     u_short ip_off;         /* fragment offset field */  
  15. #define IP_RF 0x8000            /* reserved fragment flag */  
  16. #define IP_DF 0x4000            /* dont fragment flag */  
  17. #define IP_MF 0x2000            /* more fragments flag */  
  18. #define IP_OFFMASK 0x1fff       /* mask for fragmenting bits */  
  19.     u_int8_t ip_ttl;            /* time to live */  
  20.     u_int8_t ip_p;          /* protocol */  
  21.     u_short ip_sum;         /* checksum */  
  22.     struct in_addr ip_src, ip_dst;  /* source and dest address */  
  23.   };  
  24. struct icmp  
  25. {  
  26.   u_int8_t  icmp_type;  /* type of message, see below */  
  27.   u_int8_t  icmp_code;  /* type sub code */  
  28.   u_int16_t icmp_cksum; /* ones complement checksum of struct */  
  29.   union  
  30.   {  
  31.     u_char ih_pptr;     /* ICMP_PARAMPROB */  
  32.     struct in_addr ih_gwaddr;   /* gateway address */  
  33.     struct ih_idseq     /* echo datagram */  
  34.     {  
  35.       u_int16_t icd_id;  
  36.       u_int16_t icd_seq;  
  37.     } ih_idseq;  
  38.     u_int32_t ih_void;  
  39.     /* ICMP_UNREACH_NEEDFRAG -- Path MTU Discovery (RFC1191) */  
  40.     struct ih_pmtu  
  41.     {  
  42.       u_int16_t ipm_void;  
  43.       u_int16_t ipm_nextmtu;  
  44.     } ih_pmtu;  
  45.     struct ih_rtradv  
  46.     {  
  47.       u_int8_t irt_num_addrs;  
  48.       u_int8_t irt_wpa;  
  49.       u_int16_t irt_lifetime;  
  50.     } ih_rtradv;  
  51.   } icmp_hun;  
  52. #define icmp_pptr   icmp_hun.ih_pptr  
  53. #define icmp_gwaddr icmp_hun.ih_gwaddr  
  54. #define icmp_id     icmp_hun.ih_idseq.icd_id  
  55. #define icmp_seq        icmp_hun.ih_idseq.icd_seq  
  56. #define icmp_void   icmp_hun.ih_void  
  57. #define icmp_pmvoid icmp_hun.ih_pmtu.ipm_void  
  58. #define icmp_nextmtu    icmp_hun.ih_pmtu.ipm_nextmtu  
  59. #define icmp_num_addrs  icmp_hun.ih_rtradv.irt_num_addrs  
  60. #define icmp_wpa    icmp_hun.ih_rtradv.irt_wpa  
  61. #define icmp_lifetime   icmp_hun.ih_rtradv.irt_lifetime  
  62.   union  
  63.   {  
  64.     struct  
  65.     {  
  66.       u_int32_t its_otime;  
  67.       u_int32_t its_rtime;  
  68.       u_int32_t its_ttime;  
  69.     } id_ts;  
  70.     struct  
  71.     {  
  72.       struct ip idi_ip;  
  73.       /* options and then 64 bits of data */  
  74.     } id_ip;  
  75.     struct icmp_ra_addr id_radv;  
  76.     u_int32_t   id_mask;  
  77.     u_int8_t    id_data[1];  
  78.   } icmp_dun;  
  79. #define icmp_otime  icmp_dun.id_ts.its_otime  
  80. #define icmp_rtime  icmp_dun.id_ts.its_rtime  
  81. #define icmp_ttime  icmp_dun.id_ts.its_ttime  
  82. #define icmp_ip     icmp_dun.id_ip.idi_ip  
  83. #define icmp_radv   icmp_dun.id_radv  
  84. #define icmp_mask   icmp_dun.id_mask  
  85. #define icmp_data   icmp_dun.id_data  
  86. };  

 


ICMP的重要性

  ICMP协议对于网络安全具有极其重要的意义。ICMP协议本身的特点决定了它非常容易被用于攻击网络上的 路由器主机。例如,在1999年8月 海信集团“悬赏”50万元人民币测试 防火墙的过程中,其防火墙遭受到的ICMP攻击达334050次之多,占整个攻击总数的90%以上!可见,ICMP的重要性绝不可以忽视!
  比如,可以利用 操作系统规定的ICMP数据包最大尺寸不超过64 KB这一规定,向主机发起“Ping of Death”( 死亡之Ping)攻击。“Ping of Death” 攻击的原理是:如果ICMP数据包的尺寸超过64KB上限时,主机就会出现 内存分配错误,导致TCP/IP堆栈崩溃,致使主机死机。(现在的操作系统已经取消了发送ICMP数据包的大小的限制,解决了这个漏洞)
  此外,向目标主机长时间、连续、大量地发送ICMP数据包,也会最终使系统瘫痪。大量的ICMP数据包会形成“ICMP风暴”,使得目标主机耗费大量的CPU资源处理,疲于奔命。

编辑本段ICMP校验和算法

  以下代码在Visual Studio 2008 + Windows 7下调试通过。
  lpsz指定要计算的数据包首地址,_dwSize指定该数据包的长度。
  int CalcCheckSum(char* lpsz,DWORD _dwSize)
  {
  int dwSize;
  __asm // 嵌入汇编
  {
  mov ecx,_dwSize
  shr ecx,1
  xor ebx,ebx
  mov esi,lpsz
  read: //所有word相加,保存至EBX寄存器
  lodsw
  movzx eax,ax
  add ebx,eax
  loop read
  test _dwSize,1 //校验数据是否是奇数位的
  jz calc
  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协议给 黑客以可乘之机,但是ICMP攻击也并非无药可医。只要在日常 网络管理中未雨绸缪,提前做好准备,就可以有效地避免ICMP攻击造成的损失。
  对于“Ping of Death”攻击,可以采取两种方法进行防范:第一种方法是在路由器上对ICMP数据包进行 带宽限制,将ICMP占用的带宽控制在一定的范围内,这样即使有ICMP攻击,它所占用的带宽也是非常有限的,对整个网络的影响非常少;第二种方法就是在主机上设置ICMP数据包的处理规则,最好是设定拒绝所有的ICMP数据包。
  设置ICMP数据包处理规则的方法也有两种,一种是在操作系统上设置包过滤,另一种是在主机上安装防火墙。具体设置如下:

1.在Windows 2000 Server中设置ICMP过滤

   Windows 2000 Server提供了“路由与远程访问”服务,但是默认情况下是没有启动的,因此首先要启动它:点击“ 管理工具”中的“路由与远程访问”,启动设置向导。在其中选择“手动配置服务器”项,点击[下一步]按钮。稍等片刻后,系统会提示“路由和 远程访问服务现在已被安装。要开始服务吗?”,点击[是]按钮启动服务。
  
  

图1

服务启动后,在 计算机名称的分支下会出现一个“IP路由选择”,点击它展开分支,再点击“常规”,会在右边出现服务器中的网络连接(即 网卡)。用 鼠标右键点击你要配置的网络连接,在弹出的菜单中点击“属性”,会弹出一个网络连接属性的窗口,如图1所示。
  图1中有两个按钮,一个是“输入筛选器”(指对此服务器接受的数据包进行筛选),另一个是“输出筛选器”(指对此服务器发送的数据包进行筛选),这里应该点击[输入筛选器] 按钮,会弹出一个“添加筛选器”窗口,再点击[添加]按钮,表示要增加一个筛选条件。
  在“协议”右边的下拉列表中选择“ICMP”,在随后出现的“ICMP类型”和“ICMP编码”中均输入“255”,代表所有
  

图2

的ICMP类型及其编码。ICMP有许多不同的类型(Ping就是一种类型),每种类型也有许多不同的状态,用不同的“编码”来表示。因为其类型和编码很复杂,这里不再叙述。
  点击[确定]按钮返回“输入筛选器”窗口,此时会发现“筛选器”列表中多了一项内容(如图2所示)。点击[确定]按钮返回“本地连接”窗口,再点击[确定]按钮,此时筛选器就生效了,从其他计算机上Ping这台主机就不会成功了
  

图3

2. 用防火墙设置ICMP过滤

  现在许多防火墙在默认情况下都启用了ICMP过滤的功能。如果没有启用,只要选中“防御ICMP攻击”、“防止别人用ping命令探测”就可以了,如图3所示。

编辑本段防御基于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):

  禁止其入站和出站。通过使用一个能够进行数据包一致性检查的防火墙,错误和恶意的数据包都会被阻塞。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值