一、 安装配置 Nginx,构建静态网页
传统的 REALITY 架构通常选择“偷”别人的知名网站(如微软或苹果),然而最完美的隐蔽方案其实是“偷自己”——使用你自己拥有的合法域名搭建一个真实的 Web 网站。当非代理流量(如敏感探测或正常访客)访问 443 端口时,Xray 会无缝回落给本地 Nginx 服务。
1.1 安装 Nginx 基础环境
首先,在公网 VPS 上更新包管理器并安装 Nginx。
sudo apt update && sudo apt install nginx
1.2 模拟并构建高仿真静态网页
为了让回落后的网站看起来足够真实,我们可以使用 Python 的 Playwright 自动化工具,直接将你喜欢的目标网站(例如一个公开的云盘界面或技术博客)的完整渲染结果“扒”下来,作为你网站的首页伪装。
首先安装环境依赖:
pip install playwright
playwright install
接着,编写并运行以下扒站脚本:
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.chromium.launch()
page = browser.new_page()
# 填入你想要模仿/复制的目标伪装网站
page.goto("https://中意的网站域名")
# 获取页面渲染后的完整 HTML 内容
html_content = page.content()
# 将内容写入到本地静态网页中
with open("index.html", "w", encoding="utf-8") as f:
f.write(html_content)
print("网页源代码已成功保存为 index.html")
browser.close()
将生成的 index.html 移动并替换到 Nginx 默认的静态目录 /var/www/html/index.html,也可使用 sudo nano /var/www/html/index.html 来修改。
1.3 配置进阶版的防探测 Nginx
使用 nano /etc/nginx/nginx.conf 编辑 Nginx 主配置文件。这份配置中,我们做了以下高级安全优化:
- 强制 80 跳转:所有 HTTP 流量重定向至 HTTPS。
- 防主动探测:独立出一个空的
default_server,当探测者直接用 IP 或恶意域名嗅探时,利用ssl_reject_handshake on强制拒绝 SSL 握手。 - 真实 IP 还原:配置
proxy_protocol接收前置 Xray 透传的真实访客 IP。
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log notice;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
# 托管静态网页必须引入 mime.types,否则网页可能无法正常渲染
include /etc/nginx/mime.types;
default_type application/octet-stream;
# 优化了日志格式,加入了由 PROXY protocol 传递过来的真实访客 IP ($proxy_protocol_addr)
log_format main '$proxy_protocol_addr - - [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent"';
access_log /var/log/nginx/access.log main;
# 80 端口强制跳转 HTTPS
server {
listen 80;
listen [::]:80;
return 301 https://$host$request_uri;
}
# 默认服务,用于防探测:拒绝非目标域名的别有用心的 SSL 握手
server {
listen 127.0.0.1:8001 ssl proxy_protocol default_server;
ssl_reject_handshake on;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_session_timeout 1h;
ssl_session_cache shared:SSL:10m;
}
# 你的主网站配置
server {
listen 127.0.0.1:8001 ssl proxy_protocol;
# 注意:http2 on 指令仅支持 Nginx 1.25.1+。若是老版本,请删除此行并在上方 listen 后面加上 http2
http2 on;
# 接收并还原来自前置代理 (Xray) 的真实访客 IP
set_real_ip_from 127.0.0.1;
real_ip_header proxy_protocol;
# 你的合法域名
server_name 你的公网建站域名;
# 你通过 acme.sh 申请并安装到指定目录的证书路径
ssl_certificate /etc/ssl/xray/cert.pem;
ssl_certificate_key /etc/ssl/xray/privkey.key;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers TLS13_AES_128_GCM_SHA256:TLS13_AES_256_GCM_SHA384:TLS13_CHACHA20_POLY1305_SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305;
ssl_prefer_server_ciphers on;
ssl_stapling on;
ssl_stapling_verify on;
resolver 1.1.1.1 valid=60s;
resolver_timeout 2s;
# 网站根目录配置:指向你的 HTML 文件所在位置
root /var/www/html;
index index.html;
# 静态文件路由
location / {
try_files $uri $uri/ =404;
}
}
}
1.4 应用并测试 Nginx 服务
在重启服务前,确保系统中存在低权限的独立 nginx 用户,保障运行安全:
# 测试配置文件是否有语法错误
nginx -t
# 创建不可登录的无家目录 nginx 专用系统用户
useradd -s /sbin/nologin -M nginx
# 重启 Nginx 服务并使其开机自启
systemctl restart nginx
二、 acme 获取证书
由于你是真正通过域名对外建立 Web 访问,本地 Nginx 在处理非代理请求时作为真实的 TLS 服务端,因此必须为其配置受信任的 HTTPS 证书。
2.1 安装 acme.sh 脚本
wget -O - https://get.acme.sh | sh
. .bashrc
# 将默认证书签发机构设为更为稳定的 Let's Encrypt
acme.sh --set-default-ca --server letsencrypt
2.2 使用 Cloudflare DNS API 签发 ECC 证书
在此我们使用 DNS API 验证方式。请事先在 Cloudflare 后台获取你具有该域名区域 DNS 编辑权限的 API 令牌,将服务器的 ipv4/ipv6 的公网 IP 添加到你想要映射的域名的 A/AAAA 记录上(记得关闭小云朵),然后将 API_Token 导出到环境变量:
# 执行证书签发
CF_Token="你的Cloudflare_API_Token" acme.sh --issue -d 你的公网建站域名 --dns dns_cf --keylength ec-256 --force
2.3 规范安装证书到指定目录
指定存储证书的专用目录,并通知 acme.sh 自动将其安装并保持后续自动续期:
acme.sh --installcert -d 你的公网建站域名 --ecc --fullchain-file /etc/ssl/xray/cert.pem --key-file /etc/ssl/xray/privkey.key
三、 Xray 443 单端口复用配置
本架构的核心突破在于:利用一个外部 443 端口,通过两个逻辑隔离的 UUID,同时处理科学上网的正向代理、以及内网穿透的反向代理流量。
3.1 外网公网服务端配置
在此服务端配置中:
clients[0]用于你的手机、电脑等设备的正向科学上网通道。clients[1]绑定了reverse属性,专门用于等待内网设备回家建立反向穿透隧道。realitySettings.target指向本地的127.0.0.1:8001并开启了xver: 1,将所有非代理的正常建站访问完美回落给 Nginx。
使用 nano /usr/local/etc/xray/config.json 编辑配置文件。
{
"log": {
"loglevel": "warning"
},
"inbounds": [
{
"listen": "::",
"port": 443,
"protocol": "vless",
"settings": {
"clients": [
{
"id": "你的第一个用于日常科学上网的用户UUID",
"flow": "xtls-rprx-vision"
},
{
"id": "你的第二个专属用于反向代理内网穿透的用户UUID",
"flow": "xtls-rprx-vision",
"reverse": {
"tag": "reverse-out"
}
}
],
"decryption": "none"
},
"streamSettings": {
"network": "raw",
"security": "reality",
"realitySettings": {
"target": "127.0.0.1:8001",
"xver": 1,
"serverNames": ["你的公网建站域名"],
"privateKey": "你的服务端REALITY私钥_可通过xray_x25519生成",
"shortIds": ["你的REALITY_shortId_16位十六进制"]
}
}
},
{
"listen": "::",
"port": 18789,
"protocol": "tunnel",
"tag": "portal",
"settings": {
"allowedNetwork": "tcp",
"followRedirect": false
}
}
],
"routing": {
"rules": [
{
"inboundTag": ["portal"],
"outboundTag": "reverse-out"
}
]
},
"outbounds": [
{
"protocol": "freedom"
}
]
}
3.2 内网客户端(穿透端)配置
部署在你家中的软路由、NAS 或内网服务器上的 Xray 客户端配置。它会主动通过 443 端口去连接公网 VPS,并利用专属的内网反代 UUID 握手成功后建立反向代理隧道。
{
"routing": {
"rules": [
{
"inboundTag": ["reverse-in"],
"outboundTag": "reverse-direct"
}
]
},
"outbounds": [
{
"protocol": "freedom"
},
{
"protocol": "freedom",
"tag": "reverse-direct",
"settings": {
"redirect": "你的内网目标设备IP_如192.168.2.1:18789",
"finalRules": [
{
"action": "allow",
"network": "tcp",
"ip": ["你的内网目标设备IP_如192.168.2.1"],
"port": "18789"
}
]
}
},
{
"protocol": "vless",
"settings": {
"address": "你的公网VPS服务器IP或对应解析的域名",
"port": 443,
"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": "你的REALITY_shortId_16位十六进制",
"fingerprint": "chrome"
}
}
}
]
}
3.3 重启与部署验证
配置完成后,分别在公网服务端以及内网客户端上重启 Xray 进程,使其生效:
systemctl restart xray
验证方法:当反向穿透隧道成功打通后,你在外网环境访问你公网 VPS 的 18789 端口时,Xray 服务端会把流量引入 reverse-out 隧道,内网客户端收到后通过 reverse-direct 无感反代重定向至你家中的内网目标服务。同时,如果用普通浏览器通过 HTTPS 访问你的 443 端口,呈现出来的则是完美的仿真伪装网站!
喜欢的话,留下你的评论吧~