需求提出

我们知道,Rancher原生的Managed网络是通过IPsec来建立起安全隧道来保障各service之间可达性的。相比于其他一些×××技术,IPSec最大的优势在于其安全性;这种安全除了指业务数据加密传输外,还包括了一套秘钥交换的安全机制,这是诸如VXLAN之类的其他L3 ×××技术无法匹敌的。但正是为了提供这一层安全机制,IPSec需要在数据交换过程中对报文做逐一加密,势必消耗CPU资源,影响传输效率。

我们做过一些测试:在与Host网络的iperf测试比较中,Managed网络表现出来的性能损耗较严重(当然这也与运行Rancher的主机配置有关)。可惜在Rancher当前正式的Release版本中,除Managed网络外,并未提供其他的Overlay网络作为可选项。

现实是某些用户拥有自建数据中心,Rancher被部署到数据中心内部,网络安全相对已经较有保障。受到业务性质的影响,一些场景对网络传输效率的要求较高。此时Managed网络就显得有些无法覆盖需求了。于是,我们思考能否在不考虑安全性的前提下对Rancher的Managed网络做一些修改,从而提高网络传输效率。

一个较直接的思路就是去除对业务报文的加密过程。

IPSec基本概念

这一节不准备详细讲解IPSec原理,只将一些重要概念点到为止,有兴趣的同学可以下来研究IETF的RFC。

我们首先用一张图来认识IPSec框架:

IPSec模式

  1. 传输模式:适用于两台主机之间的数据保护。

  2. 隧道模式:适用于建立site-2-site的安全×××隧道。(Rancher Managed网络显然是要为Host上的所有Containers打通一条加密隧道,是使用隧道模式)

IPSec安全协议

安全协议包括AH、ESP以及它们的组合AH-ESP,Rancher中使用的是ESP,通过下图我们可以形象的了解IPSec的模式和安全协议之间的关系:

另外,有抓过包的同学会发现,Rancher的IPSec报文与这里基于Tunnel模式+ESP安全协议的封包格式有些不同。实际抓到的报文在外层的IP头部之后,ESP域之前,还包含了一个使用4500端口的UDP头部。这是NAT-T功能,它的实现机制是首先判断是否两端设备是否都支持NAT-T,然后检测链路上是否存在NAT,一旦两个条件都满足就启动NAT-T,将所有的业务报文使用UDP的4500端口进行传输。

保障私密性

IPSec支持使用多种加密算法对传输的业务数据进行加密。通过加密把数据从明文变成无法读懂的密文,从而确保数据的私密性。

加密算法分为:对称加密算法(DES/AES/3DES等)与非对称加密算法(比如RSA)

保障完整性

通过对数据进行HASH运算,产生类似于指纹的数据摘要,连同数据一起传输到对端,以确认数据未被非法篡改,保障数据完整性。

常见的HASH算法有MD5/SHA等。

保障真实性

对称加密和HASH都要求通信双方具有相同的密钥,在双方之间安全地传递密钥就需要一套密钥交换算法。

通过身份认证可以保证数据的真实性,确保数据确实是由特定的对端发出的。

常用的身份认证方式包括:Pre-shared key 预共享密钥、 RSA Signature 数字签名等。

下图是隧道模式的ESP封包流程,它反映了如何使用加密算法和验证算法来生成最终的加密报文。

IKE

另外,IPSec还包括IKE。IKE是一种安全机制,提供端与端之间的动态认证,为IPsec提供了自动协商交换密钥、建立SA的服务,简化IPsec的使用、管理(配置和维护)工作。IKE不是在网络上直接传输密钥,而是通过一系列数据的交换,最终计算出双方共享的密钥。有了IKE,IPsec很多参数(如:密钥)都可以自动建立,降低了手工配置的复杂度。

IKE使用UDP端口500,通过使用特定的密钥交换算法进行秘钥交换。常见的算法有DH和RSA算法。

讲了这么多理论的东西,现在我们回到Rancher,来看看Rancher的Managed网络是如何工作的。

Rancher Managed网络原理

通过进入agent-instance容器查看进程信息可以发现其主要启动了如下进程:

  1. rancher-metadata

  2. rancher-dns

  3. rancher-net

  4. charon

  5. haproxy

  6. host-api

rancher-metadata启动了一个web server,用于响应该agent所辖containers的metadata请求。

rancher-dns实现了一个监听在IP地址:169.254.169.250上的skydns实例,用于响应该agent所辖container的dns请求。

haproxy其实是一个负载均衡程序,其自带对member指定端口的healthcheck,此处主要用它来对配置了healthcheck的容器做健康检查。

host-api在该container内用于将haproxy采集到的数据上报到cattle。

我们重点来分析rancher-net和charon:

