BaiYi
BaiYi
发布于 2025-11-03 / 20 阅读
0
0

使用云服务器、FRP 与 Nginx Proxy Manager 实现家庭建站

重要前提:关于域名备案 (ICP)

根据中华人民共和国的相关法律法规,任何在中国大陆境内(如腾讯云、阿里云等)购买的云服务器,如果需要通过域名对外提供 Web 服务(即通过 80 或 443 端口访问),该域名必须首先完成 ICP 备案

本文后续所有关于 https://*.mydomain.com 的操作,均默认您的云服务器和域名已经符合这一合规要求

  • 如果没有备案:您访问域名时候,云服务商将会自动跳转到提醒备案页面,导致无法通过域名访问Web服务

  • 非 Web 服务:FRP 穿透非 Web 服务(如游戏服务器、SSH、RDP等)并使用 IP:端口 的方式访问,通常不受备案限制。

请在继续之前,确保您的域名已满足要求。

一、 序言

如果你和我一样会在家里搭建各种服务:Proxmox VE (PVE)、NAS (群晖/TrueNAS)、MCSManager 面板、Jellyfin 媒体库等等,这些服务在内网中使用起来非常方便,但一旦你离开家,如何安全、优雅地访问它们就成了一个难题。

你想要的是像访问商业网站一样,通过 https://pve.mydomain.com 这样干净的域名来访问,而不是记住一堆 公网IP:端口号

本笔记将详细记录我如何使用“云服务器 + FRP + Nginx Proxy Manager”这套组合,从零开始,搭建一套内网穿透系统,并解决所有我遇到过的坑。

二、 核心架构

在开始之前,我们先搞清楚每个工具的职责,它们协同工作,构成了我们的数据访问链路:

  1. 家用服务器

    • 职责:这是我们所有服务的物理运行环境,如 PVE、NAS、MCSM 等。它只在家庭局域网内可访问。

  2. 云服务器 (本次使用腾讯云)

    • 职责:这是我们暴露在公网上的唯一入口,拥有一 个固定的公网 IP。我们在这台服务器上安装了 1Panel 面板,用它来简化服务器的运维和应用部署。

  3. FRP (Fast Reverse Proxy)

    • frps (服务端):运行在云服务器上(通过 1Panel 安装)。它是一个服务端程序,负责监听来自内网 frpc 的连接请求。

    • frpc (客户端):运行在家用服务器上。它主动向云服务器的 frps 发起一条持久的加密隧道,并将内网服务的流量通过这条隧道“搬运”出去。

  4. NPM (Nginx Proxy Manager)

    • 职责:运行在云服务器上(通过 1Panel 安装),作为公网的流量总网关。

    • 功能

      1. 域名管理:将 https://pve.mydomain.com 这样的友好域名指向内部的服务。

      2. SSL 证书:自动申请和续签 Let's Encrypt 证书,实现全站 HTTPS 加密。

      3. 流量转发:接收来自公网 443 端口的 HTTPS 流量,解密后,再将其转发给 FRP 隧道在云服务器上暴露的内部端口(如 6001, 6002 等)。

      4. 协议处理:原生支持 WebSocket (WSS),这是代理 MCSM 等现代应用的关键。

三、 开始基础搭建

第1步:准备云服务器和 1Panel

  • 在腾讯云、阿里云等处购买一台入门级(1核2G即可)的云服务器(CVM),并安装好Ubuntu系统,或者是你偏好的操作系统

  • 关于带宽,如果只是想和朋友一起玩游戏,可以选择购买一个动态公网IP,绑定你刚才购买的服务器,动态公网IP的流量则选怎按量付费,实测我和两个朋友玩七日杀一天流量消费2毛钱,不玩的时候则是一分钱不花,当然这要看游戏对网络的需求,像在MC里跑图对流量和带宽的需求就比较大,我选择的是100M带宽按量付费

  • 执行 1Panel 的一键安装脚本,安装好服务器运维面板。

    • 很简单,就一行代码,在1Panel官网:https://1panel.cn/

    • 在安装后会在控制台打印出访问面板的信息,打开这个地址先放着,过会儿再来用。

  • 登录云服务商的控制台,进入防火墙(安全组)配置,这是新手倒下的第一个地方(会导致 ERR_CONNECTION_RESET)。你必须放行:

    • TCP/22:SSH 远程登录用。

    • TCP/80:NPM 申请 SSL 证书时 HTTP 验证用。

    • TCP/443:HTTPS 的标准端口。

    • TCP/7000:FRP 服务端(frps)的主通信端口(可自定义)。

    • (1Panel 端口):放行您 1Panel 的登录端口。

    • 其他你需要的端口:内网穿透的其他服务所需的TCP/UDP端口。

第2步:配置域名(泛解析)

