- 引言:
- ICMP负责传递可能需要主义的差错和控制报文
- 鉴于ICMP能够影响重要的系统功能操作和获取配置信息,黑客们已经在大量攻击中使用ICMP报文,由于担心这种攻击,网络管理员经常会用防火墙封阻ICMP报文,会导致大量的诊断程序将无法正常工作
- ICMPv6不仅可以用于错误报告,还可以用于邻居发现ND,与ARP有相同的作用,还能配置主机和管理组播地址的路由器发现RD功能
- 在IPv4和IPv6内的封装
- IPv4
- | IPv4头部 | ICMP头部 | ICMP数据 |
- IPv6
- IPv4
- | IPv6头部 | IPv6扩展头部(下一个头部ICMP头部:58) | ICMP头部 | ICMP数据 |
- ICMP头部结构
- | 类型 | 代码 | 校验和 |
- | 依赖于类型和代码(可变) |
- 所有的ICMp头部的前4个字节结构是相同的(类型,代码,校验和),其余部分根据报文类型和代码不同有着不同的结构
- ICMP报文
- ICMP报文分为差错报文,查询报文和信息报文
- ICMPv4报文
类型 | 代码 | 正式名称 | 用途注释 |
0 | 0 | 回显应答 | 回显应答,返回数据 |
3 | 1 | 主机不可达 | 已知但不可达的主机 |
3 | 3 | 端口不可达 | 未知的/不用的端口 |
3 | 4 | 需要进行分片但设置了不分片位 | 需要设置分片但被DF禁止了 |
5 | 1 | 主机重定向数据报 | 指示了一个可选的路由器 |
8 | 0 | 回显 | 回显请求 |
11 | 0 | 在传输期间生存时间超时 | 跳数限制/TTL超时 |
12 | 0 | 指针指示差错 | 字节偏移量指示第一个问题字段 |
- ICMPv6报文
- ICMPv6,类型从0到127都是差错报文,从128到255都是信息类报文
类型 | 代码 | 正式名称 | 用途注释 |
1 | 0 | 目的不可达 | 不可达的主机端口协议 |
1 | 1 | 管理禁止 | 策略(如防火墙)禁止 |
1 | 2 | 超出源地址范围 | 目的范围超出源地址的范围 |
1 | 3 | 地址不可达 | 当代码0~2并不是合适时使用 |
1 | 4 | 端口不可达 | 没有传输层实体在端口监听 |
1 | 5 | 源地址失败策略 | 违反进/出策略 |
1 | 6 | 拒绝到目的地的路由 | 特定的拒绝到目的地路由 |
2 | 0 | 数据报太大(PTB) | 需要分片 |
3 | 0 | 超时 | 跳数用尽或者重组超时 |
3 | 1 | 重组时间超时 | 在有限的时间内无法重组 |
4 | 0 | 参数问题 | 畸形数据报或者头部 |
4 | 1 | 无法识别的下一个头部 | 未知的下一个头部字段值 |
4 | 2 | 无法识别的IPv6选项 | 未知的逐跳或者目的地选项 |
100,101 | 0 | 为私人实验保留 | 为实验保留 |
127 | 0 | 为ICMPv6差错报文扩充保留 | 为更多的差错报文保留 |
128 | 0 | 回显请求 | ping请求 |
129 | 0 | 回显应答 | ping应答 |
130 | 0 | 组播侦听查询 | 查询组播订阅者 |
131 | 0 | 组播侦听报告 | 组播订阅者报告 |
132 | 0 | 组播侦听完成 | 组播取消订阅报文 |
133 | 0 | 路由器请求(RS) | IPv6RS和移动IPv6选项 |
134 | 0 | 路由器通告(RA) | IPv6RA和移动IPv6选项 |
135 | 0 | 邻居请求(NS) | IPv6邻居发现(请求) |
136 | 0 | 邻居通告(NA) | IPv6邻居发现(通告) |
137 | 0 | 重定向报文 | 使用另一个下一跳路由器 |
141 | 0 | 反向邻居发现请求报文 | 反向邻居发现请求,请求给定的链路层地址的IPv6地址 |
142 | 0 | 反向邻居发现通告报文 | 反向邻居发现应答,报告给定的链路层地址的IPv6地址 |
143 | 0 | 组播侦听报告版本2 | 组播侦听报告(v2) |
144 | 0 | 本地代理地址发现请求报文 | 请求移动IPv6HA地址,由移动节点发送 |
145 | 0 | 本地代理地址发现应答报文 | 包含MIPv6HA地址,在本地网络中由合个的HA发送 |
146 | 0 | 移动前缀请求 | 当离开时请求本地前缀 |
147 | 0 | 移动前缀通告 | 提供从HA到移动节点的前缀 |
148 | 0 | 证书路径请求报文 | 一条证书路径的保护邻居发现(SEND)请求 |
149 | 0 | 证书路径通告报文 | 响应一个证书路径请求的SEND |
151 | 0 | 组播路由器通告 | 提供组播路由器的地址 |
152 | 0 | 组播路由器请求 | 请求组播路由器的地址 |
153 | 0 | 组播路由器终止 | 组播路由器使用结束 |
154 | 0 | FMIPv6报文 | MIPv6快速切换报文 |
200,201 | 0 | 为私人实验保留 | 为实验保留 |
255 | 0 | 为ICMPv6信息类报文扩充保留 | 为更多的信息类报文保留 |
- 处理ICMP报文
- 一般来说传入的信息类报文会被操作系统自动处理,而差错类报文传递给用户进程或传输层协议
- 传入的ICMpv6报文将应用以下规则:
- 未知的ICMPv6差错报文必须传递给上层产生差错报文的进程
- 未知的ICMPv6信息类报文将被丢弃
- ICMPv6差错报文将会尽可能多地包含导致差错的原始IPv6报文,当然最终的差错报文大小不能超过最小的IPv6MTU(1280字节)
- 在处理ICMPv6差错报文时,需要提取原始或者违规数据包中的上层协议类型,用于选择适当的上层进程,如果这是不可能的,在任何IPv6层处理完后将无声地丢弃差错报文
- 存在处理差错的特殊规则
- IPv6节点必须限制它发送ICMPv6差错报文的速率,有多重方法可以用来实现限速功能
- ICMP差错报文
- 为了限制产生广播风暴,一下情况不会响应产生ICMPv4差错报文:
- ICMPv4差错报文
- 目的地是IPv4广播地址或者IPv4组播地址的数据报
- 作为链路层广播的数据报
- 不是第一个分片的其他分片
- 源地址不是单个主机的数据报.这就是说源地址不能为零地址,环回地址,广播地址或组播地址
- 以下情况不会产升ICMPv6差错报文
- ICMPv6差错报文
- ICMPv6重定向报文
- 目的地址是IPv6组播地址的数据报,除了数据包过大(PTB)的报文;参数问题报文;
- 作为链路层组播的数据包
- 作为链路城广播的数据包
- 源地址不是唯一识别的单个节点的数据包
- 为了限制产生广播风暴,一下情况不会响应产生ICMPv4差错报文:
- lPv6中的邻居发现
- IPv6中的邻居发现协议是将路由器发现和由ARP提供的带有地址映射功能的ICMPv4重定向机制结合砸第一期
- 被指定用于支持移动IPv6
- 与ARP和IPv4普遍使用广播地址不同,ICMpv6广泛使用组播地址,在网络层和链路层中都适用
- ICMPv4和ICMPv6转换
- [RFC6145]描述了从ICMPv4转换到ICMPv6的方法,以及相反方向的转换方法,当转换ICMp时,IP和ICMp头部都要被转换,出资之外,包换了一个内部违规书包头部及数据的ICMP差错报文,也会转换内部数据报的头部.除了映射适当的类型和代码号之外,还有需要额外考虑的分片,MTU大小以及校验和计算
- 与ICMP相关的攻击
- 主要分3类
- 泛洪(flood)
- 炸弹(bomb)
- 信息泄露(information disclosure)
- 主要分3类