Linux下SRv6及Mininet IPv6安装配置发包测试

作者简介:吴畏虹,2016年至今,北京邮电大学-未来网络理论与应用实验室在读博士,导师-刘韵洁。研究方向:移动网络数据平面,SRv6与IPv6,网络服务质量保障。

Segment Routing(SR)是由Cisco提出的一种源路由机制,旨在为IP和MPLS网络引入可控的标签分配,为网络提供高级流量引导能力。关于SR的简介,可以参考《SDN关键技术-Segment Routing协议简介》

针对不同的数据平面,SR有不同的实现方式,分别是针对MPLS数据平面的SR MPLS与针对IPv6数据平面的SRv6。不同于SR MPLS对MPLS控制面做可编程扩展,SRv6采用新定义的IPv6扩展报头SRH(SR Header)作为segment列表的承载。SRH报头为新的路由报头,位于IPv6报头之后,扩展路由报头类型号定义为4。关于SRv6的简单介绍可以参考http://www3.lacnic.net/eventos/lacnic23/jueves/gianpietro-cisco-segmentrouting-ipv6-flip6.pdf。此处介绍两点,一是与SR MPLS不同,在路由的过程中SRv6并不执行segment的弹出,只是通过SRH报头中的Segment left字段作为指针,指向当前活动的segment,每进行一次路由,指针移动一位segment。二是SRv6在路由的过程中,当前的活动segment会作为IPv6目的地址写入IPv6报头,用以保证在不同SRv6节点之间的可达性,因此第一个活动的segment将作为第一跳的目的IP写入IPv6报头。

本实验基于64位Ubuntu 16.04进行,只针对SRv6数据包的产生与segment的压入,并且在Mininet中的namespace下进行发包的实验,并不涉及SRv6数据包的路由与转发处理。本实验旨在解决SRv6的发包问题,以便于后续在BMv2中通过P4进行SRv6的仿真实验。

一、Linux 内核更新

在Linux内核4.10及以上版本中默认安装了SRv6协议栈,因此需要进行内核的更新,本实验基于4.14.0内核。在http://kernel.ubuntu.com/~kernel-ppa/mainline/下载4.14.0内核安装包,包含以下deb包:

下载完成之后,进入对应目录,执行以下命令进行内核的安装:

安装完成之后重启,uname –r查看内核版本,显示为4.14.0表示安装成功。

二、iproute2更新

SRv6基于iproute2进行控制,需要更新为较新版本的iproute2。本实验基于iproute2 4.14.1,https://www.kernel.org/pub/linux/utils/net/iproute2/中选择对应的版本下载压缩包,下载完成之后解压进入目录。iproute2需要安装bison,flex依赖项,命令如下:

安装完成之后在在iproute2目录下,执行

编译安装完成之后,执行:

如果能输出如下图的帮助信息,表示安装成功:

三、SRv6发包测试

对于SRv6的仿真可以使用P4等协议无关语言或者协议进行测试。因此,本实验将在Mininet中进行,以交换节点能够抓取到SRv6数据包为准,并不涉及SRv6的处理。SRv6的仿真处理,可以通过BMv2等工具进行定义与测试。

实验基于最简单的单节点双主机拓扑进行测试,通过以下命令建立拓扑:

因为在mn建立的拓扑中默认的控制器并没有针对IPv6进行处理,因此不采用默认的控制器,由于拓扑十分简单,采用手动下发流表的形式保证网络可达,通过一下命令对s1添加两条流表:

添加完成之后可以通过pingall进行连接测试的测试。确认网络连通之后,进行IPv6与SRv6的配置。

通过xterm h1 h2命令打开h1和h2控制台,首先需要进行IPv6地址的配置,对于h1,在h1 xterm窗口中执行:

同理,在h2的xterm窗口中执行:

完成之后,可以在h1窗口中执行ping6命令进行测试,命令如下:

能够连通表示IPv6配置完成,接下来进行SRv6的配置。

实验将通过h1向h2发包,并且在SRH中压入abcd::1234的segment。因此,只需要在h1进行配置。在h1的xterm窗口中执行以下命令:

iproute2以路由表的形式进行SRH的封装与segment的压入,对于上述命令的一些解释如下:

2001::2:表示所添加的路由的IPv6前缀,此处可以理解为将此目的地址的包封装为SRv6数据包

inline:表示SRH封装的形式,可选的有encap与inline。encap表示将SRH封装在IPv6报头的外部,以多个IPv6报头的形式存在。inline表示封装在IPv6报头的内部,以扩展路由报头的形式存在

abcd::1234:表示压入的segment,多个segment之间通过逗号“,”连接,位置靠前的会被优先压入。特别的,目的地址会作为最后一个活动segment被最先压入SRH中。

命令没有任何输出表示添加成功,然后在h1中执行以下命令设置封装为SRv6数据包的源地址:

其中,2001::1表示封装成的SRv6数据包的源地址,同样没有任何输出表示执行成功。

在文首已经提到,第一个活动的segment将作为第一跳的目的IP。然而,由于abcd::1234并不存在于网络中,因此如果直接执行ping6命令将反馈网络不可达,所以,需要额为针对abcd::1234添加一条路由。由于实验网络中并不存在路由器,所以添加的路由以h2的IPv6 Global地址作为下一跳地址,在h1中执行如下命令:

添加完成之后SRv6的配置完成,通过执行ping6命令进行测试:

由于本实验并不针对SRv6进行处理,因此并不会回复网络可达信息(相反会回复网络不可达),将通过Wireshark抓包进行验证。启动Wireshark,在s1-eth2进行抓包测试,在抓取的源地址为2001::1的ICMPv6报文中可以看到SRH已被添加进IPv6报头,添加的segment也能在SRH中看到,如下图所示:

能够看到,第一个活动的segment已经被写入IPv6的目的地址,同时在IPv6报头中已经封装好了SRH,在SRH内部能够查看到封装的abcd::1234。

至此,SRv6配置与发包实验完成。本实验针对Mininet进行发包测试,梳理了SRv6配置与压入segment进SRH的流程。对于SRv6的路由与转发的仿真推荐基于P4与BMv2进行测试,在BMv2下的SRv6的配置与本文相同,只是在P4能通过自定义数据平面对SRv6的处理流程进行完整的仿真测试。

参考文章
http://www.segment-routing.org/index.php/Implementation/Configuration


  • 本站原创文章仅代表作者观点,不代表SDNLAB立场。所有原创内容版权均属SDNLAB,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用,转载须注明来自 SDNLAB并附上本文链接。 本站中所有编译类文章仅用于学习和交流目的,编译工作遵照 CC 协议,如果有侵犯到您权益的地方,请及时联系我们。
  • 本文链接https://www.sdnlab.com/20500.html
分享到:
相关文章
条评论

登录后才可以评论

天空爆炸 发表于18-02-01
2