为了方便未来扩展,不要一个一个添加子域名解析。直接使用泛解析(Wildcard DNS)

  • 登录你的域名服务商(如腾讯云 DNSPod)。

  • 添加一条 A 记录:

    • 主机记录: *

    • 记录类型: A

    • 记录值: 你的云服务器公网IP

这样,abc.mydomain.compve.mydomain.com 等所有子域名都会自动指向你的服务器。

第3步:部署 FRP 隧道

在云服务器上 (frps)

  • 登录 1Panel,进入“应用商店”。

  • 搜索并安装 FRPs,所有参数都保持默认。

  • 安装后,在“已安装应用”中点击进入安装目录。

  • 打开/data/frps.toml,frps.toml 配置框中可以看到配置,不必修改,保持默认也是可以使用的

bindAddr = "0.0.0.0"
bindPort = 7000

auth.method = "token"
auth.token = "自己输入token"

webServer.addr = "0.0.0.0"
webServer.port = 7500
webServer.user = "自己输入user"
webServer.password = "自己输入password"

# tls
#transport.tls.force = true
#transport.tls.certFile = "/etc/frp/ssl/server.crt"
#transport.tls.keyFile = "/etc/frp/ssl/server.key"
#transport.tls.trustedCaFile = "/etc/frp/ssl/ca.crt"

在家用服务器上 (frpc)

  • 同样使用1Panel或者你喜欢的方式,最终安装好frpc,我使用的是在路由器的Opwnwrt上部署的frpc,方便对家庭内网统一管理。

  • 编辑 frpc.toml

[common]
server_addr = 你的云服务器公网IP
server_port = 7000

# 隧道名称可以随便取,比如这是nas的web应用
[nas_web]
type = tcp
local_ip = nas服务的内网ip,通常是192.168.x.x
local_port = 5000   # 在内网ip中使用的端口
remote_port = 6001  # 在云服务器暴露的端口
  • 启动 frpc,此时,访问 http://<云服务器IP>:6001 应该就能看到你的 NAS 登录页了(这不受备案影响,因为是 IP 访问)。

第4步:部署 NPM 及关键配置

  1. 在云服务器上 (NPM)

    • 登录 1Panel,进入“应用商店”。

    • 搜索并安装 Nginx Proxy Manager,修改映射端口,直接使用80-81和443,最终展示的应该是这样

  2. 【关键】修改 NPM 容器网络模式

    • 原因:1Panel 安装的应用默认使用 bridge 桥接网络,这导致 NPM 容器和 frps 服务(它直接运行在宿主机或也在容器里,但不在一个网络)是网络隔离的。当 NPM 试图转发流量到 127.0.0.1 时,它访问的是容器自己,而不是宿主机,这会导致 502 Bad Gateway 错误。

    • 操作

      1. 在 1Panel 中,进入 “容器” -> “网络”,确保你有一个 host 模式的网络(通常 1Panel 会自带)。

      2. 进入 “容器” -> “容器列表”,找到 nginx-proxy-manager(或类似名称)的容器。

      3. 停止这个容器。

      4. 点击“编辑”,在“网络”设置中,将网络模式从默认的 bridge 修改为 host

      5. 记得清空IPv4,因为改为host之后不需要了,留着会保存失败

      6. 保存并重启容器。

  1. 配置 NPM

    • 访问 http://<云服务器IP>:81,使用默认账号 admin@example.com 和密码 changeme 登录。

    • 申请证书:进入 SSL Certificates -> Add SSL Certificate -> Let's Encrypt

      • Domain Names 中填入 *.mydomain.commydomain.com

      • 勾选 Use a DNS Challenge,选择你的 DNS 服务商(本次使用腾讯云,所以是Tencent Cloud)

      • 访问https://console.dnspod.cn/account/token/apikey,新建密钥获得ID和KEY

      • 填入 API Token。

  • 添加第一个代理:进入 Hosts -> Proxy Hosts -> Add Proxy Host

    • Details 页:

      • Domain Names: nas.mydomain.com

      • Scheme: http

      • Forward Hostname / IP: 127.0.0.1 (因为是 host 模式,这就是宿主机)

      • Forward Port: 6001 (指向 frpc 里配置的 remote_port)

    • SSL 页:

      • SSL Certificate: 选择刚刚申请的 *.mydomain.com 泛域名证书。

      • 勾选 Force SSL

    • 保存。

现在,(在备案已通过的前提下)访问 https://nas.mydomain.com,你应该能看到熟悉的 NAS 页面

五、 结语

这套架构一旦搭建完成,就拥有了极高的灵活性。未来添加任何新的 Web 服务,你都只需要重复两个标准动作:

  1. frpc.toml 里为它开一条新隧道,分配一个新的 remote_port

  2. 在 NPM 里添加一个新的 Proxy Host,用一个新子域名指向这个 remote_port,并点上 SSL。

整个过程无需再动防火墙、无需再申请证书、无需记忆任何 IP 和端口。


评论