
[!NOTE] 对于拥有群晖、威联通、飞牛私有云等家庭 NAS 的极客,或者需要远程调试程序的开发者来说,如何将本地服务安全、快速地发布到公网是一个永恒的痛点。虽然我们可以用各种虚拟局域网(如 Tailscale)进行组网,但如果想把本地的网页直接分享给朋友、微信小程序开发调试,或者通过标准的 HTTP 访问服务,还是需要自建公网入口。今天老周手把手教大家用 Docker-compose 自建 frp,并通过 Caddy 反向代理实现“单域名复用 80/443 端口”,打造一套高速、安全且全掌控的内网穿透系统!本教程仅用于个人多设备互联与合规的远程办公场景。
亲爱的读者,欢迎回到 老周的AI进化实验室!
在前几期文章中,我们详细介绍了 Headscale 以及 RustDesk 自建服务的避坑教程,许多小伙伴都已经成功用上了私有虚拟网络。但是,这几天有几位做小程序开发和 NAS 影音分享的朋友给老周留言:
“老周啊,我的很多网页和调试接口是要分享给客户或者给微信服务器回调使用的,人家设备上根本不可能去装 Tailscale 客户端,这该怎么破?”
答案其实很简单,也很经典:自建 frp 内网穿透。
作为国内开源界使用最广、技术最成熟的内网穿透神器,frp 可以将内网设备的端口安全、稳定地映射到具有公网 IP 的服务器上。今天,老周就带大家避开新手最容易踩的“一服务一端口”和“SSL 证书配置繁琐”的两个大坑,用 Docker-compose + Caddy 搭建一套完美复用 80/443 端口并能自动续签 HTTPS 证书的 frp 穿透矩阵!
市面上其实有不少商业穿透软件(如花生壳、某某壳、Natapp 等),但它们对免费用户的限制极其严苛:限速 128KB/s、限制连接数、甚至强制要求域名备案并收费。而自建 frp 拥有绝对的优势
为了搭建本系统,我们需要准备:
yourdomain.com 及其泛域名 *.yourdomain.com)的 A 记录解析到您的云服务器公网 IP 上。
80 / 443:用于外网用户的 Web 访问(Caddy 监听)。7000:用于 frp 服务端与客户端建立隧道连接的主控制端口。7500:用于查看 frp 服务器连接状态的 Web 面板端口。
我们采用 Docker-compose 部署,这样不仅配置简单,后续迁移也极快。
在云服务器上创建文件夹:
mkdir-p/opt/frp-server&&cd/opt/frp-server 新建 frps.toml 配置文件:
nanofrps.toml 粘贴以下配置。请将 your_secure_token_here 替换为您自定义的强密码,这是客户端与服务端连接的凭证:
# frps.tomlbindAddr="0.0.0.0"bindPort=7000# 开启 TCP 多路复用,提升传输稳定性tcpMux=true# 身份验证凭证,客户端必须匹配一致auth.method="token"auth.token="your_secure_token_here"# 虚拟主机监听端口(用于转发 HTTP/HTTPS 流量)vhostHTTPPort=8080vhostHTTPSPort=8443# frp 服务端仪表盘配置(用于监控连接状态)webServer.addr="0.0.0.0"webServer.port=7500webServer.user="admin"webServer.password="admin_dashboard_password"新建 docker-compose.yml 文件:
nanodocker-compose.yml 填入以下内容:
version:'3'services:frps:image:fatedier/frps:v0.60.0container_name:frpsrestart:alwaysnetwork_mode:hostvolumes:-./frps.toml:/etc/frp/frps.toml运行命令拉起服务:
dockercomposeup-d 此时,访问 http://您的服务器IP:7500 并输入上面配置的仪表盘账号密码,就可以看到 frp 干净的监控后台了。
有了 frps 服务端后,如果我们要穿透内网的 NAS 界面(假设子域名为 nas.yourdomain.com)和本地开发环境(如 dev.yourdomain.com),我们需要在云服务器上配置反向代理,将 443 端口的 HTTPS 请求,根据域名自动转发给 frp 监听的本地端口,并自动向 Let's Encrypt 申请 SSL 证书。
这里老周推荐使用极简的 Caddy(无需复杂配置,比 Nginx 简单 10 倍,能全自动续签证书)。
在云服务器 /opt/frp-server 目录下,新建 Caddyfile:
nanoCaddyfile 填入以下反代理分发规则(请把域名替换为您自己的真实域名):
# 穿透 NAS 的子域名 nas.yourdomain.com { reverse_proxy localhost:8080 } # 穿透本地开发网页的子域名 dev.yourdomain.com { reverse_proxy localhost:8080 } 原理透析: 当用户访问
nas.yourdomain.com时,请求首先到达 Caddy 的 443 端口。Caddy 自动为其启用 HTTPS 加密,然后将解密后的流量转给本机的localhost:8080(即 frp 接收 HTTP 穿透流量的虚拟端口),frp 再通过已经建立的隧道把流量准确送达家里的 NAS。
在云服务器的 docker-compose.yml 中追加 Caddy 服务,合并后的配置如下:
version:'3'services:frps:image:fatedier/frps:v0.60.0container_name:frpsrestart:alwaysnetwork_mode:hostvolumes:-./frps.toml:/etc/frp/frps.tomlcaddy:image:caddy:2-alpinecontainer_name:caddyrestart:alwaysnetwork_mode:hostvolumes:-./Caddyfile:/etc/caddy/Caddyfile-./caddy_data:/data-./caddy_config:/config保存并执行 docker compose up -d 重新部署。Caddy 会在后台悄悄为您申请好所有的 SSL 证书。
现在回到您家里的电脑或 NAS 设备上。我们同样通过 Docker-compose 部署 frp 客户端(frpc)。
mkdir-p/opt/frp-client&&cd/opt/frp-client 新建 frpc.toml:
nanofrpc.toml 填入以下连接规则,将 <您的国内云服务器IP> 和域名替换为您的实际配置:
# frpc.toml# 服务端公网连接信息serverAddr="<您的国内云服务器IP>"serverPort=7000# 身份验证凭证,必须与服务端一致auth.method="token"auth.token="your_secure_token_here"# 虚拟局域网 TCP 多路复用transport.tcpMux=true# 穿透规则 1:家庭 NAS 界面(假设 NAS 本地运行在 192.168.1.100:5000)[[proxies]]name="home-nas-web"type="http"localIP="192.168.1.100"localPort=5000customDomains=["nas.yourdomain.com"]# 穿透规则 2:本地程序开发调试(假设开发机本地运行在 127.0.0.1:8080)[[proxies]]name="local-dev-web"type="http"localIP="127.0.0.1"localPort=8080customDomains=["dev.yourdomain.com"]version:'3'services:frpc:image:fatedier/frpc:v0.60.0container_name:frpcrestart:alwaysnetwork_mode:hostvolumes:-./frpc.toml:/etc/frp/frpc.toml保存并运行 docker compose up -d 启动客户端。
此时,您在咖啡厅或公司,打开任意浏览器输入 https://nas.yourdomain.com,便能瞬间直连到家里的 NAS 网页管理端。 * 检查小绿锁:浏览器地址栏会自动显示安全的 HTTPS 加密小绿锁,这表明流量已经受到了我们自建的 Caddy 证书保护,数据传输安全无虞。 * 性能实测:通过自建穿透,文件的下载与上传速度完全能跑满您国内云服务器的物理带宽,摆脱了任何商业软件的几十 KB 限速。
通过 Docker-compose + frp + Caddy 的架构方案,我们不仅避开了多端口暴露的安全风险,更用最优雅的方式实现了一站式多域名 HTTP/HTTPS 端口复用,这对于需要长期稳定分享内网应用的朋友来说是最完美、最高效的内网穿透出口解决方案。
如果您在安装配置或证书申请过程中遇到阻碍,欢迎在留言区给老周留言,我们一起探讨解决!
[!TIP] 觉得本期教程实用?别忘了点击“关注”老周的AI进化实验室,并把文章分享给身边同样饱受远控限速折扰的极客朋友们!