使用 WireGuard 构建跨云 VPN 网络

2024-08-01 12:53:21 浏览数 (2)

背景

在现代云计算环境中,随着服务和应用的分布化,跨云连接的需求日益增长。本文将介绍如何使用 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 运行四个服务:

  1. wireguard
  2. xray
  3. xray-tproxy
  4. udp2raw 备用

下面是对每个VPN网关运行的四个服务的简要描述,以及VPN GW1和VPN GW2如何连接的详细说明。

  1. WireGuard是一种现代的VPN协议,提供高效、快速和安全的点对点连接。它采用简单的配置和高强度的加密算法,能够有效地保障数据的机密性和完整性。WireGuard适合各种网络环境,具有较低的延迟和较高的性能。
  2. Xray是一个多协议的代理工具,支持多种协议(如VLESS、VMess等)。它能够处理各种流量,并提供灵活的路由选择。Xray具有良好的性能和可扩展性,适合在复杂网络环境中使用,能够绕过防火墙和抵抗网络干扰。
  3. Xray TProxy(WireGuard over VLESS) Xray TProxy是Xray的一种功能,用于实现透明代理。它能够将流量从一个接口转发到另一个接口,特别适合于使用WireGuard over VLESS的场景。这种配置可以有效隐藏VPN流量,有效抵御ISP对流量的劫持,同时提供灵活的流量处理能力。
  4. 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中实现不同网段请求的转发。

  1. 网络架构概述

假设我们有两个VPN网关,GW-Host1和GW-Host2,它们分别连接到不同的Kubernetes集群,使用WireGuard进行VPN连接。以下是它们的网络配置:

GW-Host1: VPN子网:10.254.0.0/16

GW-Host2: VPN子网:10.255.0.0/16

  1. 配置IP转发
  • 在VPN GW配置IP转发: 在GW-Host1/GW-Host2上,确保IP转发已启用,以便能够转发不同网段的流量。在/etc/sysctl.conf中添加或修改以下行: net.ipv4.ip_forward = 1 应用 sudo sysctl -p
  1. 防火墙规则

为了确保请求能够顺利通过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地址,确保流量能够顺利通过外部网络。
  1. 配置路由表

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的请求:

集群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)。

  1. 验证和监控
  • 使用ping命令验证各个集群之间的连通性。
  • 使用tcpdump监控特定端口的流量,以确保请求被正确转发。
  • 检查VPN日志,确认WireGuard和Xray服务正常运行,且流量能够成功转发。

通过以上配置,VPN网关能够有效地转发不同网段的请求,确保多集群环境中的服务能够顺畅通信

0 人点赞