一、 场景说明
入口转发:远程端口映射,把公网入口端口映射到内网 Web 服务。
我们有一台内网服务器(192.168.2.1)上运行着反向代理服务(如 Nginx、Caddy、Lucky),监听 18789 端口,并根据域名分发到不同的内网服务。
这台服务器没有公网 IPv4,但有 IPv6(有没有都无所谓),且不想暴露任何端口。
现在,我们希望在公网 VPS 上开放一个 HTTP 端口(例如 52000),外部用户访问 http://公网IP:52000 时,流量能经过 Xray 的反向隧道,精准送到内网反向代理的 192.168.2.1:18789,再按域名路由到具体的后端服务。
这就是 VLESS 反向代理的「入口转发」用法:公网入口端口 → 反向隧道 → 内网 Web 服务。
二、 公网服务器端配置
公网 VPS 需要同时做两件事:
- 监听 8443 端口:接收内网设备主动建立的 VLESS + REALITY 反向连接(带
reverse标记)。 - 监听 52000 端口:作为外部用户的 HTTP 入口(
tunnel协议),并把该入口收到的所有 TCP 流量通过反向通道转发给内网设备。
2.1 外网端 Xray 配置
{
"log": {
"loglevel": "warning"
},
"inbounds": [
{
"listen": "::",
"port": 8443,
"protocol": "vless",
"settings": {
"clients": [
{
"id": "uuid",
"flow": "xtls-rprx-vision",
"reverse": {
"tag": "reverse-out"
}
}
],
"decryption": "none"
},
"streamSettings": {
"network": "raw",
"security": "reality",
"realitySettings": {
"target": "优选目标站点:443",
"serverNames": ["优选目标站点"],
"privateKey": "你的REALITY私钥",
"shortIds": ["shortid"]
}
}
},
{
"listen": "::",
"port": 443,
"protocol": "vless",
"settings": {
"clients": [
{
"id": "uuid",
"flow": "xtls-rprx-vision"
}
],
"decryption": "none"
},
"streamSettings": {
"network": "raw",
"security": "reality",
"realitySettings": {
"target": "优选目标站点域名:443",
"serverNames": ["优选目标站点域名"],
"privateKey": "你的REALITY私钥",
"shortIds": ["shortid"]
}
}
},
{
"listen": "::",
"port": 52000,
"protocol": "tunnel",
"tag": "portal",
"settings": {
"allowedNetwork": "tcp",
"followRedirect": false
}
}
],
"routing": {
"rules": [
{
"inboundTag": ["portal"],
"outboundTag": "reverse-out"
}
]
},
"outbounds": [
{
"protocol": "freedom"
}
]
}
tips:
8443入站中reverse.tag = "reverse-out"使得该客户端在服务端表现为一个「出站池」,路由可以直接将流量丢给它。52000入站使用tunnel协议(旧称 dokodemo-door),它只负责接收 TCP 并原样转发,不做任何协议解析。443入站,普通的正向代理,端口需设置为不一样。
三、 内网端配置
内网设备必须主动连接公网服务器的 8443 端口,建立反向隧道。为了方便,我们使用 Docker 来运行 Xray。
3.1 Docker Compose 部署(macvlan 网络)
在/volume1/docker/xray_reverse下放置config.json内网配置文件即可~
version: '3.8'
services:
xray:
image: teddysun/xray:latest
container_name: xray_reverse
restart: always
environment:
- TZ=Asia/Shanghai
# 内网端只作为客户端,无需任何端口映射
# ports: []
volumes:
- /volume1/docker/xray_reverse:/etc/xray # 挂载配置目录
networks:
macvlan_net:
ipv4_address: 192.168.2.3 # 固定内网 IPv4
networks:
macvlan_net:
external: true
碎碎念:macvlan 网络需要提前创建。不在本篇的讨论范畴内,非群晖用户只需要普通设置为 host 即可,群晖因为安全原因,docker 即使设置为 host 也没有 ipv6 网络,故用这种方式来曲线救国,转发到路由器的原因也是因为 macvlan 的 docker 无法访问群晖 host 和 bridge 的 docker……
3.2 内网端 Xray 配置
{
"routing": {
"rules": [
{
"inboundTag": ["reverse-in"],
"outboundTag": "reverse-direct"
}
]
},
"outbounds": [
{
"protocol": "freedom"
},
{
"protocol": "freedom",
"tag": "reverse-direct",
"settings": {
"redirect": "192.168.2.1:18789",
"finalRules": [
{
"action": "allow",
"network": "tcp",
"ip": ["192.168.2.1"],
"port": "18789"
}
]
}
},
{
"protocol": "vless",
"settings": {
"address": "你的公网VPS域名或IP",
"port": 8443,
"id": "uuid",
"encryption": "none",
"flow": "xtls-rprx-vision",
"reverse": {
"tag": "reverse-in",
"sniffing": {
"enabled": true,
"destOverride": ["http", "tls", "quic"]
}
}
},
"streamSettings": {
"network": "raw",
"security": "reality",
"realitySettings": {
"serverName": "优选目标站点域名",
"password": "你的REALITY公钥/密码",
"shortId": "shortid",
"fingerprint": "chrome"
}
}
}
]
}
tips:
reverse.tag = "reverse-in"会在内网端产生一个虚拟的入站,所有从公网服务器送来的请求都会从这个入站进入路由。redirect = "192.168.2.1:18789"将目标地址改写成内网反向代理的服务地址。finalRules显式放行192.168.2.1:18789,否则会被 Freedom 出站的默认安全策略阻止(默认禁止访问私有 IP)。- 内网 Xray 不需要任何
inbounds和端口映射,纯客户端模式运行。
四、 验证与测试
-
防火墙注意事项
- 公网 VPS 必须放行 8443 和 18789 端口:
ufw allow 8443/tcp ufw allow 18789/tcp - 云服务商安全组也需放行这两个端口。
- 公网 VPS 必须放行 8443 和 18789 端口:
-
测试公网入口 在内网反向代理(
192.168.2.1:18789)上配置一个测试站点,然后在公网访问:http://你的公网IP:18789,若能正确返回内网站点的内容,说明整套转发链路已打通。
后续增加 SSL 证书并反向代理什么的都可以在内网操作了,方便喵~
五、 让 AI 更可靠地协助你配置 Xray
当你需要让 ChatGPT 或其他 AI 帮助你生成或解释 Xray 配置时,请在对话一开始发送下面这段提示词。它会强制 AI 只基于官方文档回答,避免产生幻觉:
点击查看可复制的提示词
无论你是想让 AI 直接生成配置,还是想咨询具体配置问题,都建议你在对话一开始就先把下面这段话发给 AI:
# 角色
你是一个专门帮助用户编写和理解 Xray-core 配置的助手。
你的任务是基于官方文档,帮助我解释配置项,或生成可使用的 Xray-core 配置文件。
# 唯一依据
请使用以下 Xray-core 官方全量文档作为唯一依据:
https://xtls.github.io/llms-full.txt
在回答任何配置相关问题前,请先打开并阅读该文档中的相关部分。
不要使用你的记忆、经验、社区模板、V2Ray 配置习惯、GitHub issue、博客文章或网上常见写法来判断字段是否存在或是否有效。
# 最重要的规则
不要编造配置字段。
只能使用官方文档中明确提到的字段、取值、默认值、限制条件和配置结构。
如果官方文档没有提到某个字段、取值、默认值、限制条件或组合方式,请直接回答:
“文档未提及,不能确认。”
不要猜测,不要补全,不要为了让配置看起来完整而添加没有文档依据的字段。
# 如果无法访问文档
如果你无法打开或读取官方文档链接,请直接说明:
“我无法访问官方文档链接,因此不能保证不产生幻觉。请手动下载 https://xtls.github.io/llms-full.txt 并上传给我,我会只基于上传文档回答。”
在无法访问官方文档时,不要根据记忆生成 Xray-core 配置,也不要根据记忆解释配置细节。
# 回答流程
回答任何配置相关问题时,请遵循以下流程:
1. 先阅读官方文档中的相关部分。
2. 找出相关的配置对象、字段、取值和限制条件。
3. 只基于文档明确确认的内容回答。
4. 如果某部分文档没有确认,请标记为“文档未提及,不能确认”。
生成配置时,请遵循以下流程:
1. 先确认你准备使用哪些字段。
2. 只用官方文档确认过的字段生成配置。
3. 输出前检查最终配置,删除任何无法由文档确认的字段。
4. 如果我的需求中有文档无法确认的部分,请放到“未确认内容”。
# 输出格式
默认输出 JSONC,也就是允许带 `//` 中文注释的 JSON 风格配置。
注释应该帮助普通用户理解:
- 这个字段做什么;
- 用户是否需要修改;
- 修改时要注意什么。
注释不能引入官方文档没有确认的功能。
如果我明确要求“纯 JSON”,请输出不带注释的合法 JSON。
不要使用 `_comment` 字段写注释,除非官方文档明确说支持这个字段。
# 生成配置时的回答格式
请使用以下格式:
## 文档依据
简要列出本次使用到的官方文档中的配置对象和关键字段。
## 配置文件
```jsonc
{
// 在这里写配置
}
```
## 关键说明
解释我最需要修改或注意的字段。
## 未确认内容
列出我的需求中官方文档没有确认的部分。
如果没有未确认内容,请写:
“无。”
# 解释配置项时的回答格式
请使用以下格式:
## 结论
直接解释这个字段或配置对象的作用。
## 文档依据
说明它属于哪个官方文档中的配置对象,以及文档明确确认了什么。
## 注意事项
只写官方文档明确提到的限制、默认值、可选值或组合规则。
## 文档未提及
列出我的问题中官方文档没有确认的部分。
六、 结语
Xray 的 VLESS 反向代理是一个非常实用的内网穿透方案。它不需要在路由器上设置端口转发,也不要求内网设备有公网 IP。只要两边都安装并配置好 Xray,就能把公网入口的流量安全带回家。不失为 frp 的另一种优雅的替代方案。
本文的配置已经过实际环境验证,你可以根据自己的内网反向代理地址、域名、REALITY 密钥等稍作修改,即可快速搭建属于你自己的远程端口映射服务。
希望这篇记录能帮到正在折腾反向代理的你。如有疑问,欢迎在评论区交流~
喜欢的话,留下你的评论吧~