【实战】无备案域名国内源站建站方案:基于 FRP + NPM 的全链路加密方案

前言

很多站长手里都有一台性能强劲的国内物理服务器(NAS),同时也持有像 example.org 这样优质的国际域名。但痛点在于:域名未备案,国内服务器无法直接通过 80/443 端口对外服务,且家用宽带通常封锁了标准 Web 端口。

为了解决这个问题,通常需要一台海外 VPS 做中转。经过反复测试与权衡,我摸索出了一套“国内源站 + 海外优质线路反代 + FRP 加密隧道”的架构方案。

这套方案不仅解决了备案阻断问题,还实现了:

  1. 全链路加密:防止流量在跨境传输中被嗅探。
  2. 真实 IP 透传:国内业务日志能准确记录访客真实 IP。
  3. 端口隐身:通过本地回环绑定,海外机器不开放任何业务端口,安全性极高。

架构拓扑

  • 源站 (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 监听的本地端口。

  1. Add Proxy Host: 填写域名 example.org
  2. 转发协议http
  3. 转发IP: 填写 127.0.0.1
    • 重要:必须填 127.0.0.1。因为我们在 frps.toml 里配置了 proxyBindAddr 限制,填公网 IP 是连不通的。
  4. Forward Port: 填写 8080 (即 frpc 配置的 remotePort)。
  5. 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 实现了最基础且可靠的开机自启。

这大概是目前在无备案环境下,平衡“性能”与“合规”的最优解。

THE END
想说的话 1  QQ & 微信交流群: 点击查看加群方式
2  本站运营不易,以真心❤️换真心💕,如果帮助到你,可以 推荐给朋友 或者 开通金贝会员 支持一下本站!
3  请不要进行任何非授权的网络攻击,如果造成任何损失均由使用者本人负责,与本站和原作者无关!
点赞100 分享
茶谈区 抢沙发

请登录后发表评论

    暂无评论内容