测试仪表使用老的RFC1981规范,要求在收到ICMPv6“Packet Too Big”消息时,回复的数据包中包含一个片段头,在新内核中,该片段头是被省略掉的。
通过netfilter获取请求数据包,将添加了片段头的报文通过收包网卡发送到测试仪表,就可以通过该项测试。
关于此问题的解决方法有两种:
方法一:修改内核源码,使得回复的数据包符合要求,详细情况请看下面的描述。
方法二:直接写个程序构造报文发给测试机,相关资源请见:ipv6一致性(packettoobig)辅助测试工具-Linux文档类资源-CSDN下载
两种方法我都试了,第一种没通过,不知是不是我内核没改对,第二种方法直接就通过了。
使用v10-sp1-20200711-arm版本,做ipv6一致性检测遇到了一个问题IPv6 icmp协议分片没有头信息,这个问题他们以前是通过降低内核解决的,之前使用的是centos,PMTU 分片没有头信息,通过将原内核3.16.70降级为3.14.22解决的,现在客户使用麒麟v10-arm也遇到了这个问题
报错信息如下
如上图所示,问题出在第三步;
检测失败情况报文: 当 ③ 发送的ping请求包,不包含分片,协议一致性检测失败,如下图所示。
检测成功情况报文:当 ③ 发送的ping请求包,包含分片,协议一致性检测成功,如下图所示。
选取两台主机,一台配置ip6为2001:db8:1:18::1281/64,安装mtu1280d,作为测试机; 一台配置ip6为ip6为2001:db8:1:18::1280/64作为被测试机。
- 测试机上
从网上GitHub - falling-sky/mtu1280d: Synthetically creates ICMPv6 "Packet Too Big" messages to simulate MTU 1280.,下载mtu1280d工程,修改mtu1280d源码,将mtu1280d.c中的1280改为1180;编译源码。
2) 测试机上执行
ip -6 addr add 2001:db8:1:18::1281/64 dev eth0 preferred_lft 0
3) 测试机上执行
ip6tables -t mangle -D PREROUTING -d 2001:db8:1:18::1281/128 -j NFQUEUE --queue-num 1180
运行wireshark,对eth0进行抓包。
- 测试机上执行
./mtu1280d -g -q 1180
- 被测试机上执行
ip -6 addr add 2001:db8:1:18::1280/64 dev eth0 preferred_lft 0
ping6 -s 1452 -c 1 2001:db8:1:18::1281
ping6 -s 500 -c 1 2001:db8:1:18::1281
由于客户测试,通过将原内核3.16.70降级为3.14.22,可以解决协议一致性测试问题。故对比两个版本的ipv6代码。
查看3.16.70的补丁,减少攻击向量,停止生成IPv6片段头,MTU小于所需的最小IPv6 MTU的路径(1280字节)-称为原子碎片。核心IPv6规范要求,当主机接收到ICMPv6“Packet Too Big”消息,报告小于1280的“下一跳MTU”时,主机在发送到该目的地的所有后续数据包中包含一个片段头,而不减少假定的路径MTU。ICMPv6“包太大”消息可以被伪造的简单性,以及IPv6片段的广泛过滤,导致攻击向量可以被用于拒绝服务目的。
分析可得IxANVL协议一致性测试软件,遵循的是RFC1981的规范,而最新的规范为RFC8201,RFC8201已经淘汰了RFC1981规范。
支持最新的RFC8201,由RFC8201替代旧的RFC1981,其主要改变如下:
(1)修改测试例不处理packet too big报文(mtu值小于1280)
(2)添加packet too big有效判断
根据查看内核修改补丁说明,可知之所以去掉ipv6分片头的原因,核心IPv6规范要求,当主机接收到ICMPv6“Packet Too Big”消息,报告小于1280的“下一跳MTU”时,主机在发送到该目的地的所有后续数据包中包含一个片段头,而不减少假定的路径MTU。ICMPv6“包太大”消息可以被伪造的简单性,以及IPv6片段的广泛过滤,导致攻击向量可以被用于拒绝服务目的。
故,现在需要明确客户需求;
- 客户接受这个内核补丁,则无需修改。
2) 若客户需要使用老的RFC1981规范,则需要研发修改 linux-4.19.90/net/ipv6/route.c 文件,在2374行添加如下内容。
rfc8201规范: RFC 8201 - Path MTU Discovery for IP version 6
rfc1981规范: RFC 1981 - Path MTU Discovery for IP version 6
ipv6协议一致性检测: IPv6协议一致性测试例的设计及PMTU发现协议的测试 - 豆丁网
新规约说明: IPv6 Ready测试规范5.0.0版本发布 5月30日起全球实施_Logo
too big 包发送工程: GitHub - falling-sky/mtu1280d: Synthetically creates ICMPv6 "Packet Too Big" messages to simulate MTU 1280.
弃用IPv6原子片段的草案: