利用 Xray + OpenVPN 搭建多出口智能代理
第一章:引言
1.1 多出口代理:解决方案对比
网络访问需要多个不同地区出口 IP 的场景很常见,但现有解决方案往往存在不足:
1.多台 VPS 方案:传统分流方案通常需要在不同国家/地区部署多台 VPS,成本高昂且管理复杂。
- 每台 VPS 月费 $5-10 不等
- 需要分别维护多台服务器
- 配置复杂,难以统一管理
2.WARP 方案:虽然 Cloudflare WARP 可以提供全球网络加速,但其出口 IP 往往受限于 VPS 所在地区,难以实现真正的多地区 IP。
- 出口 IP 地区受限
- 无法满足特定地区 IP 的需求
- 不稳定,时常变动
3.单纯 VPN 方案:直接使用 VPN 服务虽然可以切换不同地区 IP,但不支持智能分流,需要频繁手动切换。
- 无法同时使用多个出口
- 不支持按需分流
- 客户端使用不便
1.2 Xray + OpenVPN:高性价比的理想方案
本文介绍的方案只需一台 VPS + 一个 VPN 账户就能实现多出口智能代理:
- 成本效益高:只需支付一台 VPS 和一个 VPN 账户的费用
- 资源利用率高:一台 VPS 同时运行多个 OpenVPN 客户端连接
- 管理简便:集中化管理所有出口
- 灵活可扩展:可根据需求随时添加或移除特定地区出口
1.3 为什么选择 OpenVPN 而非 WireGuard?
OpenVPN 虽然性能略逊于 WireGuard,但具有更广泛的兼容性:
- 大多数商业 VPN 服务提供 OpenVPN 配置文件
- 配置文件格式标准统一,易于批量处理
- 更成熟的错误处理机制,连接更稳定
注意:如果你使用的 VPN 服务提供 WireGuard 配置,也可以用类似方法配置 WireGuard 实现更好的性能。本文以 OpenVPN 为例,原理完全适用于 WireGuard。
1.4 系统架构概览
本方案的核心架构如下:
- VPS 层:一台位于优质线路的 VPS
- VPN 层:在 VPS 上运行多个 OpenVPN 客户端,连接到不同国家/地区的服务器
- 代理层:使用 Xray 配置多个入站端口,对应不同的 OpenVPN 出口
- 分流层:通过 Xray 的路由规则,实现智能分流
接下来,让我们一步步实现这个高效的多出口代理系统。
第二章:搭建OpenVPN 多出口
OpenVPN 是我们系统的基础,它将为我们提供多个国家的出口 IP。在这一章中,我们将在 VPS 上配置多个 OpenVPN 客户端连接。
2.1 准备环境
首先,确保你的 VPS 满足以下条件:
- 操作系统:推荐 Ubuntu 20.04 或更新版本
- 内存:至少 1GB RAM(运行多个 OpenVPN 连接)
- 磁盘空间:至少 10GB
- 网络:按需,尽量多,防止超出流量限制
安装 OpenVPN 客户端:
# 更新软件包并安装 OpenVPN
apt update && apt install -y openvpn
# 创建配置文件目录
mkdir -p /etc/openvpn/client/
2.2 获取 OpenVPN 配置文件
在此步骤中,我们需要从 VPN 服务提供商获取多个国家/地区的配置文件。这里以 NordVPN 为例,但原理适用于任何 OpenVPN 服务商。
获取配置文件的方法:
- 从官方网站下载:登录 VPN 提供商官网,下载 OpenVPN 配置文件
- 使用官方工具下载:有些提供商提供命令行工具生成配置
- 手动创建配置文件:如果你了解服务器信息,也可以手动编写配置
将获取的配置文件上传到你的 VPS,并存放在 /etc/openvpn/client/
目录下:
/etc/openvpn/client/
├── tw.conf # 台湾
├── jp.conf # 日本
├── us.conf # 美国
└── auth.txt # 认证文件(存放用户名和密码)
提示:将配置文件命名为.conf
而非.ovpn
,便于 Linux 系统识别。
2.3 配置认证信息
大多数 VPN 服务需要用户名和密码认证。我们创建一个专门的认证文件:
# 创建认证文件
nano /etc/openvpn/client/auth.txt
在文件中填入两行内容:
你的VPN用户名
你的VPN密码
设置适当的权限,保护你的凭据:
chmod 600 /etc/openvpn/client/auth.txt
2.4 修改 OpenVPN 配置文件
我们需要修改每个 OpenVPN 配置文件,确保它们:
- 不会影响 VPS 本身的网络连接
- 能够并存且不相互干扰
打开每个配置文件进行编辑:
nano /etc/openvpn/client/tw.conf
主要修改点:
1.添加认证文件路径(如果配置中没有):
auth-user-pass /etc/openvpn/client/auth.txt
2.禁止拉取路由(防止影响 VPS 自身网络):
route-nopull
3.仅添加 VPN 服务器路由:
route 123.45.67.89 255.255.255.255 net_gateway
(将 123.45.67.89 替换为配置文件中的实际 VPN 服务器 IP)
4.设置独立的日志文件:
log /var/log/openvpn-tw.log
5.避免 DNS 泄露(可选):
script-security 2
up /etc/openvpn/update-resolv-conf
down /etc/openvpn/update-resolv-conf
注意:如果配置文件包含 redirect-gateway
选项,请删除它,避免影响 VPS 的默认路由。
2.5 手动启动 OpenVPN 连接
现在,让我们手动启动这些 OpenVPN 连接,确保它们正常工作:
# 启动台湾 VPN
openvpn --config /etc/openvpn/client/tw.conf --daemon
# 启动日本 VPN
openvpn --config /etc/openvpn/client/jp.conf --daemon
# 启动美国 VPN
openvpn --config /etc/openvpn/client/us.conf --daemon
2.6 验证 OpenVPN 连接状态
启动后,我们需要确认每个 VPN 连接是否正常工作:
# 查看创建的 tun 设备
ip a | grep tun
# 查看 OpenVPN 进程
ps aux | grep openvpn
# 检查每个 tun 接口的 IP 地址
curl --interface tun0 ifconfig.me # 应显示台湾 IP
curl --interface tun1 ifconfig.me # 应显示日本 IP
# ... 依此类推
如果一切正常,你应该能看到多个 tun
设备(tun0, tun1, tun2...),并且每个接口的 IP 地址应该对应相应国家/地区。
常见问题排查:
- 连接失败:检查认证信息是否正确,查看日志文件
/var/log/openvpn-*.log
- 接口冲突:确保每个配置文件的
dev
选项设置不同(如dev tun0
,dev tun1
) - 路由问题:验证是否正确设置了
route-nopull
选项
第三章:让 OpenVPN 在系统启动时自动运行
我们需要为每个 OpenVPN 连接创建一个独立的服务文件:
# 创建台湾 VPN 的服务文件
nano /etc/systemd/system/openvpn-tw.service
在文件中添加以下内容:
[Unit]
Description=OpenVPN Taiwan Client
After=network.target
StartLimitIntervalSec=0
[Service]
Type=simple
ExecStart=/usr/sbin/openvpn --config /etc/openvpn/client/tw.conf
Restart=always
RestartSec=30
[Install]
WantedBy=multi-user.target
重要提示:不同于原始脚本,这里我们移除了--daemon
选项,因为 systemd 已经会在后台运行服务。同时添加了Restart=always
和RestartSec=30
确保服务在失败后自动重启。
按照相同的模式,为其他 VPN 创建服务文件:
# 日本 VPN
nano /etc/systemd/system/openvpn-jp.service
# 美国 VPN
nano /etc/systemd/system/openvpn-us.service
# ... 依此类推
3.2 启用并启动服务
配置好服务文件后,我们需要让 systemd 重新加载配置,并启用这些服务:
# 重新加载 systemd 配置
systemctl daemon-reload
# 启用所有 OpenVPN 服务(开机自启)
systemctl enable openvpn-tw openvpn-jp openvpn-us
# 立即启动所有服务
systemctl start openvpn-tw openvpn-jp openvpn-us
3.3 验证服务状态
确认所有服务都正常运行:
# 查看单个服务状态
systemctl status openvpn-tw
# 查看所有 OpenVPN 服务状态
systemctl status "openvpn-*"
如果服务显示为 "active (running)",则表示设置成功。
3.4 服务管理操作备忘
以下是一些常用的服务管理命令,方便日后维护:
# 重启特定 VPN 连接
systemctl restart openvpn-tw
# 临时停止某个 VPN
systemctl stop openvpn-jp
# 查看服务日志
journalctl -u openvpn-tw -f
# 禁用某个 VPN 的自启动
systemctl disable openvpn-us
第四章:配置 Xray 实现智能分流
有了多个 OpenVPN 连接后,我们需要配置 Xray 来管理和分发流量。
4.1 安装 Xray(如果尚未安装)
如果你还没有安装 Xray,可以使用官方脚本安装:
bash -c "$(curl -L https://github.com/XTLS/Xray-install/raw/main/install-release.sh)" @ install
4.2 配置 Xray
Xray 的配置文件位于 /usr/local/etc/xray/config.json
,我们需要修改它以支持多出口:
nano /usr/local/etc/xray/config.json
使用不同的安装脚本,config.json文件可能在不同的目录下
基本配置结构如下:
{
"log": {
"loglevel": "warning"
},
"inbounds": [
{
"tag": "vless_tw",
"port": 10054,
"protocol": "vless",
"settings": {
"clients": [
{
"id": "你的UUID",
"level": 0
}
],
"decryption": "none"
},
"streamSettings": {
"network": "tcp",
"security": "none"
}
},
{
"tag": "vless_jp",
"port": 10055,
"protocol": "vless",
"settings": {
"clients": [
{
"id": "你的UUID",
"level": 0
}
],
"decryption": "none"
},
"streamSettings": {
"network": "tcp",
"security": "none"
}
},
{
"tag": "vless_us",
"port": 10056,
"protocol": "vless",
"settings": {
"clients": [
{
"id": "你的UUID",
"level": 0
}
],
"decryption": "none"
},
"streamSettings": {
"network": "tcp",
"security": "none"
}
}
],
"outbounds": [
{
"tag": "vpn_tw",
"protocol": "freedom",
"settings": {},
"streamSettings": {
"sockopt": {
"interface": "tun0"
}
}
},
{
"tag": "vpn_jp",
"protocol": "freedom",
"settings": {},
"streamSettings": {
"sockopt": {
"interface": "tun1"
}
}
},
{
"tag": "vpn_us",
"protocol": "freedom",
"settings": {},
"streamSettings": {
"sockopt": {
"interface": "tun2"
}
}
},
{
"tag": "direct",
"protocol": "freedom",
"settings": {}
}
],
"routing": {
"domainStrategy": "AsIs",
"rules": [
{
"type": "field",
"inboundTag": [
"vless_tw"
],
"outboundTag": "vpn_tw"
},
{
"type": "field",
"inboundTag": [
"vless_jp"
],
"outboundTag": "vpn_jp"
},
{
"type": "field",
"inboundTag": [
"vless_us"
],
"outboundTag": "vpn_us"
}
]
}
}
4.3 配置说明
让我们详细解释一下这个配置文件:
1.入站配置(inbounds)
为每个国家/地区创建一个专用的 VLESS 入站端口:
- **台湾**:端口 10054(tag: vless_tw)
- **日本**:端口 10055(tag: vless_jp)
- **美国**:端口 10056(tag: vless_us)
安全提示:实际部署时,建议使用 TLS 加密和 WebSocket 等传输方式提高安全性。这里为了清晰展示核心原理,使用了最简单的配置。
2.出站配置(outbounds)
每个出站配置对应一个 OpenVPN 隧道接口:
- **vpn_tw**:使用 tun0 接口(台湾 IP)
- **vpn_jp**:使用 tun1 接口(日本 IP)
- **vpn_us**:使用 tun2 接口(美国 IP)
- ...依此类推
最后还有一个 `direct` 出站,用于直接从 VPS 本身发送流量。
3.路由规则(routing)
路由规则决定哪些流量走哪个出口:
- 来自 vless_tw 入站的流量 → 走 vpn_tw 出站(台湾 IP)
- 来自 vless_jp 入站的流量 → 走 vpn_jp 出站(日本 IP)
- 来自 vless_us 入站的流量 → 走 vpn_us 出站(美国 IP)
- ...依此类推
4.高级路由配置(可选)
除了基本的入站与出站映射外,你还可以根据域名或 IP 地址来智能分流。例如:
"routing": {
"domainStrategy": "IPOnDemand",
"rules": [
{
"type": "field",
"inboundTag": ["vless_tw"],
"outboundTag": "vpn_tw"
},
{
"type": "field",
"domain": ["netflix.com", "netflix.net", "nflximg.net", "nflxvideo.net"],
"outboundTag": "vpn_jp"
},
{
"type": "field",
"domain": ["hulu.com", "hulustream.com"],
"outboundTag": "vpn_us"
}
]
}
这种配置允许:
- 无论客户端连接哪个入站,访问 Netflix 的流量都走日本 IP
- 访问 Hulu 的流量总是走美国 IP
4.5 应用 Xray 配置
配置完成后,重启 Xray 服务:
systemctl restart xray
检查 Xray 服务状态:
systemctl status xray
第五章:测试与验证
现在,我们的多出口代理系统已经搭建完成。接下来验证它是否正常工作。
5.1 检查 OpenVPN 连接状态
确认所有 OpenVPN 隧道都处于活动状态:
ip a | grep tun
应该能看到 tun0, tun1, tun2 等多个接口。
5.2 验证每个出口的 IP
使用 curl 通过不同接口查询 IP:
# 台湾 IP
curl --interface tun0 ifconfig.me
# 日本 IP
curl --interface tun1 ifconfig.me
# 美国 IP
curl --interface tun2 ifconfig.me
# ... 依此类推
5.3 测试 Xray 代理
在客户端配置 Xray,连接到不同的端口:
1.客户端配置示例(以连接台湾出口为例):
{
"outbounds": [
{
"protocol": "vless",
"settings": {
"vnext": [
{
"address": "你的VPS_IP",
"port": 10054,
"users": [
{
"id": "你的UUID",
"encryption": "none"
}
]
}
]
},
"streamSettings": {
"network": "tcp"
}
}
]
}
2.使用浏览器访问 ifconfig.me 查看当前 IP
3.切换至其他出口(如日本):
- 修改客户端配置中的端口为 10055
- 重新启动客户端
- 再次访问 ifconfig.me,应该看到日本 IP
5.4 故障排查
如果遇到问题,可以检查以下几点:
1.OpenVPN 连接是否正常?
systemctl status openvpn-tw
2.Xray 服务是否正常运行?
systemctl status xray
3.查看 Xray 日志
journalctl -u xray -f
4.检查防火墙是否开放了相应端口
ufw status
# 或
iptables -L
5.检查 tun 设备是否正常
ip link show
第六章:总结与展望
6.1 系统架构回顾
我们成功搭建了一个基于 Xray + OpenVPN 的多出口智能代理系统,其核心架构为:
客户端 → Xray VLESS 入站端口 → 路由规则匹配 → OpenVPN tun接口 → 目标网站
通过这种架构,我们实现了:
- 多个国家/地区的 IP 出口
- 灵活的流量分流规则
- 稳定的自动恢复机制
- 高效的资源利用
6.2 未来扩展方向
这个系统还有很多可以扩展的方向:
- 添加 WireGuard 支持:WireGuard 比 OpenVPN 性能更好,可以作为补充
- 集成 Docker:将各组件容器化,便于部署和管理
- Web 管理界面:开发一个简单的 Web UI 管理各个连接
- 定制化路由规则:根据个人使用习惯,开发更精细的分流规则
- 多服务器负载均衡:在多个 VPS 上部署此方案,并实现负载均衡