利用 Xray + OpenVPN 搭建多出口智能代理
目录
在日常网络使用中,我们经常需要不同地区的出口 IP 来访问特定内容或提高连接稳定性。然而,传统解决方案往往成本高昂、管理复杂且缺乏灵活性。本文将介绍如何使用单个 VPS 搭配 Xray 和 OpenVPN 实现高效稳定的多出口智能代理。
一、常见方案对比
目前市面上的几种常见方案各有不足:
- 多台 VPS:传统分流方案通常需要在不同国家/地区部署多台 VPS,成本高昂且管理复杂。
- WARP 服务:虽然 Cloudflare WARP 可以提供全球网络加速,但其出口 IP 往往受限于 VPS 所在地区,难以实现真正的多地区 IP。
- 单纯 VPN:直接使用 VPN 服务虽然可以切换不同地区 IP,但不支持智能分流,需要频繁手动切换。
相比之下,本文方案具有明显优势:
- 高性价比:一台 VPS 搭配一个 VPN 账户即可。
- 集中管理:便于维护和扩展。
- 智能灵活:可按需分流流量。
二、架构设计
我们的方案包括三个主要部分:
- IPLC 专线(可选):提供稳定、高速的基础连接。
- VPS 中继节点:运行多个 OpenVPN 客户端连接不同国家的服务器。
- Xray 代理层:实现智能分流,提供多出口服务。
三、OpenVPN 搭建步骤
OpenVPN 是我们系统的基础,它将为我们提供多个国家的出口 IP。在这一章中,我们将在 VPS 上配置多个 OpenVPN 客户端连接。
1. 环境准备
建议使用 Ubuntu 20.04 以上版本,至少1GB内存。
安装 OpenVPN 客户端:
# 更新软件包并安装 OpenVPN
apt update && apt install -y openvpn
# 创建配置文件目录
mkdir -p /etc/openvpn/client/
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 系统识别。
3. 配置认证信息
大多数 VPN 服务需要用户名和密码认证。我们创建一个专门的认证文件:
# 创建认证文件
nano /etc/openvpn/client/auth.txt
内容格式:
你的VPN用户名
你的VPN密码
设置适当的权限,保护你的凭据:
chmod 600 /etc/openvpn/client/auth.txt
4. 修改OpenVPN配置文件
我们需要修改每个 OpenVPN 配置文件,确保它们:
- 不会影响 VPS 本身的网络连接
- 能够并存且不相互干扰
打开每个配置文件进行编辑:
nano /etc/openvpn/client/tw.conf主要修改点:
1.添加认证文件路径(如果配置中没有):
auth-user-pass /etc/openvpn/client/auth.txt2.禁止拉取路由(防止影响 VPS 自身网络):
route-nopull3.仅添加 VPN 服务器路由:
route 123.45.67.89 255.255.255.255 net_gateway(将 123.45.67.89 替换为配置文件中的实际 VPN 服务器 IP)
4.设置独立的日志文件:
log /var/log/openvpn-tw.log5.避免 DNS 泄露(可选):
script-security 2
up /etc/openvpn/update-resolv-conf
down /etc/openvpn/update-resolv-conf注意:如果配置文件包含 redirect-gateway 选项,请删除它,避免影响 VPS 的默认路由。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 --daemon6. 验证 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 在系统启动时自动运行
1. 配置文件
我们需要为每个 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
# ... 依此类推2. 启用并启动服务
配置好服务文件后,我们需要让 systemd 重新加载配置,并启用这些服务:
# 重新加载 systemd 配置
systemctl daemon-reload
# 启用所有 OpenVPN 服务(开机自启)
systemctl enable openvpn-tw openvpn-jp openvpn-us
# 立即启动所有服务
systemctl start openvpn-tw openvpn-jp openvpn-us3. 验证服务状态
确认所有服务都正常运行:
# 查看单个服务状态
systemctl status openvpn-tw
# 查看所有 OpenVPN 服务状态
systemctl status "openvpn-*"如果服务显示为 "active (running)",则表示设置成功。
4. 服务管理操作备忘
以下是一些常用的服务管理命令,方便日后维护:
# 重启特定 VPN 连接
systemctl restart openvpn-tw
# 临时停止某个 VPN
systemctl stop openvpn-jp
# 查看服务日志
journalctl -u openvpn-tw -f
# 禁用某个 VPN 的自启动
systemctl disable openvpn-us五、配置 Xray 实现智能分流
有了多个 OpenVPN 连接后,我们需要配置 Xray 来管理和分发流量。
1. 安装 Xray(如果尚未安装)
如果你还没有安装 Xray,可以使用官方脚本安装:
bash -c "$(curl -L https://github.com/XTLS/Xray-install/raw/main/install-release.sh)" @ install2. 配置 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"
}
]
}
}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. 应用 Xray 配置
配置完成后,重启 Xray 服务:
systemctl restart xray检查 Xray 服务状态:
systemctl status xray{
"inbounds": [{
"port": 10054,
"protocol": "vless",
"settings": {"clients": [{"id": "UUID"}]}
}],
"outbounds": [{
"protocol": "freedom",
"streamSettings": {"sockopt": {"interface": "tun0"}}
}],
"routing": {
"rules": [{"inboundTag": ["vless"], "outboundTag": "tun0"}]
}
}
六、测试与验证
现在,我们的多出口代理系统已经搭建完成。接下来验证它是否正常工作。
1. 检查 OpenVPN 连接状态
确认所有 OpenVPN 隧道都处于活动状态:
ip a | grep tun应该能看到 tun0, tun1, tun2 等多个接口。
2. 验证每个出口的 IP
使用 curl 通过不同接口查询 IP:
# 台湾 IP
curl --interface tun0 ifconfig.me
# 日本 IP
curl --interface tun1 ifconfig.me
# 美国 IP
curl --interface tun2 ifconfig.me
# ... 依此类推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
4. 故障排查
如果遇到问题,可以检查以下几点:
1.OpenVPN 连接是否正常?
systemctl status openvpn-tw2.Xray 服务是否正常运行?
systemctl status xray3.查看 Xray 日志
journalctl -u xray -f4.检查防火墙是否开放了相应端口
ufw status
# 或
iptables -L5.检查 tun 设备是否正常
ip link show七、总结与展望
1. 系统架构回顾
我们成功搭建了一个基于 Xray + OpenVPN 的多出口智能代理系统,其核心架构为:
客户端 → Xray VLESS 入站端口 → 路由规则匹配 → OpenVPN tun接口 → 目标网站通过这种架构,我们实现了:
- 多个国家/地区的 IP 出口
- 灵活的流量分流规则
- 稳定的自动恢复机制
- 高效的资源利用
2. 未来扩展方向
这个系统还有很多可以扩展的方向:
- 添加 WireGuard 支持:WireGuard 比 OpenVPN 性能更好,可以作为补充
- 集成 Docker:将各组件容器化,便于部署和管理
- Web 管理界面:开发一个简单的 Web UI 管理各个连接
- 定制化路由规则:根据个人使用习惯,开发更精细的分流规则
- 多服务器负载均衡:在多个 VPS 上部署此方案,并实现负载均衡