rancher-net的配置主要基于文件:"/var/lib/cattle/etc/cattle/ipsec/config.json" , 该文件包含了Environment内部所有Managed Network的Container地址信息。

具体格式如下:

rancher-net通过启动charon来往xfrm中下发配置,从而维护IPSec的链路和policy。

charon用来实现IKE之间的协商并下发rule到xfrm,下一章节实践中对IPSec加密方式的修改就要通过调用charon的接口来实现。

rancher-net除了通过charon下发xfrm state外,还需要配置xfrm policy,这一块的实现是在rancher-net中直接执行“ip xfrm policy add”来实现的。

除此之外,还有一个可以查看strongswan状态的命令行接口swanctl:

在IPSec之外,rancher-net还需要监听所有的ARP请求,并响应那些目标IP地址通过IPSec tunnel可达,但又不在本Host的ARP请求。

综上,rancher-net的功能包含:

监听8111端口,响应reload和ping的HTT请求。

当有reload请求时,读取配置文件,将到达配置文件中所有IP的路径都校验一遍:

a.如果有新加主机,添加ipsec隧道;

b.如果有新加container,但是已经存在IPSec,更新xfrm policy;

c.如果有删除执行相反操作。

监听eth0上的ARP请求,响应需要到达IPSec对端IP的ARP请求。

整个IPSec隧道的拓扑如下所示:

Managed网络实践

说了这么多,各位都已经蒙圈了吧。话不多少,修改代码环节隆重上场。

代码的修改相对简单,只需要将proposals的第一个加密方式改为null。

如:“null-sha1-modp2048” 代表:

  1. 使用对称加密方式为null(不加密);

  2. 使用sha1的HASH算法;

  3. 使用modp2048的非对称加密算法进行秘钥交换。

然后使用Dockerfile.dapper重新编译代码,确保没有编译错误。

我们知道,所有agent上的包均是启动时从cattle拉下来的;因此,通过更新docker p_w_picpath的方式来替换rancher-net是没有用的。

为了做测试,我们先直接将编译出来的rancher-net可执行文件通过docker cp替换掉agent-instance中的rancher-net。

替换并运行,发现charon协商IKE无法成功,提示“ENCRYPTION_ALGORITHM NULL (key size 20) not supported!”。 这是因为我们将加密算法置为了NULL,系统中的charon不支持。

查询官网发现NULL需要IKE中openssl的支持,有可能是rancher在编译charon的时候没有指定编译openssl plugin所致:

