作者:Peter Kelly

译者:Wendi Wang

注:本文已取得作者本人的翻译授权!

去年6月,Tigera 宣布首次在 K8s 上支持用于集群内加密传输的开源 VPN - WireGuard 。我们从来不喜欢坐以待毙,所以我们一直在努力为这项技术开发一些令人兴奋的新功能,其中第一个功能是使用 Azure 容器网络接口(CNI)在 Azure Kubernetes 服务(AKS)上支持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 被加密的流量。
  • 主机到主机的流量也会被加密。

注意:绿色表示未加密流量,红色表示加密流量。

动画演示

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,可以查看集群内节点允许通过的 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,而 WireGuard 在数据包上设置了一个 DF(Don't Fragment)标记。如果没有正确调整 WireGuard MTU,我们会在启用 WireGuard 时发现有丢包和低带宽。我们可以在 AKS 中通过Calico 自动检测并为 WireGuard 的 MTU 设置正确的开销来优化。

我们还可以将节点 IP 本身添加为对等节点允许通信的 IP ,并通过 AKS 中的 WireGuard 处理主机联网的 Pod 和主机到主机通信。主机到主机通信的方法是,当 RPF(反向路径转发)发生时,通过 WireGuard 接口获得路由返回的响应。通过在发送到目的节点的数据包上设置一个标记,然后配置内核以尊守 sysctl 中的 RPF 标记来解决这个问题。

现在您使用AKS时,节点之间的业务流量和主机到主机通信都会被加密。您仅需指明意图,其他的事情都由集群完成。

本文由博客一文多发平台 OpenWrite 发布!

在 Azure CNI 中启用 Calico WireGuard的更多相关文章

  1. 【Azure Application Insights】在Azure Function中启用Application Insights后,如何配置不输出某些日志到AI 的Trace中

    问题描述 基于.NET Core的Function App如果配置了Application Insights之后,每有一个函数被执行,则在Application Insights中的Logs中的tra ...

  2. 使用Azure Functions 在web 应用中启用自动更新(一)分析基于轮询的 Web 应用的限制

    1,引言 上一篇介绍了使用使用 Visual Studio 开发 "Azure Functions" 函数,此篇介绍 “Azure Functions” 的测试以及直接从 Vist ...

  3. 运行预构建 Linux 映像的 Windows Azure 虚拟机中的交换空间 – 第 1 部分

    本文章由 Azure CAT 团队的 Piyush Ranjan (MSFT) 撰写. 随着基础结构服务(虚拟机和虚拟网络)近期在 Windows Azure 上正式发布,越来越多的企业工作负荷正在向 ...

  4. 探索 Windows Azure 网站中的自动伸缩功能

     去年10月,我们发布了若干针对 WindowsAzure平台的更新,其中一项更新是添加了基于日期的自动伸缩调度支持(在不同的日期设置不同的规则). 在这篇博客文章中,我们将了解自动伸缩的概念,并 ...

  5. 在 Windows Azure 网站中配置动态 IP 地址限制

    我们最近对 Windows Azure 网站进行了升级,并启用了IIS8的动态 IP 限制模块.现在,开发人员可以为其网站启用并配置动态 IP 限制功能(或简称 DIPR). 可以通过以下链接查看此 ...

  6. 如何将Azure DevOps中的代码发布到Azure App Service中

    标题:如何将Azure DevOps中的代码发布到Azure App Service中 作者:Lamond Lu 背景 最近做了几个项目一直在用Azure DevOps和Azure App Servi ...

  7. Azure 应用服务中的 API 应用、ASP.NET 和 Swagger 入门

    学习内容: 如何通过 Visual Studio 2015 中的内置工具在 Azure 应用服务中创建和部署 API 应用. 如何使用 Swashbuckle NuGet 包动态生成 Swagger ...

  8. 在 Azure 虚拟机中配置 Always On 可用性组(经典)

    在开始之前,请先假设现在可以在 Azure Resource Manager 模型中完成此任务. 我们建议使用 Azure Resource Manager 模型来进行新的部署. 请参阅 Azure ...

  9. 在 ASP.NET Core 中启用跨域请求(CORS)

    本文介绍如何在 ASP.NET Core 的应用程序中启用 CORS. 浏览器安全可以防止网页向其他域发送请求,而不是为网页提供服务. 此限制称为相同源策略. 同一源策略可防止恶意站点读取另一个站点中 ...

  10. 【应用程序见解 Application Insights】使用Azure Monitor Application Insights Agent获取Azure VM中监控数据及IIS请求指标等信息

    问题情形 为了使用Application Insights也可以监控Azure VM中的相关性能数据,如CPU, Memory,IIS Reuqest等信息,可以在VM中开始一个一个扩展插件: Azu ...

随机推荐

  1. 光刻机巨头ASML公布了其最新的品牌短片《站在巨人的肩膀上》

    光刻机巨头ASML公布了其最新的品牌短片<站在巨人的肩膀上>: 荷兰光刻机:ASML使用AI工具midjourney和runway制作宣传片 这个时长1分50秒短片的特别地方在于,它是完全 ...

  2. pip install ale_python_interface 安装报错,ModuleNotFoundError: No module named 'ale_python_interface'——fatal error: ale_c_wrapper.h

    参考: https://www.cnblogs.com/hasakei/p/10035198.html https://blog.csdn.net/senjie_wang/article/detail ...

  3. conda中安装GCC/G++

    参考: https://www.5axxw.com/questions/content/h0e4te ========================================== 一般在lin ...

  4. boulanni / theano-hf

    https://github.com/boulanni/theano-hf https://people.duke.edu/~hpgavin/ExperimentalSystems/lm.pdf ht ...

  5. nvidia显卡的售后真的是不敢要人恭维——拆机箱时误拧显卡自身挡板螺丝被拒保

    事情比较简单,单位在nvidia的经销商那里购买的nvidia titan rtx显卡,保修期内坏掉,拆下来的过程中误拧了挡板的螺丝,结果被拒保,这里就是单纯的记录这件事情. 这件事确实我这方面有不对 ...

  6. [COCI2013-2014#6] KRUŽNICE 题解

    前言 题目链接:洛谷. 题目分析 显然,手模样例发现答案分为以下几个贡献: 所有圆外面的那个大平面,贡献为 \(1\). 每个圆至少被分成一部分,贡献为 \(n\). 如果有一个圆被"拦腰截 ...

  7. FFmpeg开发笔记(四十五)使用SRT Streamer开启APP直播推流

    ​SRT Streamer是一个安卓手机端的开源SRT协议直播推流框架,可用于RTMP直播和SRT直播.SRT Streamer支持的视频编码包括H264.H265等等,支持的音频编码包括AAC.OP ...

  8. ViT和MAE模型结合初探

    介绍 transfomer在NLP领域的应用已经非常广泛,但是在CV领域的应用还比较少,主要是因为CV领域的数据是二维的,而transfomer是基于序列的,因此需要将二维数据转换成序列数据,这就是V ...

  9. 16-canvas绘制圆弧

    1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="U ...

  10. java判断文本文件编码格式

    上篇文章需要读取当前java或者配置文件的编码格式,这里主要支持UTF-8.GBK.UTF-16.Unicode等 /** * 判断文件的编码格式 * @param fileName :file * ...