作者: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 發布!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/298799.html
標籤:其他
上一篇:[HAOI2007,P2216,BZOJ1047]理想的正方形單調佇列解法
下一篇:小米路由器3刷x-wrt分享
