共计 3322 个字符,预计需要花费 9 分钟才能阅读完成。
去年 6 月,Tigera[1] 首次发表在 K8s 上反对用于集群内加密传输的开源 VPN – WireGuard[2]。咱们从来不喜爱坐以待毙,因而咱们始终在致力为这项技术开发一些令人兴奋的新性能,其中第一个性能是应用 Azure 容器网络接口(CNI)[3] 在 Azure Kubernetes 服务(AKS)[4] 上反对 WireGuard。
首先,这里简略回顾一下什么是 WireGuard 以及咱们如何在 Calico 中应用它。
WireGuard 是一种 VPN 技术,从 Linux 5.6 内核开始默认蕴含在内核中,它被定位为 IPsec 和 OpenVPN 的替代品,旨在更加疾速、平安、易于部署和治理。正如不断涌现的 SSL/TLS 的破绽显示,明码的敏捷性会极大减少复杂性,这与 WireGuard 的指标不符,为此,WireGuard 成心将明码和算法的配置灵活性升高,以缩小该技术的攻击面和可审计性。它的指标是更加简略疾速,所以应用规范的 Linux 网络命令便能够很容易地进行配置,并且只有约 4000 行代码,使得它的代码可读性高、容易了解、审查。
WireGuard 是一种 VPN 技术,通常被认为是 C/S 架构,它同样能在对等的网格网络架构中配置应用,这就是 Tigera 设计的能够在 Kubernetes 中应用的 WireGuard 解决方案。应用 Calico,将所有启用 WireGuard 的节点互相对等造成一个加密的网格。它甚至反对在同一集群内同时蕴含启用 WireGuard 的节点与未启用 WireGuard 的节点,并且能够互相通信。
咱们抉择 WireGuard 并不是一个折中的计划。咱们心愿提供最简略、最平安、最疾速的形式来加密传输 Kubernetes 集群中的数据,mTLS、IPsec 或简单的配置不是咱们想要的。事实上,你能够把 WireGuard 看成是另一个具备加密性能的 overlay。
用户只需一条命令就能够启用 WireGuard,而 Calico 负责实现残余的工作,包含:
- 在每个节点创立 WireGuard 的网络接口。
- 计算编写最优的 MTU。
- 为每个节点创立 WireGuard 公钥私钥对。
- 向每个节点增加公钥,以便在集群中共享资源。
- 将所有节点编辑为对等节点。
- 应用防火墙标记(fwmark)编辑 IP route、IP tables 和 Routing tables,以此正确处理各自节点上的路由。
仅需指明用意,其余的事件都由集群实现。
应用 WireGuard 时的数据包流向
下图显示了启用 WireGuard 后集群中的各种数据包流量状况。
同一主机上的 Pod:
- 数据包被路由到 WireGuard 表。
- 如果指标 IP 是同一主机上的 Pod,则 Calico 将在 WireGuard 路由表中插入一个“throw”条目,将数据包疏导回主路由表。数据包被定向到指标 Pod 的 veth 接口,并且它将在未加密的状况下流动(在图中以绿色显示)。
不同节点上的 Pod:
- 数据包被路由到 WireGuard 表。
- 路由条目与指标 Pod IP 匹配并发送到 WireGuard 组件:cali.wireguard。
- WireGuard 组件加密并封装数据包(在图中以红色显示)并设置 fwmark 以避免路由环路。
- WireGuard 组件应用它与指标 Pod IP(容许的 IP)匹配的对等方的公钥对数据包进行加密,将其封装在 UDP 中,并应用非凡的 fwmark 对其进行标记以避免路由环路。
- 数据包通过 eth0 发送到指标节点并解密。
- 这也实用于主机流量(例如,节点联网的 Pod)。
在以下动画中,您能够看到 3 种流量:
- 同一主机上 Pod 到 Pod 未被加密的流量。
- 不同主机上的 Pod 到 Pod 被加密的流量。
- 主机到主机的流量也会被加密。
留神: 绿色示意未加密流量,红色示意加密流量。
动画演示 [5]
WireGuard 在 AKS 中的利用
在 AKS 上应用 Azure CNI 对 WireGuard 的反对带来了一些十分乏味的挑战。
首先,应用 Azure CNI 意味着不应用 Calico IPAM(IP 地址治理)治理 CIDR(无类域间路由)块调配的 Pod IP。相同,它们是采纳节点 IP 雷同的调配形式从底层 VNet 调配的。这对 WireGuard 路由来说是一个乏味的挑战,以往咱们能够在 WireGuard 配置中的 Allowed IPs 列表中增加一个 CIDR 块,相比之下,咱们当初必须写出该节点所有 Pod IP。这须要 Calico 将 routeSource 的配置设为 workloadIPs。如果您应用的是 AKS 集群进行部署,便无需额定配置。
应用 wireguard-tools 中优良的工具 wg[6],能够查看集群内节点容许通过的 IP 列表,其中包含每个节点的 Pod IP 和主机 IP(留神终端 IP 也在容许 IP 列表中)。在 AKS 上提供了业务流量加密和主机到主机的加密。
interface: wireguard.cali
public key: bbcKpAY+Q9VpmIRLT+yPaaOALxqnonxBuk5LRlvKClA=
private key: (hidden)
listening port: 51820
fwmark: 0x100000
peer: /r0PzTX6F0ZrW9ExPQE8zou2rh1vb20IU6SrXMiKImw=
endpoint: 10.240.0.64:51820
allowed ips: 10.240.0.64/32, 10.240.0.65/32, 10.240.0.66/32
latest handshake: 11 seconds ago
transfer: 1.17 MiB received, 3.04 MiB sent
peer: QfUXYghyJWDcy+xLW0o+xJVsQhurVNdqtbstTsdOp20=
endpoint: 10.240.0.4:51820
allowed ips: 10.240.0.4/32, 10.240.0.5/32, 10.240.0.6/32
latest handshake: 46 seconds ago
transfer: 83.48 KiB received, 365.77 KiB sent
第二个挑战是正确处理 MTU(最大传输单元)。Azure 设置的 MTU 是 1500[7],而 WireGuard 在数据包上设置了一个 DF(Don’t Fragment)标记。如果没有正确调整 WireGuard MTU,咱们会在启用 WireGuard 时发现有丢包和低带宽。咱们能够在 AKS 中通过 Calico 自动检测并为 WireGuard 的 MTU[8] 设置正确的开销来优化。
咱们还能够将节点 IP 自身增加为对等节点容许通信的 IP,并通过 AKS 中的 WireGuard 解决主机联网的 Pod 和主机到主机通信。主机到主机通信的办法是,当 RPF[9](反向门路转发)产生时,通过 WireGuard 接口取得路由返回的响应。通过在发送到目标节点的数据包上设置一个标记,而后配置内核以恪守 sysctl 中的 RPF 标记来解决这个问题。
当初应用 AKS 时,节点之间的业务流量和主机到主机通信都会被加密,仅需指明用意,其余的事件都由集群实现。
援用链接
[1] Tigera: https://www.tigera.io/?utm_co…
[2] WireGuard: https://www.wireguard.com/
[3] Azure 容器网络接口: https://github.com/Azure/azur…
[4] Azure Kubernetes 服务: https://azure.microsoft.com/e…
[5] 动画演示: https://tigera.wistia.com/med…
[6] wg: https://git.zx2c4.com/wiregua…
[7] Azure 设置的 MTU 是 1500: https://docs.microsoft.com/en…
[8] WireGuard 的 MTU: https://docs.projectcalico.or…
[9] RPF: https://en.wikipedia.org/wiki…
[10] 原文链接:https://thenewstack.io/calico…
作者
Peter Kelly
本文由博客一文多发平台 OpenWrite 公布!