前言
很多站长手里都有一台性能强劲的国内物理服务器(NAS),同时也持有像 example.org 这样优质的国际域名。但痛点在于:域名未备案,国内服务器无法直接通过 80/443 端口对外服务,且家用宽带通常封锁了标准 Web 端口。
为了解决这个问题,通常需要一台海外 VPS 做中转。经过反复测试与权衡,我摸索出了一套“国内源站 + 海外优质线路反代 + FRP 加密隧道”的架构方案。
这套方案不仅解决了备案阻断问题,还实现了:
- 全链路加密:防止流量在跨境传输中被嗅探。
- 真实 IP 透传:国内业务日志能准确记录访客真实 IP。
- 端口隐身:通过本地回环绑定,海外机器不开放任何业务端口,安全性极高。
架构拓扑
- 源站 (Domestic):国内服务器,运行宝塔面板,部署 WordPress 业务站点,运行 FRP 客户端 (FRPC)。
- 中转 (Overseas):日本 BGP 线路 VPS,部署 Nginx Proxy Manager (NPM) 处理 HTTPS,运行 FRP 服务端 (FRPS)。
- 链路流向:
用户->HTTPS (443)->海外 NPM->HTTP (Local:6080)->FRP 隧道 (TLS 加密)->国内 FRPC->宝塔 Nginx (80)
一、海外服务端部署 (FRPS)
我们在海外 VPS 上直接运行 FRP 二进制文件,运行FRP的服务端,使用简单的 Shell 脚本进行管理。
1. 下载与安装
前往 FRP Release 页面 下载最新版本:
https://github.com/fatedier/frp/releases
将解压获得 frps 文件放入到 /root/frp/ 目录中
2. 配置文件 frps.toml
在 /root/frp 目录下创建 frps.toml:
# /root/frps.toml
# 服务端监听端口 (用于接收国内 frpc 的连接)
bindPort = 65535
# 【关键安全配置】
# 强制限制所有穿透出来的端口只绑定在 127.0.0.1
# 作用:只有本机的 NPM 可以通过内网访问,外网无法直接连接 6080 端口
proxyBindAddr = "127.0.0.1"
# 身份验证 (请修改为高强度 Token)
auth.method = "token"
auth.token = "Your_Secure_Token_2026_ChangeMe"
然后启动frp的服务端(后台运行)
nohup ./frps -c frps.toml >/dev/null 2>&1 &
3. 启动脚本管理
在 /root 目录下创建管理脚本,方便随时启停。
启动脚本 frp_start.sh:
#!/bin/bash
# 后台启动并将日志输出到文件
nohup ./frps -c frps.toml >/dev/null 2>&1 &
echo "FRPS started."
停止脚本 frp_stop.sh:
#!/bin/bash
ps aux | grep frp | grep -v grep | awk '{print $2}' | xargs kill -9
echo "FRPS stopped."
别忘了赋予权限:chmod +x /root/frp/frp_start.sh /root/frp/frp_stop.sh
4. 配置开机自启 (rc.local)
编辑 /etc/rc.local (如果文件不存在则新建),在 exit 0 之前添加:
/root/frp/frp_start.sh
注意:确保 /etc/rc.local 具有可执行权限 chmod +x /etc/rc.local
二、国内源站部署 (FRPC)
国内机器作为客户端,负责建立一条加密的 TCP 长连接隧道。
1. 下载与安装
步骤同上,将解压后的 FRP 目录中的frpc文件(frp客户端)移动到 /root/frp 。
2. 配置文件 frpc.toml
在 /root/frp 目录下创建 frpc.toml。为了规避防火墙干扰,我们开启 TLS 协议 和 内容加密。
# /root/frpc.toml
# 1. 连接配置
serverAddr = "154.xx.xx.xx" # 你的海外 VPS IP
serverPort = 65535
auth.method = "token"
auth.token = "Your_Secure_Token_2026_ChangeMe" # 必须与服务端一致
# 2. 协议优化 (全局)
transport.protocol = "tcp"
# 【核心】开启 TLS 封装,伪装成 HTTPS 流量,防止被 DPI 识别阻断
transport.tls.enable = true
# 3. 隧道定义
[[proxies]]
name = "web"
type = "tcp"
localIP = "127.0.0.1"
localPort = 80 # 宝塔面板上网站的实际运行端口
remotePort = 8080 # 映射到海外 VPS 的端口
# 单独开启隧道加密与压缩
transport.useEncryption = true # 内容加密
transport.useCompression = true # 流量压缩 (节省跨境带宽)
3. 启动脚本管理
同样在 /root/frp 下创建:
启动脚本 frp_start.sh:
#!/bin/bash
nohup ./frpc -c frpc.toml >/dev/null 2>&1 &
echo "FRPC started."
停止脚本 frp_stop.sh:
#!/bin/bash
ps aux | grep frp | grep -v grep | awk '{print $2}' | xargs kill -9
echo "FRPC stopped."
赋予权限:chmod +x /root/frp/frp_start.sh /root/frp/frp_stop.sh
4. 配置开机自启
编辑国内服务器的 /etc/rc.local,添加:
/root/frp/frp_start.sh
三、海外反代配置 (Nginx Proxy Manager)
在海外 VPS 的 Nginx Proxy Manager (NPM) 中,我们需要把域名流量转发给 FRP 监听的本地端口。
- Add Proxy Host: 填写域名
example.org - 转发协议:
http - 转发IP: 填写
127.0.0.1。- 重要:必须填 127.0.0.1。因为我们在
frps.toml里配置了proxyBindAddr限制,填公网 IP 是连不通的。
- 重要:必须填 127.0.0.1。因为我们在
- Forward Port: 填写
8080(即 frpc 配置的 remotePort)。 - SSL: 申请 Let’s Encrypt 证书并强制开启 Force SSL。
原理:用户访问 HTTPS -> NPM 解密 -> 转发给本机的 127.0.0.1:8080 -> 进入 FRP 隧道。
四、核心难点:真实 IP 透传 (Real-IP)
如果不做这一步,国内宝塔面板的日志里全是 127.0.0.1,无法做日志审计或封禁恶意 IP。
1. 修改宝塔网站配置
进入国内源站宝塔面板 -> 网站 -> 设置 -> 网站配置文件, 在配置文件的最顶部,插入以下三行核心配置:
location ^~ /
{
# 【核心配置:IP 修正】
# 1. 信任来自本地 FRP (127.0.0.1) 的流量
set_real_ip_from 127.0.0.1;
# 2. 从 HTTP Header 中提取真实 IP (NPM 默认会传 X-Forwarded-For)
real_ip_header X-Forwarded-For;
# 3. 递归搜索,排除信任代理,找到最原始 IP
real_ip_recursive on;
# 下面是原有的反代或 PHP 配置 (保持不变)
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# ...
}
2. 验证
修改后重载 Nginx,查看网站访问日志,此时应该能看到海外用户的真实公网 IP。
五、方案总结
通过这套架构,我们成功利用闲置的国内高性能服务器搭建了对外服务的 Web 站点。
- 安全性:使用 TLS 封装 + AES 内容加密,无惧流量嗅探。
- 隐蔽性:海外 VPS 利用
proxyBindAddr锁死端口,仅允许 Nginx 本地转发,即使扫描 VPS 公网 IP 也看不到业务端口。 - 稳定性:利用二进制文件 +
rc.local实现了最基础且可靠的开机自启。
这大概是目前在无备案环境下,平衡“性能”与“合规”的最优解。















暂无评论内容