1 为什么要用 TCP 来传输?
WireGuard 是一种简洁、高效的 VPN 协议。它使用 UDP 传输,协议封装较少,在网络环境良好时通常能够获得较低的延迟和较高的传输效率。对于大多数场景而言,直接使用原生 WireGuard 就已经足够。
但在部分运营商网络、校园网或公司网络中,UDP 流量可能受到特殊限制。例如,网络设备可能会对长时间、大流量的 UDP 连接进行 QoS 限速,也可能直接丢弃特定端口或特征明显的 UDP 数据包。某些 NAT 环境对 UDP 会话的保持时间也比较短,最终表现为连接不稳定、速度异常,甚至数据包完全不可达。
这时,可以在 WireGuard 外面再增加一层基于 TCP 的传输:先让 Xray 接收 WireGuard 的 UDP 数据,再将其封装进一条 TCP 连接中发送。由于 TCP 流量在绝大多数网络中都能正常通过,这种方式可以提高 WireGuard 在受限网络环境中的可达性,并减少 UDP 被针对性限速的可能。
2 为什么选择 Xray?
能够将 UDP 流量封装到其他传输协议中的开源项目并不少,但许多工具只解决单一场景,项目活跃度、客户端支持和后续维护情况也各不相同。一旦上游停止更新,遇到新系统兼容性或网络环境变化时,处理起来会比较被动。
相比之下,Xray 拥有更成熟的协议实现和较完整的生态,能够在常见桌面与服务器系统上运行,也提供了灵活的入站、出站和路由配置。除了本文使用的 VLESS 与 TCP 组合外,还可以根据网络环境调整外层传输方式,不需要为每一种场景重新引入一套工具。
因此,选择 Xray 并不是因为它能让 WireGuard 本身变得更快,而是因为它可以作为稳定、通用的传输层,为 WireGuard 提供更好的网络适应能力,同时方便后续维护和扩展。
3 Wireguard over Vless
WireGuard 流量可以被 Xray 内核接收并封装到 VLESS 协议中传输,实际承载 WireGuard 数据的是 VLESS over Xray 提供的传输链路。
话不多说,直接开始部署教学:
3.1 安装 Xray
Xray Core 支持 Linux、macOS 和 Windows。三种系统的安装方式略有不同,但后续使用的配置格式基本一致。安装完成后可以先执行 xray version,确认程序已经能够正常运行。
对于使用 systemd 的 Linux 发行版,例如 Debian、Ubuntu、CentOS 和 openSUSE,可以直接使用 Xray 官方安装脚本:
1 | sudo bash -c "$(curl -L https://github.com/XTLS/Xray-install/raw/main/install-release.sh)" @ install |
脚本会同时安装 Xray Core、GeoIP、GeoSite 和 systemd 服务。主要文件位置如下:
1 | 程序:/usr/local/bin/xray |
编辑好配置文件后,启用并启动 Xray:
1 | sudo systemctl enable --now xray |
常用的服务管理命令如下:
1 | # 重启服务,使新配置生效 |
macOS 可以通过 Homebrew 安装:
1 | brew install xray |
Homebrew 会把配置文件安装到:
1 | $(brew --prefix)/etc/xray/config.json |
因此,Apple Silicon Mac 上通常是:
1 | /opt/homebrew/etc/xray/config.json |
Intel Mac 上通常是:
1 | /usr/local/etc/xray/config.json |
使用 Homebrew Services 启动并设置为登录后自动运行:
1 | brew services start xray |
其他常用命令:
1 | # 重启服务 |
Windows 没有对应的官方安装脚本,需要前往 Xray Core Releases 下载与系统架构匹配的压缩包。常见的 64 位 Windows 设备选择 Xray-windows-64.zip,ARM 设备则选择对应的 ARM64 版本。
下载后将压缩包解压到固定目录,例如:
1 | C:\xray\ |
然后在该目录中创建 config.json,最终结构类似:
1 | C:\xray\ |
在 PowerShell 中进入该目录并启动 Xray:
1 | cd C:\xray |
该命令会让 Xray 在当前终端前台运行,关闭窗口后进程也会结束。官方 ZIP 包不会自动注册 Windows 系统服务;如果需要开机自启或长期后台运行,可以再使用 WinSW、NSSM 等服务管理工具进行托管。
3.2 核心配置
Xray 本身不区分服务端和客户端。这里所谓服务端就是流量的出口,有公网 ip ;客户端就是流量入口,一般为移动设备。
服务端负责接收客户端发来的 VLESS + REALITY + TCP 连接,再把其中承载的 WireGuard UDP 数据转发到服务端本机的 WireGuard 监听端口:
1 | 客户端 Xray → VLESS + REALITY + TCP → 服务端 Xray → Freedom UDP 出站 → 服务端 WireGuard |
下面是带注释的服务端配置,字段结构与前面的客户端配置相对应:
1 | { |
完成 Xray 配置后,还需要修改部分 WireGuard 配置:
1 | [Interface] |
客户端的流量路径如下:
1 | WireGuard → 本机 Xray UDP 入站 → VLESS + REALITY + TCP → 服务端 Xray → 服务端 WireGuard |
下面是一份带注释的客户端配置。示例端口仅用于说明,请根据自己的环境修改:
1 | { |
完成 Xray 配置后,还需要修改部分 WireGuard 配置:
1 | [Interface] |
这里的 51821 必须与 Xray 入站的 port 一致。WireGuard 会把原本发往远端的 UDP 数据交给本机 Xray,再由 Xray 通过 VLESS 链路送到服务端的 127.0.0.1:51820。
3.3 工具命令
1 | # 生成 VLESS UUID |
Xray 只是一个内核工具,有测试指出 sing-box 对 UDP 的转发效率更高,有兴趣的可以自行尝试。
