12 min read

利用 Xray + OpenVPN 搭建多出口智能代理

在 VPS 上配置多个 OpenVPN 并通过 Xray 分流,打造高效稳定的多国代理系统
利用 Xray + OpenVPN 搭建多出口智能代理
Photo by Kevin Wang / Unsplash

第一章:引言

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 系统架构概览

本方案的核心架构如下:

  1. VPS 层:一台位于优质线路的 VPS
  2. VPN 层:在 VPS 上运行多个 OpenVPN 客户端,连接到不同国家/地区的服务器
  3. 代理层:使用 Xray 配置多个入站端口,对应不同的 OpenVPN 出口
  4. 分流层:通过 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 服务商。

获取配置文件的方法:

  1. 从官方网站下载:登录 VPN 提供商官网,下载 OpenVPN 配置文件
  2. 使用官方工具下载:有些提供商提供命令行工具生成配置
  3. 手动创建配置文件:如果你了解服务器信息,也可以手动编写配置

将获取的配置文件上传到你的 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 配置文件,确保它们:

  1. 不会影响 VPS 本身的网络连接
  2. 能够并存且不相互干扰

打开每个配置文件进行编辑:

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=alwaysRestartSec=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 未来扩展方向

这个系统还有很多可以扩展的方向:

  1. 添加 WireGuard 支持:WireGuard 比 OpenVPN 性能更好,可以作为补充
  2. 集成 Docker:将各组件容器化,便于部署和管理
  3. Web 管理界面:开发一个简单的 Web UI 管理各个连接
  4. 定制化路由规则:根据个人使用习惯,开发更精细的分流规则
  5. 多服务器负载均衡:在多个 VPS 上部署此方案,并实现负载均衡