使用 WireGuard 打通阿里云与腾讯云容器网络
解读
在国内多云场景下,企业常把无状态微服务放在阿里云 ACK、腾讯云 TKE 等不同托管集群,但两朵云的 VPC CIDR 与容器 CIDR 各自独立,天然隔离。面试官想验证候选人能否:
- 用轻量级 VPN 而非昂贵专线,在 24 小时内打通两层网络(VPC 层 + 容器层);
- 保证双向路由可达、性能损耗 <5%、MTU 无碎片化;
- 满足国家合规要求(日志留痕、加密算法国密可选);
- 对 Docker 容器平台无侵入,支持后续灰度迁移到容器服务网格。
知识点
- WireGuard 内核级 UDP 隧道,比 IPSec 少 30% CPU,支持 roaming,内核 ≥5.6 已主线集成。
- 阿里云 VPC 路由表 50 条免费额度,需绑定 VRouter;腾讯云子网路由表 需绑定云主机路由策略。
- 容器 CNI 网段独立性:Flannel VXLAN 默认 10.244.0.0/16,Calico BGP 可自定义 192.168.0.0/16,需做SNAT/IPMasq 区分。
- 内核参数:net.ipv4.ip_forward=1、net.ipv4.conf.all.rp_filter=0,否则源地址校验丢包。
- MTU 分片:WireGuard 开销 80 字节,VXLAN 开销 50 字节,需把容器网卡 MTU 降到 1350 以下。
- 国密合规:WireGuard 内核模块可替换为sm4-gcm 分支,或在用户态用WireGuard-Go + 国密 TLS 代理二次封装。
- Docker 重启策略:VPN 容器必须 restart=always,防止节点漂移后隧道 Down。
- 故障排查:tcpdump -i wg0 看 51820/udp 是否被安全组拦截;conntrack -L 检查 SNAT 表是否残留。
答案
-
规划网段
阿里云 VPC 10.10.0.0/16,容器 10.100.0.0/16;腾讯云 VPC 10.20.0.0/16,容器 10.200.0.0/16。确保两边无重叠。 -
创建 VPN 网关节点
每朵云各起一台 2 vCPU 4 GiB 的 ECS/CVM,放通安全组 UDP 51820,关闭源地址校验。 -
安装 WireGuard
国内源加速:yum install -y kmod-wireguard wireguard-tools(CentOS)或apt install -y wireguard(Ubuntu≥20.04)。 -
生成密钥
wg genkey | tee privatekey | wg pubkey > publickey私钥放 /etc/wireguard/wg0.conf,权限 600。
-
配置 wg0.conf(阿里云侧示例)
[Interface] PrivateKey = <阿里私钥> Address = 192.168.254.1/30 ListenPort = 51820 PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -s 10.100.0.0/16 ! -d 10.200.0.0/16 -j MASQUERADE PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -s 10.100.0.0/16 ! -d 10.200.0.0/16 -j MASQUERADE [Peer] PublicKey = <腾讯公钥> AllowedIPs = 192.168.254.2/32, 10.20.0.0/16, 10.200.0.0/16 Endpoint = <腾讯公网IP>:51820 PersistentKeepalive = 25 -
腾讯云侧对称配置,AllowedIPs 写 10.10.0.0/16, 10.100.0.0/16。
-
注入 VPC 路由
阿里云路由表加 10.20.0.0/16 → 阿里云 VPN 内网 IP;腾讯云路由表加 10.10.0.0/16 → 腾讯云 VPN 内网 IP。若使用 CCN/云联网,可省略静态路由,由云联网自动学习。 -
容器网络打通
- Flannel:在 kube-flannel-cfg ConfigMap 的 net-conf.json 里,把 "SubnetLen" 24 保持不变,但需确认 "Backend": "vxlan" 不会二次封装;否则改 host-gw 模式,性能更高。
- Calico:在 FelixConfiguration 把 ipipMode 设为 Never,关闭 IPIP 隧道,直接走 WireGuard 层三。
-
验证
kubectl run --rm -it --image=nicolaka/netshoot test -- ping 10.200.x.xRTT 增加 < 2 ms 即达标;iperf3 测速 1 Gbps 带宽损耗 <5%。
-
高可用
每朵云起 双节点 + systemd-auto wg-quick@wg0 + keepalived VIP,VIP 绑定到公网弹性网卡,实现秒级漂移。 -
安全加固
- 镜像最小化:alpine-wireguard 仅 12 MB,非 root 运行需 CAP_NET_ADMIN。
- Secrets 管理:把 privatekey 存入 KMS/SSM,通过 initContainer 挂载 tmpfs,容器退出即销毁。
- 日志:rsyslog + 阿里云 SLS 或腾讯云 CLS 统一收集,留存 180 天。
-
灰度拆除
后续若改用 云企业网 CEN + 对等连接,只需在 WireGuard 容器里调低 AllowedIPs 掩码逐步缩段,实现零中断迁移。
拓展思考
- IPv6 双栈:WireGuard 原生支持 v6 over v4,若阿里云/腾讯云 VPC 已开通 IPv6,可直接传递 fd00::/64 容器地址,避免 NAT。
- eBPF 加速:用 Cilium 替代 Flannel,开启 WireGuard beta 加密模式,把 VPN 与容器网络合二为一,节省一次内核转发。
- 国密合规落地:生产环境可改用 WireGuard-Go + sm4-gcm 用户态实现,性能下降约 15%,但满足央行金融云验收。
- 成本对比:按量计费 1 Mbps 专线 0.46 元/小时,WireGuard 方案仅消耗 2 台 1 vCPU 共享型 ECS 约 0.08 元/小时,节省 80%。
- 多云灾备:在华为云加第三节点,形成 full-mesh WireGuard,利用 BGP Unnumbered 把容器网段宣告到 VPC,实现秒级流量调度。