前言
这篇记录一次比较典型的“回国出口”配置:公网服务器在海外,朋友仍然连接这台海外服务器的 VLESS/XTLS 入口,但访问国内网站时,流量会通过一条反向隧道转回国内机器,再从国内宽带出口访问目标网站。
整体目标是:
- 朋友继续使用公网服务器原来的 443 VLESS 入口;
- 国内机器不需要公网 IP,也不需要在路由器上做端口转发;
- 只把国内域名和国内 IP 转回国内出口,其他流量仍走海外服务器原来的出口;
- 使用 Xray 新版 VLESS reverse proxy 写法,不再使用旧的
reverse.portals/reverse.bridges。
为了避免泄露真实环境,本文中的域名、UUID、证书路径、用户标识都已经脱敏。直接复制前需要把占位符替换成自己的值。
架构
1 | 朋友客户端 |
反向连接由国内出口机器主动发起到海外服务器。海外服务器只需要保留原来的公网 443 入站,国内机器不暴露任何公网端口。
新旧写法区别
旧写法通常会在配置顶层写:
1 | { |
新版 VLESS reverse proxy 不再依赖顶层 reverse.portals / reverse.bridges。它把 reverse 写进 VLESS client 或 VLESS outbound:
公网服务器侧:
1 | { |
国内出口机器侧:
1 | { |
公网服务器上的 cn-reverse-out 会表现为一个可路由的 outbound;国内出口机器上的 cn-reverse-in 会表现为一个可匹配的 inbound。
公网服务器配置
下面只展示关键片段。假设公网服务器原来已经有一个 VLESS + TLS/REALITY + Vision 入站,tag 为 vless-in。
入站新增两个用户
一个用户给国内机器建立反向隧道,一个用户给朋友使用。不要让朋友和自己共用同一个 UUID,否则服务端无法按用户分流。
1 | { |
如果你的入口是 REALITY,就保留原来的 realitySettings;如果是普通 TLS 证书,就保留原来的 tlsSettings。这里的核心不是 TLS 还是 REALITY,而是新增的 reverse.tag 和朋友独立用户。
路由规则
只把朋友访问国内域名和国内 IP 的流量转进反向隧道:
1 | { |
如果原配置里有 geoip:cn 或 geosite:cn 走 block 的规则,上面两条规则要放在 block 规则之前,否则国内流量会先被拦截。
outbounds 里仍然要保留一个默认出口,比如:
1 | { |
这样没有命中回国规则的流量不会误入反向隧道。
国内出口机器配置
国内机器负责主动连接海外服务器,并把反向进来的流量从本地网络发出去。
1 | { |
这里的 finalRules 只允许访问非私网地址,避免朋友通过这条反向隧道访问国内出口机器所在局域网的私有网段。如果你就是要访问内网 NAS、路由器后台等资源,再按需放开具体 IP 和端口,不建议直接放开整个私网。
如果海外入口是 REALITY,国内机器的 streamSettings 改成类似下面这样:
1 | { |
systemd 用户服务
如果国内机器没有 root 权限,也可以用用户级 systemd 跑 Xray。示例:
1 | [Unit] |
启动:
1 | systemctl --user daemon-reload |
如果要让用户退出登录后仍然保持运行,需要确认系统是否开启了 linger:
1 | loginctl enable-linger "$USER" |
这一步通常需要管理员权限。
朋友客户端配置
普通 TLS 入口的链接大概是:
1 | vless://<FRIEND-UUID>@proxy.example.com:443?encryption=none&security=tls&sni=proxy.example.com&fp=chrome&type=tcp&flow=xtls-rprx-vision#CN-Return |
REALITY 入口的链接大概是:
1 | vless://<FRIEND-UUID>@proxy.example.com:443?encryption=none&security=reality&sni=www.example.com&fp=chrome&pbk=<REALITY-PUBLIC-KEY>&sid=<REALITY-SHORT-ID>&type=tcp&flow=xtls-rprx-vision#CN-Return |
关键是朋友使用独立的 <FRIEND-UUID>。服务端通过这个 UUID 对应的 email 识别出朋友,然后只把国内目标转进 cn-reverse-out。
验证
先分别测试配置语法:
1 | xray run -test -config /usr/local/etc/xray/config.json |
然后重启服务:
1 | systemctl restart xray |
可以临时在本地起一个朋友客户端 SOCKS 入站测试:
1 | curl -x socks5h://127.0.0.1:18088 -I https://www.baidu.com/ |
期望结果:
www.baidu.com正常返回;- 国内出口机器日志里能看到类似
cn-reverse-in -> cn-home-direct; - 非国内目标仍显示海外服务器 IP,说明没有把所有流量都转回国内机器。
注意事项
- 朋友必须使用独立 UUID,不要复用自己的 UUID。
- 服务器上如果已有
geoip:cn/geosite:cn拦截规则,回国规则要放在拦截规则之前。 - 不建议在公网服务器上额外开放无认证 SOCKS/HTTP 代理端口,朋友直接复用 VLESS 入口即可。
- 国内出口机器关机、断网或 Xray 服务停止后,朋友的国内分流会不可用。
- 国内出口侧建议默认禁止访问私网地址,只按需放开具体内网资源。
这套方案的核心是“公网服务器负责入口和分流,国内机器负责主动建立反向隧道和最终出口”。新版 VLESS reverse proxy 把反向代理关系收敛到 VLESS client/outbound 本身,配置比旧的 reverse.portals / reverse.bridges 更直观,也更适合和现有 XTLS/Vision 入口合并使用。
说些什么吧!