IPv6 Ready Logo是一项国际认证计划,提供一个全球通用的规范,验证IPv6产品的可部署和应用性,为遵守这些规范的厂商颁发IPv6 Ready Logo证书,为企业采购硬件设备提供参考。

IPv6 Ready Logo共有5个分类:Core Protocols、CE Router、DHCPv6、IPSecv6、SNMP。其中Core Protocols是最通用的认证,所有厂商都会申请。

Core Protocols分为6个部分:

  1. IPV6基础协议(Internet Protocol Version 6(IPv6)Specification)
  2. IPv6邻居发现协议(Neighbor Discoveryfor IP version 6(IPv6))
  3. IPv6无状态地址自动配置协议(IPv6 Stateless Address Autoconfiguration)
  4. IPv6路径MTU发现协议(Path MTU Discovery for IP version 6)
  5. ICMPv6协议(Internet Control Message Protocol(ICMPv6)for the Internet Protocol)
  6. IPv6互通(lPv6 Interoperability)

其中,前5项被称为一致性(Conformance),考察不同厂商的产品对IPv6核心协议的应用是否一致。考察通过的设备,在和其他厂商进行IPv6通信时才不会出错。考察的标准根据RFC制定,所以是非常权威的。

Phaze指的是IPv6 Ready Logo委员会的Phaze,最初成立的时候(Phaze 1)没有那么复杂的认证内容,在2011年11月后,才建立并完善了现在的认证内容(Phaze 2)。直至现在,该认证的版本也在不断更新,最新的是2024年6月的5.1.3。

在中国大陆的认证工作由天地互连信息技术有限公司负责。

认证标准文档下载:Core_Conformance.pdfCore_Interoperability.pdf

一致性(Conformance)

由于IPv6比IPv4多了巨量的特性,且许多特性的规定并不严格,会导致报文在不同厂商的设备之间传递时出现偏差,比如忽略了不该忽略的报文、不该发送报文却发送了报文、发送的报文里某一字段的值不正确等。一致性测试的目的就是消除各厂商的差距,让它们更好地协同工作。

接下来介绍测试环境与方法。

环境搭建

硬件需要一台有3个网口的PC或服务器,直接安装或者虚拟机安装freebsd 8,虚拟机要将3个网口直通/桥接,开混杂模式。

测试基于v6eval这个测试工具,测试脚本基于perl,由于freebsd 8没有pkg包管理,常用工具命令都需要编译/usr/ports里的软件(而且还不全),所以跟着官方教程手动安装是很折磨的。本文提供一个整合好的镜像下载,下载后导入最新版的Self Test工具就可以测试。

下载链接:Google Drive,freebsd用户名:root 密码:123456

测试步骤

1.拓扑

image-20241007222633850

TN为测试设备,NUT为被测设备。TN和NUT通过2个网口互连。TN可选使用console连接NUT来实现自动输入命令。

官方教程中下载最新的Self_Test_5-?-?.tar.gz,解压到/usr/local/ipv6ready/ 目录下。

2.预配置

有3个文件需要预先配置好:

/usr/local/v6eval/etc/nut.def
/usr/local/v6eval/etc/tn.def
/usr/local/ipv6ready/Self_Test_5-?-?/config.pl

nut.def:

ipv6# cat nut.def.sample
#
# nut.def
#
# Information about the Node Under Test (NUT)
#
# System type
System cisco-system #----若手动测试此项修改为 manual
# System information
TargetName Cisco1812 #----被测设备
# Name
HostName cisco #-----被测厂家
# Type
# host, router, special
Type router #-----被测设备类型,如果 NUT 为 host 类需修改为 host
# Super user name and it's password
# if you select manual as "System", you don't care "User" and "Password"
#
User root
Password v6eval
#linkname   interface    The EXACT ether source address     link-local address     global address
Link0 fxp0 00:00:92:a7:6d:f5 fe80::7508:aaa8:e1d0:a425 3ffe:501:ffff:100:b003:5ce2:e51:aab #被测设备第一个接口,需填写地址
#Link1 fxp1 00:00:92:a7:6d:f6 fe80::7508:aaa8:e1d0:a425 3ffe:501:ffff:100:b003:5ce2:e51:aac #被测设备第二个接口,需填写地址
#Link2 de0 00:c0:f6:b0:aa:ef fe80::7508:aaa8:e1d0:a425 3ffe:501:ffff:100:b003:5ce2:e51:aac
#Link3 de1 00:00:92:a7:6d:f8 fe80::7508:aaa8:e1d0:a425 3ffe:501:ffff:100:b003:5ce2:e51:aac
#Link4 de2 00:90:27:14:ce:e3 fe80::7508:aaa8:e1d0:a425 3ffe:501:ffff:100:b003:5ce2:e51:aac

举例:link0 那一行的 fxp0 是设备的接口名,00:00:92:a7:6d:f5是link0的MAC地址,fe80::7508:aaa8:e1d0:a42是link-local address,3ffe:501:ffff:100:b003:5ce2:e51:aab是global unicast address。这几项需要修改为NUT的真实地址。link1同理。

tn.def
#
# tn.def
#
# Information about the Tester Node (TN)
#
#
# Remote Controal Configuration
#
RemoteDevice cuad0
RemoteDebug 0
RemoteIntDebug 0
RemoteLog 1
RemoteSpeed 0
RemoteLogout 0
RemoteMethod serial
#filter ipv6
#linkname interface BOGUS ether source address
# name of the Tester Interface
Link0 vr1 00:00:00:00:01:00
Link1 vr2 00:00:00:00:01:01
#Link2 de2 00:00:00:00:01:02
#Link3 de4 00:00:00:00:01:03

link0 那一行的 vr1是tn的网口名(用ifconfig -a可以看到),MAC可以不改,但建议改为真实MAC,有些安全设备会检查MAC真实性。

tn.def 与nut.def里的link0要互相连接,link1同理。

config.pl
ipv6ready# vi /usr/local/ipv6ready/Self_Test_5-?-?/config.pl
########################################################################
#----------------------------------------------------------------------#
# #
# Configure the advanced functionalities support #
# #
#----------------------------------------------------------------------#
#
# The support of transmitting Echo Requests and configuring packet size
# v6LC.2.2.25, v6LC.4.1.10, v6LC.4.1.11, v6LC.5.1.1
# zero - NUT does not support
# non-zero - NUT supports
#
TRANSMITTING_EREQ =1 # 1 表示被测设备支持发送 Echo
Request
# 0 表示不支持
#
# The support of multicast routing
# v6LC.1.1.10 H, I, J, K
# v6LC.1.2.7 G, H
# v6LC.5.1.4 B
# zero - NUT does not support
# non-zero - NUT supports
#
MULTICAST_ROUTING =1 #被测设备支持多播路由
# 0 表示不支持
#
# The support of link MTU configuration
# v6LC.5.1.4, v6LC.5.1.11 B, v6LC.5.1.12 B, v6LC.5.1.13 B
# zero - NUT does not support
# non-zero - NUT supports
#
MTU_CONFIGURATION =1 #被测设备支持 MTU 配置
# 0 表示不支持
#
# The support of Hop-by-hop option process
# v6LC.1.2.7
# zero - NUT does not support
# non-zero - NUT supports
#
$PROCESS_HBH = 1; #被测设备支持处理 hop-by-hop 选项
#
# The support of sending more than three RSs
# v6LC.2.2.1
# zero - NUT does not support
# non-zero - NUT supports
#
$SENDING_MORE_RSs = 1;
#
# The support of sending only one RS
# v6LC.2.2.2
# zero - NUT does not support
# non-zero - NUT supports
#
$SENDING_ONE_RS = 0;
#
# The support of Type C host
# v6LC.2.2.23
# zero - NUT does not support
# non-zero - NUT supports
#
$TYPE_C_HOST = 1; #被测设备支持 RFC4191
#
# support to process Beyond Scope of Source Address
# v6LC.5.1.3.E
# zero - NUT does not support
# non-zero - NUT supports
#
$BEYOND_SCOPE_SADDR = 1;
#----------------------------------------------------------------------#
# #
# Configure target environment #
# #
#----------------------------------------------------------------------#
#
# The support of multiple physical network interfaces
# zero - one physical interface router
# non-zero - generic router which has multiple interfaces
#
$HAS_MULTIPLE_INTERFACES = 1;

