IPV6学习之旅-ICMPV6----2

本文详细介绍了ICMPv6的功能及其在IPv6网络中的重要作用,包括错误报文和信息性报文的类型与应用场景,例如目标地址不可达、包太大等错误报文,以及回射请求和回射应答的信息性报文。

 

    昨天大概介绍了一下IPV6,主要包括IPV6地址表示,地址类别,相关协议和技术。今天的重点是ICMPv6,之所以要先讲ICMPv6是因为它是其他技术(如邻居发现协议)的基础,没有它,其他都是浮云。

    ICMPv6是控制报文,它的作用是在网络传输中发现并报告错误、传送有控制信息性质的消息。如前所说,他是邻居发现协议和组播侦听者发现协议的基础。

报文类型

错误报文

其报头的类型字段高八位为全0,所以类型字段的范围为0-127。

错误报文包括目标地址不可达、包太大、时间超时和参数错误

 

目标地址不可达

这种报文由路由器或者目的主机发出。报文的类型字段为1,代码字段为0-6。

出现这种错误的情况有很多,如路由器在路由表里无法找到目的主机,目的主机设置了防火墙,目的地址超出了源主机能发出信息的范围,无法解析目的主机的链路层地址等等。

代码字段具体表示如下:

 0:没有到达目的地的路由。这个报文在路由器没有定义IP包的目的地路由时产生,路由器将采用默认路由来发送无法利用路由器的路由表进行转发的包。
 1:与目的地的通信被管理员禁止。当被禁止的某类业务流欲到达防火墙内部的一个主机时,包过滤防火墙将产生该报文。
 2:不是邻居。当使用IPv6选路扩展头并严格限定路由时,将使用这个代码。当列表中的下一个目的地与当前正执行转发的节点不能共享一个网络链路时,将会产生该报文。
 3:地址不可达。这个代码指出在把高层地址解析到链路层(网络)地址时遇到了一些问题,或者在目的地网络的链路层上去往其目的地时遇到了问题。
 4:端口不可达。这种情况发生在高层协议(如D P )没有侦听包目的端口的业务量,且传输层协议又没有其他办法把这个问题通知源节点时。
 5:源地址被禁。当这个源地址被某个协议或者防火墙过滤掉时,报文无法发出去或者接收进来。

 6:路由拒绝转发。有些路由的前缀被配置成必须马上丢弃所有接收到的包,而当一个报文遇到这种路由时,包会被丢弃。

 

包太大

当包的大小超过MTU(最大传输单元)时,路由器会发送包太大的错误报文。此报文的类型字段为2,代码字段为0。IPV6支持的最大传输单元(MTU)为1280byte。

 

时间超时

报文的类型字段为3,代码字段为0或者1。为0时表示在传输过程中路由跳数减为了0,为1表示在重组数据片段时时间超时了。

 

参数错误

当IPv6头或扩展头中的某些部分有问题时,路由器由于无法处理该包而会将其丢弃。路由器的实现中应该可以产生一个ICMP参数错误报文来指出问题的类型(如错误的头字段、无法识别的下一个头类型或无法识别的IPv6选项),并通过一个指针值指出在第几个字节遇到这种错误情况。

这种报文的类型字段为4,代码字段为0-2。0:错误的头字段。1:无法识别的下一个头类型。2:无法识别IPV6选项。

信息性报文

这种报文包含二种类型:回射请求和回射应答

 

回射请求

类型字段为128,代码字段为0.

一个主机发送回射请求给另一台主机,要求立即回复回射应答。用来确认目的主机是否可达。在ping程序中就是用的这种方法。

在ping程序中的应用如下:

void send_ip()

{

    if(sequence != 0 && !flag)

        printf("Destination Host Unreachable\n");

    int len;

    struct icmphdr *icmp_p;

    icmp_p =(struct icmphdr *)send_buf;

    icmp_p->type = ICMP_ECHO;

    icmp_p->code = 0;

    

    (icmp_p->un).echo.id = p_id;

    (icmp_p->un).echo.sequence = sequence++;

    gettimeofday((struct timeval *)(icmp_p +1),NULL);

    len = sizeof(struct timeval)+packet_len;

    icmp_p->checksum = 0;

    icmp_p->checksum = ip_checksum((unsigned short *)icmp_p,len);

    if(sendto(ip_fd,send_buf,len,0,(struct sockaddr *)&send_addr,sizeof(send_addr))<0)

    {

        printf("send to error\n");

        exit(1);

    }

}

这只是ping程序里的一小部分。完整代码我已经上传了,有兴趣的可以去下载。

回射应答

类型字段为129,代码字段为0.

当一个主机接收到回射请求时,就会发送回射应答作为回复。回射应答可以发送给一个组播地址。

<think>我们正在分析一组 `ip6tables` 规则。每条规则都针对 IPv6 协议(-p IPv6),指定了输出接口(-o eth0.8.4),并且匹配特定的 ICMPv6 类型(--ip6-proto ipv6-icmp 和 --ip6-icmp-type)。每条规则都使用 `-j DROP` 动作,即丢弃匹配的数据包。 具体分析每条规则: 1. `-p IPv6 -o eth0.8.4 --ip6-proto ipv6-icmp --ip6-icmp-type 131/0:255 -j DROP` - 匹配 ICMPv6 类型 131(在 ICMPv6 中,类型131是“Multicast Listener Report”消息,即MLDv2报告) - 代码范围:0:255,这意味着匹配所有代码(因为代码字段占8位,0255)。但是实际上,对于类型131,目前只定义了一个代码0(由RFC3810定义)。所以这里匹配代码0255,实际上就是匹配类型131的所有消息。 2. `-p IPv6 -o eth0.8.4 --ip6-proto ipv6-icmp --ip6-icmp-type 132/0:255 -j DROP` - 匹配 ICMPv6 类型 132(Multicast Listener Done 消息,即MLDv1的离开消息,注意MLDv2没有Done消息,但类型132保留用于MLDv1) - 同样匹配所有代码(但实际上,类型132也只有一个代码0)。 3. `-p IPv6 -o eth0.8.4 --ip6-proto ipv6-icmp --ip6-icmp-type 143/0:255 -j DROP` - 匹配 ICMPv6 类型 143(Multicast Listener Report 消息,但注意:MLDv1的报告消息类型是131,而MLDv2的报告消息类型是143。参考RFC3810,MLDv2报告消息的类型是143)。 - 同样匹配所有代码(目前也只定义了一个代码0)。 因此,这三条规则的作用是:在接口eth0.8.4上,阻止所有MLDv1的离开消息(类型132)、MLDv1的报告消息(类型131)和MLDv2的报告消息(类型143)的发送(因为是在OUTPUT链?或者FORWARD链?注意这里指定了输出接口,所以规则可能是在OUTPUT链或者FORWARD链中,但规则本身只指定了输出接口,因此匹配的是从该接口发出的包)。 这样做的目的可能是为了阻止主机或路由器通过eth0.8.4接口发送MLD消息。MLD协议用于IPv6组播组成员管理,阻止这些消息可能会导致该接口上的组播功能无法正常工作。 注意:规则中的`--ip6-icmp-type`的语法是`type/code`,这里用`0:255`表示匹配所有代码。实际上也可以写成`131/0`(如果只想匹配代码0),但这里用`0:255`可以匹配所有可能的代码,即使未来有新的代码定义也会被阻止。 总结:这三条规则丢弃从接口eth0.8.4发出的三种MLD消息(MLDv1报告、MLDv1离开和MLDv2报告),从而阻止该接口上的组播组成员关系报告和离开。 </think>### IPv6 `ip6tables` 规则解析 您提供的三条规则是 Linux `ip6tables` 防火墙配置,用于过滤特定的 ICMPv6 流量类型。以下是逐条解析: #### 1. 第一条规则 ```bash -p IPv6 -o eth0.8.4 --ip6-proto ipv6-icmp --ip6-icmp-type 131/0:255 -j DROP ``` - **`-p IPv6`**:匹配 IPv6 协议 - **`-o eth0.8.4`**:限制出站接口为虚拟接口 `eth0.8.4` - **`--ip6-proto ipv6-icmp`**:匹配 ICMPv6 协议 - **`--ip6-icmp-type 131`**:匹配 MLDv2 (Multicast Listener Discovery) 报告消息 - 类型 131:MLDv2 组成员报告(RFC 3810- **`0:255`**:匹配所有代码值(0-255) - **`-j DROP`**:直接丢弃数据包 **作用**:阻止从 `eth0.8.4` 接口发出的所有 MLDv2 报告消息 #### 2. 第二条规则 ```bash -p IPv6 -o eth0.8.4 --ip6-proto ipv6-icmp --ip6-icmp-type 132/0:255 -j DROP ``` - **`--ip6-icmp-type 132`**:匹配 MLD (Multicast Listener Discovery) 完成消息 - 类型 132:MLD 组成员离开报告(RFC 2710) **作用**:阻止从 `eth0.8.4` 接口发出的组成员离开通知 #### 3. 第三条规则 ```bash -p IPv6 -o eth0.8.4 --ip6-proto ipv6-icmp --ip6-icmp-type 143/0:255 -j DROP ``` - **`--ip6-icmp-type 143`**:匹配 MLDv2 (Multicast Listener Discovery) 查询消息 - 类型 143:MLDv2 组成员查询(RFC 3810) **作用**:阻止从 `eth0.8.4` 接口发出的 MLDv2 查询请求 --- ### 技术背景与应用场景 1. **MLD 协议作用** ICMPv6 类型 131-132 和 143 属于组播监听发现协议(MLD),用于: - 主机加入/离开组播组(131/132- 路由器查询组播组成员(143) 2. **规则设计目的** - 禁用 `eth0.8.4` 接口的 IPv6 组播功能 - 防止组播流量泄露到特定网络 - 增强网络安全性(组播可能被用于反射攻击) 3. **典型应用场景** - 隔离虚拟机或容器的网络流量 - 防止内部网络组播信息暴露给外部 - 在 SDN 环境中控制组播传播范围 --- ### 规则语法详解 | 参数 | 说明 | |------|------| | `-o eth0.8.4` | 限制出站接口(output interface) | | `--ip6-icmp-type X/Y:Z` | `X`=ICMP类型, `Y`=起始代码, `Z`=结束代码 | | `0:255` | 匹配该类型的所有代码值 | | `-j DROP` | 无响应静默丢弃 | --- ### 注意事项 1. **潜在影响** 禁用 MLD 可能导致: - IPv6 组播服务失效(如视频会议) - 网络设备无法发现组播组成员 - 违反 RFC 标准要求(路由器必须支持 MLD) 2. **安全权衡** - 在面向互联网的接口建议启用此类过滤 - 在内网环境中需谨慎使用
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值