问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

使用 WireGuard 构建跨云 VPN 网络

创作时间:
作者:
@小白创作中心

使用 WireGuard 构建跨云 VPN 网络

引用
1
来源
1.
https://cloud.tencent.com/developer/article/2441320

在现代云计算环境中,随着服务和应用的分布化,跨云连接的需求日益增长。本文将介绍如何使用 WireGuard、udp2raw 和 Xray 构建一个基于开源软件的多集群、跨云的VPN网络。

背景

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

配置两个 Kubernetes 集群:

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流量通过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上配置防火墙规则:

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网关能够有效地转发不同网段的请求,确保多集群环境中的服务能够顺畅通信。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号