重要前提:关于域名备案 (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”这套组合,从零开始,搭建一套内网穿透系统,并解决所有我遇到过的坑。
二、 核心架构
在开始之前,我们先搞清楚每个工具的职责,它们协同工作,构成了我们的数据访问链路:
家用服务器:
职责:这是我们所有服务的物理运行环境,如 PVE、NAS、MCSM 等。它只在家庭局域网内可访问。
云服务器 (本次使用腾讯云):
职责:这是我们暴露在公网上的唯一入口,拥有一 个固定的公网 IP。我们在这台服务器上安装了
1Panel面板,用它来简化服务器的运维和应用部署。
FRP (Fast Reverse Proxy):
frps(服务端):运行在云服务器上(通过 1Panel 安装)。它是一个服务端程序,负责监听来自内网frpc的连接请求。frpc(客户端):运行在家用服务器上。它主动向云服务器的frps发起一条持久的加密隧道,并将内网服务的流量通过这条隧道“搬运”出去。
NPM (Nginx Proxy Manager):
职责:运行在云服务器上(通过 1Panel 安装),作为公网的流量总网关。
功能:
域名管理:将
https://pve.mydomain.com这样的友好域名指向内部的服务。SSL 证书:自动申请和续签 Let's Encrypt 证书,实现全站 HTTPS 加密。
流量转发:接收来自公网 443 端口的 HTTPS 流量,解密后,再将其转发给 FRP 隧道在云服务器上暴露的内部端口(如
6001,6002等)。协议处理:原生支持 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.com、pve.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 及关键配置
在云服务器上 (NPM):
登录 1Panel,进入“应用商店”。
搜索并安装
Nginx Proxy Manager,修改映射端口,直接使用80-81和443,最终展示的应该是这样
【关键】修改 NPM 容器网络模式
原因:1Panel 安装的应用默认使用
bridge桥接网络,这导致 NPM 容器和frps服务(它直接运行在宿主机或也在容器里,但不在一个网络)是网络隔离的。当 NPM 试图转发流量到127.0.0.1时,它访问的是容器自己,而不是宿主机,这会导致502 Bad Gateway错误。操作:
在 1Panel 中,进入 “容器” -> “网络”,确保你有一个
host模式的网络(通常 1Panel 会自带)。进入 “容器” -> “容器列表”,找到
nginx-proxy-manager(或类似名称)的容器。停止这个容器。
点击“编辑”,在“网络”设置中,将网络模式从默认的
bridge修改为host。记得清空IPv4,因为改为host之后不需要了,留着会保存失败
保存并重启容器。

配置 NPM:
访问
http://<云服务器IP>:81,使用默认账号admin@example.com和密码changeme登录。申请证书:进入
SSL Certificates->Add SSL Certificate->Let's Encrypt。在
Domain Names中填入*.mydomain.com和mydomain.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.comScheme:
httpForward 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 服务,你都只需要重复两个标准动作:
在
frpc.toml里为它开一条新隧道,分配一个新的remote_port。在 NPM 里添加一个新的
Proxy Host,用一个新子域名指向这个remote_port,并点上 SSL。
整个过程无需再动防火墙、无需再申请证书、无需记忆任何 IP 和端口。