摘要:
国际知名开源社区Linux基金会主办的开源大会LinuxCon + ContainerCon + CloudOpen China 2018(LC3)于6月25日在北京开幕。今年阿里云作为白金合作伙伴亮相本次中国开源盛会。 国际知名开源社区Linux基金会主办的开源大会LinuxCon + ContainerCon + CloudOpen China 2018(LC3)于6月25日在北京开幕。今年阿里云作为白金合作伙伴亮相本次中国开源盛会。阿里云网络团队的三位技术专家在论坛上分享了各自专业领域的经验。分享主题包括开源平台的优化、网络大数据应用等。如果你错过了亲临现场的机会,没关系,我们通过三篇回顾总结来感受下。
主讲人
:陈建永 阿里云高级技术专家 主题
:Network Service Optimization with VPP Platform(基于VPP平台的网络服务优化) 分论坛
:Network & Orchestration 摘要
:这篇文章介绍了阿里云网络产品智能接入网关的研发背景和使用场景,以及基于项目为什么选择了VPP做为技术基础,做了哪些方面的优化和选择。 项目背景
本次产品的背景是实现一款类似于VPN网关的产品。产品使用的三大典型场景是混合云、连锁零售和分支与总部互联,实现加电就上阿里云,加电就互联的目标。
基于这样的产品要求,对技术产品的要求包括需要支持IKE、支持route-based VPN、支持IP转发和VRF以及有比较高的转发处理能力。考察下来,VPP跟我们的要求相对比较match,所以最终选择了VPP做为基座。
但是VPP只是一个框架和POC,离真正的产品还有比较大的差距,后面我们会详细展开我们做了哪些方面的优化。
IP和IPSec分组片
我们选择的VPP基线版本是18.01,已经包含了基本的分片函数,但是主要是用在ip4-map node上面,基本转发里反而没有分片功能。基于此,我们在ip4-rewrite的节点后增加了ip4-frag节点,实现了通常转发流程中对分片的支持。
VPP 18.01里是没有组片支持的代码的,但是外面有一个组片支持的patch,那么我们就把改patch合并到了18.01里,实现了组片的支持。目前该patch已经被社区合并到了18.04分支里。
关于IPsec分片的支持,先加密后分片,还是先分片后加密,这个是不一样的。一般情况下,可以选择先分片后加密,这样解密端可以直接解密后发送出去,组片的工作由客户端完成。但是做设备都会面临测试一个大包背对背IPSec测试的问题,这种情况下,测试仪的接收口收到的报文是分片的,他是不认识的。为了测试出性能数据,就需要解密端发送出跟发送端一样的报文。此时,一般是加密端选择对收到的1500字节报文先加密后分片,这样解密端收到报文后先组片,组完片以后再解密,然后发送出一个跟发送端一样的1500的报文。我们自己是2种情况都支持了。
Linux self报文支持
我们实现的是一款商业的产品,除了转发报文,设备还要支持VPN IKE协商,DHCP server功能,SSH/Telnet管理等,此时的报文都是发送给设备上面的Application的。但是,设备以太网口已经被VPP下的DPDK接管了,那么就需要把接收大的报文区分出self的报文,发送给APP;同时,APP发出的报文要读取到VPP里并且通过以太网口发送出去。
实现的途径包括DPDK的KNI、tap接口、AF_PACKET等,我们的选择是从VPP的router-plugin的patch里拿出了tap-inject模块,通过tap-inject实现self报文的收发,具体的node如下:
当然,这里也是有问题的,就是tap接口的数据读写是走系统调用的,对VPP的报文处理还是有影响的,还在我们的self报文不多。后续考虑移植KNI接口来进行改善。
进程间通信
上面说,我们的设备上面跑了很多的服务,这些应用之间是需要做信息同步的。典型的比如agent接收控制器的数据,需要发送给IKED做协商用;IKED协商出密钥需要把密钥下发给VPP做加解密等。这就需要提供一种进程间通信的机制。
这里有很多种选择,比较直接的比如采用unix socket、netlink等,复杂一点采用TIPC等。我们采用了nanomsg来完成进程间通信,主要考虑是nanomsg相对来说没有那么复杂,同时支持req/response,pub/sub等通信模式,这对于将来多种信息同步的方式支持比较好。
IKE问题及解决方案
VPP已经支持IKE,但是只做了一半,只支持IKEv2。这一半也只做了一半,只支持IKEv2做为responder,不能做为request方。另外,VPP也不适合集成复杂的IKE协商。基于上面的情况和考虑,我们在设备商单独起了专门的IKE应用来做协商,这个应用跟VPP再做SA的同步。
这里,IKED的选择可以是strongswan、freeswan、ipsec-tools等。
4G支持
在连锁等场景下,有些客户提出了4G支持的需求。一般来说,4G模块的驱动都是基于内核做收发包处理的。VPP要支持一般有两种方式:一种是基于AF_PACKET,通过AF_PACKET做VPP和Linux内核的报文桥梁,这种方式的好处是改动相对比较小,坏处是性能不是很好。另外一种方式是修改4G模块的驱动,支持DPDK,这种方式的好处是性能会非常好,因为不用经过内核直接到了VPP,坏处就是驱动的改动会非常大,而且每换一个4G模块就需要改动一次。
大家可以根据自己实际的需要来选择采用的技术方案。
总结
总的来说,VPP是一个比较好的框架,实现了很高的性能和非常多的feature。但是只是适合做POC,里边的坑非常多,用于商业需要对其非常了解和熟悉,做好填坑的准备。
本文为云栖社区原创内容,未经允许不得转载