本配置文件需要根据被测产品本身的功能进行配置,如 NUT 不支持 MTU 配置,需要将MTU_CONFIGURATION 置 0,否则测试到 V6LC.5.1.4 等 cases 时会failed。

3.测试脚本编写(手动测试可跳过)

需要修改的脚本和配置如下:

/usr/local/lib/perl5/site_perl/5.10.1/V6evalRemote.pm
/usr/local/v6eval/bin/XXX/route.rmt 及其他*.rmt

因为在/usr/local/v6eval/bin/XXX/route.rmt …中都会用到 use V6evalRemote, 用户需要将V6evalRemote.pm 中的参数修改过来。若为手动测试,只需在 nut.def 文件中将 system 项修改为 manual 即可.

4.Self_Test软件说明

Self_Test_5-0-4 软件中包含 Makefile 文件,用户可以在上述配置完成之后直接在此目录下输入 make ipv6ready_p2_host 或者 make ipv6ready_p2_router(根据被测产品的测试类型选择)。

软件中也包含每个 RFC 测试目录,如 RFC8200 的测试目录 spec.p2, RFC4861 的测试目录nd.p2, RFC4862 的测试目录 addr.p2, RFC8201 的测试目录 pmtu.p2, RFC4443 的测试目录icmp.p2, 用户也可以在相对应的目录下测试如

ipv6ready # cd spec.p2/
ipv6ready # make ipv6ready_p2_host(router)

若用户仅测试某个或某些测试用例的话,可以

ipv6ready # cd spec.p2/
ipv6ready # make ipv6ready_p2_host(router) AROPT="-s 1 -e 10"

注:-s: start,开始项;-e: end,结束项

Self_Test工具里的小项,对应标准文档Core_Conformance.pdf里大项的某一Part,直接看看不出来它们的对应关系,在运行某个具体小项的时候,Log会显示该小项对应哪个大项的哪个Part。

如果是手动测试,要在途中按照脚本指示操作设备。比如提示Set AdvSendAdvertisements Flag to True,就需要操作设备的接口,变为可发送RA的接口。

5.结果分析

打开Self_Test_5-?-?/index.html可以看到测试结果的总览。

image-20241007231146308

点击某个section进入测试项页面。测试结果以 html 格式显示,也可打开单独的测试结果,如 16.html,如下图所示

image-20241007231327256

每个测试结果单元中包含 7 列,分别是 No.、Title、Result、Log、Script、Packet、Dump(bin)。

title 列中有具体的测试项名称,点击测试项名称进入详细的测试例用例。
Result 列为该测试项测试结果,一般黑色为通过,红色字体为测试结果有问题,需要修改;
Log 列为测试过程,点击“X”就可以进入测试 Log 页;
Script 列和 Packet 列为测试例设计的脚本和报文格式。
Dump(bin)列为测试过程中链路上的抓包,使用 wireshark 等软件打开。

image-20241007231453622

点击Log下面的X可以查看项目的日志,用于排错。

image-20241007231833664

也有交互的报文的详细展示。

image-20241007231918420

出现NG字样代表失败,需要对照Log来检查哪一步出错了,本应收到却未收到、本不应收到却收到、收到的包内容错误等问题都会详细记录下来。