修改方法是charon编译的时候指定参数--enable-openssl 见:  [https://lists.strongswan.org/pipermail/dev/2011-February/000253.html]

分析代码发现agent-instance在初始化的时候是通过安装“rancher/strongswan-package”生成的包来得到charon的。因此,转到rancher/strongswan-package重新指定./configure --enable-openssl编译charon。

生成新的可执行文件后,先执行“ip xfrm state flush” 和 “ip xfrm policy flush”, 然后再重启rancher-net和charon;如果先不刷掉policy和state会导致新添加的ipsec无法生效。

修改之后,环境如下:

两个Network Agent容器分别为IPSec的端点,另外,每台host上各运行有一个Iperf容器用于测试。

通过swanctl --list-algs可以看到,所有支持的加密算法,其中由于我们load了openssl,已经能够支持NULL了。

查看xfrm里的ipsec规则,encryption已经为ciper_null,即不加密。

xfrm里的policy列出了到达对端iperf container的策略,即走IPSec tunnel。

跨主机测试

在两台主机上的iperf容器,一个作为iperf服务端,另一个作为客户端做带宽测试。

在测试过程中,需要抓包确认是否修改已经生效,如下:

可以看到,ESP sequence之后是0X45 0X00的,显然这是一个RAW的IP header。

为了确认这个信息,我们decode出该IP header中的src IP和dst IP,分别为:

0x0A 0X2A 0XF4 0XFA 和0x0A 0x2A 0xB4 0xF9

0x0A 0X2A 0XF4 0XFA = 10.42.224.250

0x0A 0x2A 0xB4 0xF9 = 10.42.180.249

这两台IP地址正是我们的iperf服务端和客户端容器的IP地址;因此,可以判断此时报文是没有经过加密的;我们的修改已生效。

更改前

更改后

经在两台千兆网卡的服务器上5分钟iperf测试,使用Rancher原生Managed网络的带宽为600+Mbps,在修改加密方式为NULL之后,iperf测试带宽提升为800+Mbps。

转载于:https://blog.51cto.com/12462495/1897187

Rancher Managed Network实践相关推荐

  1. rancher 部署和实践

    官网 Rancher 是一个 Kubernetes 管理工具,它可以添加K8S集群也可以导入已经有的K8S集群. ## 中文文档 https://docs.rancher.cn/## https:// ...

  2. docker、K8S、k3s、rancher

    第一:docker 基础使用 docker 竞品 最新调查:OpenStack.Docker.KVM被评为最火的云开源项目. Docker替代品,Containerd Docker与KVM之间的区别( ...

  3. 网管软件最常用协议SNMP(Simple Network Management Protocol)介绍

    SNMP是英文"Simple Network Management Protocol"的缩写,中文意思是"简单网络管理协议".SNMP首先是由Internet工 ...

  4. Rancher 官方在线培训-教学视频链接及内容目录

    Rancher 官方在线培训-教学视频链接及内容目录 2018年5月-2019年5月免费培训视频(共21期): http://e.vhall.com/user/home/20160226 2017年第 ...

  5. AI独角兽商汤科技的内部服务容器化历程

    本文由阿尔曼,商汤科技运维工程师于4月26日晚在Rancher微信群所做的技术分享整理而成.商汤科技是专注于计算机视觉领域的AI公司.本次分享结合了容器平台团队帮助公司业务/内部服务容器化历程,介绍商 ...

  6. 《中国管理安全服务(MSS)市场研究报告2010》读后感

    [前言]MSS,英文叫做Managed Security Service,这个名词最早出现在上世纪90年代中期,伴随着互联网的兴起而迅速发展起来.而从事MSS的服务商称作MSSP,MSS Provid ...

  7. openwrt 做二级路由 同网段无线桥接教程 relayd

    网址:http://trac.gateworks.com/wiki/OpenWrt/wireless/relayd Gateworks Single Board Computers Gateworks ...

  8. Fedora Core 6安装手册

    目录 前言     1.关于Fedora Core         2.关于本手册         3.感谢 1. 背景 2. 理解i386和其他计算机体系 3. 开始安装前         3.1. ...

  9. 万字干货 | IBO的金融原理和应用方向分析

    导读:关于IBO市场的各种分析如天花烂坠,但大都如耍流氓般只给结论,让阅读者怀疑人生,信也不是不信也不是.而本文作者从经济学.金融学基础原理出发,将IBO市场的金融特性.应用前景,事无巨细整理进统一的 ...

  10. 【IPTV】Hybrid Video解决方案概念与价值

    个人的理解:华为hybrid video 平台是想打造一个基于video领域通用的一个平台,从而快速自适应于传统TV ,IPTV ,OTT这三个电信最主要的业务.从平台上看主要是IPTV业务为主.兼或 ...

最新文章

  1. 【iOS开发】企业版证书($299)In-House方式发布指南 (转)
  2. 基于原子探索者stm32f407开发板的ucos-iii+lwip1.4.1的tcp server并发服务器完美解决例程(转)...
  3. java之七 高级类设计
  4. ajax常见错误和使用总结
  5. java实现资源监视器_实现Java监视的12个步骤程序存在缺陷
  6. Netty 中 IOException: Connection reset by peer 与 java.nio.channels.ClosedChannelException: null
  7. 表达式括号匹配(信息学奥赛一本通-T1353)
  8. mysql字段自动计算_MySQL创建计算字段
  9. 神奇!只用标签名称就可以做文本分类
  10. 由一本书看一个行业 -- 网上购书之比较
  11. 4S综合管理系统源码 汽车美容4S店管理服务源码
  12. c语言程序设计万年历要求功能如下: 1,查询某年某月某日是星期几,c语言万年历...
  13. vue3引入particles(粒子特效)
  14. Excel编程——自动换行
  15. 制作放射冲击星空粒子海报图片的PS教程
  16. 小米的隔空充电技术或许是概念产品,需要跨越的技术难点太多
  17. Redis框架(三):大众点评项目 基于Session的短信登录
  18. sequoia中的自动故障处理
  19. 丢手帕问题 java_初学java丢手帕问题
  20. linux 脚本 wait,shell脚本使用 timeout + wait 完成: 超时退出执行,等待执行完毕并处理执行结果 - yanbin's Blog...

热门文章

  1. 错误 Cannot load driver class: com.mysql.jdbc.Driver
  2. 打印图形(内测第1届第1题)
  3. mysql数据库下载和创建
  4. http学习笔记(四)——HTTP报文
  5. React Native/Android Studio (mac ) 查看 APP界面 对应 代码页 快捷方法
  6. Django基础—— 4.项目目录结构
  7. centos7 安装docker-ce ,最新版本docker,docker阿里云加速
  8. 【Linux开发】OpenCV在ARM-linux上的移植过程遇到的问题2---CMAKE配置问题
  9. 日更第4期-2015-1-19-openFrameworks系列第三讲-面向对象的小球们
  10. ADO.NET(二)