背景
在现代云计算环境中,随着服务和应用的分布化,跨云连接的需求日益增长。本文将介绍如何使用 WireGuard、udp2raw 和 Xray 构建一个基于开源软件的多集群、跨云的VPN网络。
通过利用开源工具,能够构建一个灵活、高效且具有成本效益的解决方案,以满足不同业务需求。本质上实现了一个简单的传输网关(TGW),通过有效地转发和加密流量,确保不同云平台和Kubernetes集群之间的安全通信。
本文将详细介绍这一架构的实施步骤、关键组件以及它们如何协同工作,以便构建一个强大的跨云网络环境。
准备工作
配置两个 VPN 网关:
Host | GW IP | VPN subnet | Soft |
---|---|---|---|
GW-Host1 | 10.254.0.1 | 10.254.0.0/16 | wireguard/udp2raw/Xray |
GW-Host2 | 10.255.0.1 | 10.255.0.0/16 | wireguard/udp2raw/Xray |
Cluster | Pod subnet | SVC subnet | Soft |
---|---|---|---|
k8s-1 | 10.42.0.0/16 | 10.42.0.0/16 | K3S |
k8s-2 | 10.44.0.0/16 | 10.45.0.0/16 | K3S |
示意图如下:
部署思路
关键工具:
- WireGuard:提供快速、安全的VPN连接。
- udp2raw:允许将UDP流量伪装为TCP流量,以绕过网络限制。
- Xray:实现透明代理和流量转发,确保数据传输的隐蔽性和可靠性。
每个VPN GW 运行四个服务:
- wireguard
- xray
- xray-tproxy
- udp2raw 备用
下面是对每个VPN网关运行的四个服务的简要描述,以及VPN GW1和VPN GW2如何连接的详细说明。
- WireGuard是一种现代的VPN协议,提供高效、快速和安全的点对点连接。它采用简单的配置和高强度的加密算法,能够有效地保障数据的机密性和完整性。WireGuard适合各种网络环境,具有较低的延迟和较高的性能。
- Xray是一个多协议的代理工具,支持多种协议(如VLESS、VMess等)。它能够处理各种流量,并提供灵活的路由选择。Xray具有良好的性能和可扩展性,适合在复杂网络环境中使用,能够绕过防火墙和抵抗网络干扰。
- Xray TProxy(WireGuard over VLESS) Xray TProxy是Xray的一种功能,用于实现透明代理。它能够将流量从一个接口转发到另一个接口,特别适合于使用WireGuard over VLESS的场景。这种配置可以有效隐藏VPN流量,有效抵御ISP对流量的劫持,同时提供灵活的流量处理能力。
- udp2raw(备选,WireGuard over TCP) udp2raw是一种用于将UDP流量伪装为TCP流量的工具,旨在绕过防火墙和流量限制。在VPN环境中,udp2raw可以作为备选方案,提供稳定的连接,尤其是在ISP对UDP流量施加限速时,使用udp2raw将WireGuard流量转换为TCP流量,有助于保持连接的可靠性。
VPN GW1 <-> VPN GW2 连接方式
WireGuard over VLESS 连接流程
- 在GW-Host1上,Xray监听127.0.0.1:51830,处理来自本地的VLESS流量
- Xray TProxy 实现透明代理,将本机接口UDP:51830 转发到GW-Host2的WireGuard 端口UDP:51820 ,
- 在GW-Host2上,WireGuard接收来自GW-Host1的WireGuard 协议,通过本机Xray TProxy 服务转发到GW-Host1的WireGuard 端口UDP:51820,请求返回给GW-Host1,确保双向通信
WireGuard over TCP 连接流程
- GW-Host1上,udp2raw 监听地址为127.0.0.1:51831,将流量封装为TCP请求,将流量发送到GW-Host2 udp2raw 服务的 TCP:2443端口,
- GW-Host2上,WireGuard接收来自GW-Host1的封装TCP流量后,转发给GW-Host2 udp2raw 服务。
- GW-Host2,解封TCP流量后,转发给WireGuard服务处理欺请求,再次通过udp2raw将响应数据通过相同的TCP隧道返回GW-Host1,实现双向通信
主要差异
| 特性 | WireGuard over VLESS | WireGuard over TCP |
特性 | WireGuard over VLESS | WireGuard over TCP |
---|---|---|
流量封装 | WireGuard流量通过VLESS加密和转发 | WireGuard流量通过TCP隧道封装 |
隐蔽性 | 提供更高的隐蔽性,适合穿越防火墙 | 封装成TCP流,可能不如VLESS隐蔽 |
防火墙穿透能力 | 通过使用多种传输协议提高防火墙穿透能力 | 适用于TCP友好的网络环境,较容易穿透防火墙 |
性能 | 由于使用UDP,通常具有较低的延迟和更高的性能 | 由于TCP的重传机制,可能存在较高的延迟 |
连接可靠性 | 依赖于UDP的特性,性能高但可靠性较低 | TCP提供了数据完整性和顺序保证,连接更可靠 |
通过主连接(WireGuard over VLESS)和备连接(WireGuard over TCP)的组合,VPN GW1和VPN GW2能够在不同的网络条件下保持可靠的连接。这种配置能够有效应对网络运营商的干扰和限速,确保数据的安全传输。
流量转发
在构建多集群跨云VPN网络时,VPN网关(GW)需要能够转发不同网段的请求。这通常涉及到正确的路由配置、IP转发和防火墙规则,以确保来自不同子网的流量能够正确转发和处理。下面详细介绍如何在VPN GW中实现不同网段请求的转发。
- 网络架构概述
假设我们有两个VPN网关,GW-Host1和GW-Host2,它们分别连接到不同的Kubernetes集群,使用WireGuard进行VPN连接。以下是它们的网络配置:
GW-Host1: VPN子网:10.254.0.0/16
GW-Host2: VPN子网:10.255.0.0/16
- 配置IP转发
- 在VPN GW配置IP转发: 在GW-Host1/GW-Host2上,确保IP转发已启用,以便能够转发不同网段的流量。在/etc/sysctl.conf中添加或修改以下行: net.ipv4.ip_forward = 1 应用 sudo sysctl -p
- 防火墙规则
为了确保请求能够顺利通过VPN网关,需要配置防火墙规则,以允许不同网段的流量通过。
在GW-Host1/GW-Host2上配置防火墙规则
代码语言:bash复制iptables -I FORWARD -o %i -j ACCEPT
iptables -A FORWARD -s 10.254.0.0/16 -d 10.255.0.0/16 -j ACCEPT
iptables -A FORWARD -s 10.255.0.0/16 -d 10.254.0.0/16 -j ACCEPT
iptables -A FORWARD -i wg0 -j ACCEPT ; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
- 规则1: 允许所有通过指定输出接口的流量。这对于确保VPN网关可以接收并转发流量是必要的。
- 规则2: 允许来自GW-Host1的流量转发到GW-Host2,确保这两个子网之间的通信。
- 规则3: 允许来自GW-Host2的流量转发到GW-Host1,确保这两个子网之间的双向通信。
- 规则4: 将出站流量的源IP地址替换为GW网关的外部IP地址,从而允许内部流量在出站时隐藏其真实IP地址,确保流量能够顺利通过外部网络。
- 配置路由表
GW-Host1配置:
使用ip route命令为不同网段添加路由:
ip route add 10.255.0.0/16 dev wg0 scope link
这条路由确保GW-Host1能够将来自集群1的流量(如10.254.0.0/16)转发到GW-Host2。
反之
GW-Host2配置:
ip route add 10.254.0.0/16 dev wg0 scope link
这条路由确保GW-Host1能够将来自集群1的流量(如10.255.0.0/16)转发到GW-Host2。
- 流量转发流程 请求转发示例
- 来自集群1的请求:
集群1中的Pod(IP为10.42.0.5)向集群2中的服务发送请求。
请求发送到GW-Host1(VPN GW1),并通过WireGuard转发到GW-Host2(VPN GW2)。
GW-Host2接收请求并将其转发到集群2中的相应Pod(IP为10.44.0.5)。
- 来自集群2的请求:
集群2中的Pod(IP为10.44.0.5)向集群1中的服务发送请求。
请求发送到GW-Host2(VPN GW2),并通过WireGuard转发到GW-Host1(VPN GW1)。
GW-Host1接收请求并将其转发到集群1中的相应Pod(IP为10.42.0.5)。
- 验证和监控
- 使用ping命令验证各个集群之间的连通性。
- 使用tcpdump监控特定端口的流量,以确保请求被正确转发。
- 检查VPN日志,确认WireGuard和Xray服务正常运行,且流量能够成功转发。
通过以上配置,VPN网关能够有效地转发不同网段的请求,确保多集群环境中的服务能够顺畅通信