Rancher Managed Network的示例分析

83次阅读
没有评论

共计 3869 个字符,预计需要花费 10 分钟才能阅读完成。

丸趣 TV 小编给大家分享一下 Rancher Managed Network 的示例分析,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!

IPSec 基本概念

这一节不准备详细讲解 IPSec 原理,只将一些重要概念点到为止,有兴趣的同学可以下来研究 IETF 的 RFC。我们首先用一张图来认识 IPSec 框架:

IPSec 模式

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

2. 隧道模式:适用于建立 site-2-site 的安全 VPN 隧道。(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

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 image 的方式来替换 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 所致:

Rancher Managed Network 的示例分析

修改方法是 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。

Rancher Managed Network 的示例分析

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

Rancher Managed Network 的示例分析

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

Rancher Managed Network 的示例分析

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

Rancher Managed Network 的示例分析

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

Rancher Managed Network 的示例分析

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

跨主机测试

在两台主机上的 iperf 容器,一个作为 iperf 服务端,另一个作为客户端做带宽测试。在测试过程中,需要抓包确认是否修改已经生效,如下:

Rancher Managed Network 的示例分析

可以看到,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 地址;因此,可以判断此时报文是没有经过加密的;我们的修改已生效。

更改前

Rancher Managed Network 的示例分析

更改后

Rancher Managed Network 的示例分析

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

看完了这篇文章,相信你对“Rancher Managed Network 的示例分析”有了一定的了解,如果想了解更多相关知识,欢迎关注丸趣 TV 行业资讯频道,感谢各位的阅读!

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-08-04发表,共计3869字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)