ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

零成本自建内网穿透:基于FRP与免费云服务器实现NAS远程访问

2026/8/5 2:17:42 拓冰建站 浏览量
零成本自建内网穿透:基于FRP与免费云服务器实现NAS远程访问 1. 项目概述为什么我们需要“真·免费”的内网穿透如果你和我一样把群晖NAS当作家里的数据中枢那么“随时随地访问”绝对是个刚需。无论是出差时调取一份合同还是给家人分享旅行照片或者远程管理下载任务都离不开远程访问。群晖自带的Quick Connect服务确实方便点几下就能用但它有几个绕不开的痛点速度依赖官方服务器高峰期可能慢如蜗牛免费版有连接数限制最关键的是数据终究要经过第三方服务器中转对于存放了私人照片、重要文档的NAS来说心里总有点不踏实。于是自建内网穿透方案就成了很多玩家的选择。市面上教程很多但要么需要你有一台带公网IP的云服务器每月几十到上百元不等的持续成本要么步骤复杂得让人望而却步。我这个方案的核心目标就一个真·免费且完全自控。它不依赖任何商业服务利用一些公开、稳定的免费资源结合开源工具FRP实现稳定、自主的远程访问。我把自己从零搭建、调试到最终稳定运行的全过程以及中间踩过的无数个坑都整理在这里。无论你是用白群晖、黑群晖甚至是其他品牌的NAS这套思路都能通用。2. 方案核心零成本公网入口的获取与原理要实现免费内网穿透最大的障碍就是公网IP。家庭宽带很难申请到而云服务器又需要花钱。我们的突破口在于利用那些提供长期免费额度或服务的云平台。2.1 免费云服务器资源盘点经过实测筛选以下几类资源是可行且相对稳定的主流云厂商的免费试用套餐例如国内外一些云平台为新用户提供12个月免费的轻量应用服务器通常配置是1核1G带宽1Mbps。这完全足够作为FRP的服务端frps。关键在于试用期结束后你可以用家人的信息再注册新账号“续杯”但这毕竟不是长久之计且涉及合规风险不推荐作为核心方案。Oracle Cloud永久免费套餐这是本方案的基石。甲骨文云提供“始终免费”套餐包括AMD架构的1核1G内存、50GB硬盘的虚拟机以及更宝贵的ARM架构实例最多可申请4核24G内存。每个账号可以创建最多4台这样的免费机并且只要账号不被回收资源就永久免费。它的网络质量尤其是首尔、东京等区域非常好是绝佳的中转服务器选择。申请需要信用卡验证有一定门槛但一旦成功就是长期稳定的资产。利用容器平台或Serverless服务一些PaaS平台如Railway、Fly.io提供免费的容器托管额度。我们可以将FRP服务端打包成Docker容器部署上去。这类服务的优势是完全免运维但通常有月度流量或运行时长限制且网络出口可能不稳定适合作为备用方案。注意选择免费资源时务必仔细阅读服务条款避免滥用导致封号。Oracle Cloud的账号相对稳定但初始申请和开机器时对IP和信用卡有一定风控建议使用干净的网络环境和真实的信用卡信息。2.2 为什么选择FRP内网穿透工具很多如ngrok、nps、ZeroTier等。选择FRPFast Reverse Proxy的原因如下极度轻量与高效由Go语言编写二进制文件小资源占用极低非常适合跑在免费的1核1G小水管服务器上。配置灵活直观基于INI格式的配置文件结构清晰功能模块化。无论是做TCP/UDP端口映射还是HTTP/HTTPS反向代理都能轻松应对。社区活跃文档丰富遇到问题很容易找到解决方案和讨论GitHub上Issue和Star数都很高意味着项目成熟可靠。协议支持全面除了基础的TCP还支持UDP、HTTP、HTTPS、STCP安全TCP等能满足从远程桌面、SSH到Web服务等各种场景。这套方案的核心架构很简单在免费的云服务器如Oracle Cloud VM上部署FRP服务端frps在你的群晖NAS上部署FRP客户端frpc。frpc会主动连接到frps在公网服务器上建立隧道。当你想访问NAS时流量先到你的公网服务器再通过隧道转发到内网的NAS上。3. 实战部署从服务器准备到NAS配置理论讲完我们进入手把手实操环节。这里以最理想的Oracle Cloud免费ARM实例作为FRP服务端群晖DSM 7.x作为客户端为例。3.1 免费Oracle Cloud服务器搭建FRPS首先你需要成功申请到Oracle Cloud账号并创建一台Always Free的ARM实例建议选择首尔或东京区域对国内连接友好。系统推荐Ubuntu 22.04 LTS。步骤1服务器基础安全配置用SSH登录你的Oracle云服务器后第一件事不是安装软件而是加固安全。# 1. 更新系统 sudo apt update sudo apt upgrade -y # 2. 创建新用户避免直接使用root sudo adduser frpuser sudo usermod -aG sudo frpuser # 3. 设置防火墙Oracle Cloud后台有安全列表系统内也建议配置UFW sudo ufw allow 22/tcp comment SSH sudo ufw allow 7000/tcp comment FRP Bind Port sudo ufw allow 7500/tcp comment FRP Dashboard # 稍后根据你映射的端口再开放例如8080 for Web # sudo ufw allow 8080/tcp comment NAS Web UI sudo ufw --force enable踩坑记录1Oracle Cloud后台的“安全列表”和实例的“防火墙规则”是两回事必须两边都放行相应端口流量才能通。我一开始只在系统内开了防火墙忘了在云控制台添加入口规则折腾了半天。步骤2安装并配置FRP服务端去FRP的GitHub Release页面下载对应ARM64架构的最新版本。# 切换到新用户 su - frpuser # 下载FRP (请替换为最新版本号) wget https://github.com/fatedier/frp/releases/download/v0.54.0/frp_0.54.0_linux_arm64.tar.gz tar -zxvf frp_0.54.0_linux_arm64.tar.gz cd frp_0.54.0_linux_arm64编辑服务端配置文件frps.toml(FRP新版本已改用TOML格式更清晰)bindPort 7000 # 服务端监听端口客户端用来连接的端口 auth.method token auth.token your_strong_password_here # 务必设置一个强令牌这是客户端连接的唯一凭证防止他人恶意连接 webServer.addr 0.0.0.0 webServer.port 7500 webServer.user admin webServer.password another_strong_password # 仪表板配置方便查看连接状态和流量 # 日志记录便于排查问题 log.to ./frps.log log.level info log.maxDays 3步骤3配置系统服务实现开机自启这是保证稳定性的关键避免服务器重启后服务丢失。# 创建系统服务文件 sudo nano /etc/systemd/system/frps.service写入以下内容[Unit] DescriptionFrp Server Service Afternetwork.target [Service] Typesimple Userfrpuser Restarton-failure RestartSec5s WorkingDirectory/home/frpuser/frp_0.54.0_linux_arm64 ExecStart/home/frpuser/frp_0.54.0_linux_arm64/frps -c /home/frpuser/frp_0.54.0_linux_arm64/frps.toml [Install] WantedBymulti-user.target然后启动并启用服务sudo systemctl daemon-reload sudo systemctl start frps sudo systemctl enable frps sudo systemctl status frps # 检查状态应为active (running)此时你可以通过http://你的服务器IP:7500访问FRP仪表板用上面设置的用户名密码登录查看服务端是否已就绪。3.2 群晖NAS上配置FRPC客户端在群晖上运行FRP客户端有两种主流方式Docker容器或直接运行二进制文件。我强烈推荐Docker方式因为它隔离性好管理方便且不受群晖系统升级影响。方式一通过Docker部署推荐打开群晖的“套件中心”安装“Docker”套件。打开Docker在“注册表”中搜索snowdreamtech/frpc下载最新版本镜像。在“映像”中找到下载的镜像双击启动。在“高级设置”中卷添加一个文件夹如/docker/frpc挂载到容器内的/etc/frp路径用于存放配置文件。网络选择“使用与 Docker Host 相同的网络”这样容器才能直接访问NAS本机的服务如5000端口。在刚才挂载的本地文件夹如/docker/frpc中创建frpc.toml配置文件serverAddr 你的Oracle云服务器公网IP serverPort 7000 auth.method token auth.token your_strong_password_here # 必须和frps.toml里的一致 [[proxies]] name nas-web type tcp localIP 192.168.1.10 # 你的群晖内网IP localPort 5000 # DSM管理端口 remotePort 5000 # 在公网服务器上暴露的端口 [[proxies]] name nas-https type tcp localIP 192.168.1.10 localPort 5001 # DSM HTTPS端口 remotePort 5001 [[proxies]] name nas-file type tcp localIP 192.168.1.10 localPort 6690 # 比如File Station服务端口 remotePort 6690 # 可以继续添加其他服务如Jellyfin、Bitwarden等保存配置启动容器。在Docker的“容器”列表中查看该容器的日志应该能看到login to server success之类的成功连接信息。踩坑记录2localIP不要填127.0.0.1或localhost因为Docker容器虽然与主机网络共享但localhost在容器内指向容器自己而非宿主机群晖。必须填写群晖在局域网中的真实IP地址。方式二通过任务计划运行二进制文件对于不喜欢Docker或老版本DSM的用户可以直接下载FRP的Linux AMD64版本二进制文件。通过SSH登录群晖需在控制面板中开启。下载并解压FRP客户端到某个目录如/volume1/frp。编写类似的frpc.toml配置文件。在群晖的“控制面板” - “任务计划”中新增一个“触发的任务” - “用户定义的脚本”。任务名称Frpc Client用户账号root事件开机在“任务设置”的“运行命令”中输入/volume1/frp/frpc -c /volume1/frp/frpc.toml /volume1/frp/frpc.log 21 保存后可以立即运行一次测试并勾选“已启用”实现开机自启。4. 高级配置与安全加固基础打通只是第一步要让服务稳定、安全地运行还需要一些精细调整。4.1 使用域名替代IP访问总是记IP地址很不方便也不利于后续切换服务器。我们可以为服务器绑定一个域名。在域名服务商如Cloudflare处将你的域名或子域名如nas.yourdomain.com通过A记录解析到你的Oracle云服务器公网IP。在FRP服务端配置中无需改动。因为FRP客户端连接的是服务器的IP和端口。关键改动在你的访问习惯和客户端配置你可以将nas.yourdomain.com:5000作为访问地址。更进一步可以在FRPS上配置子域名绑定实现通过不同子域名访问NAS的不同Web服务如dsm.yourdomain.com访问管理界面jellyfin.yourdomain.com访问影音服务器但这需要额外的Web服务器如Nginx进行反向代理配置更复杂。4.2 启用HTTPS加密通信FRP的TCP隧道本身是明文的虽然隧道建立了但你的DSM登录凭证等数据在公网传输仍有风险。强烈建议在群晖侧启用HTTPS在“控制面板”-“网络”-“DSM设置”中启用HTTPS并设置好证书群晖提供免费Let‘s Encrypt证书申请但需要80/443端口能从公网访问我们目前没有。可以先用自签名证书浏览器会提示不安全但通信是加密的。通过FRP映射HTTPS端口如上文配置将NAS的5001HTTPS端口映射出去。访问时使用https://服务器IP:5001。终极方案推荐在FRP服务端前面再加一层Nginx反向代理由Nginx来终止SSL即你访问Nginx是HTTPSNginx到FRPS是HTTP。这样你只需要一个域名证书且可以隐藏后端端口。例如通过https://dsm.yourdomain.com直接访问Nginx将请求代理到本地的frps:7000对应的隧道。这需要你在Oracle云服务器上安装并配置Nginx。4.3 配置健康检查与自动重启免费服务器可能偶有不稳定网络也可能波动。我们需要让服务具备自愈能力。服务端我们已经用了systemd其自带的Restarton-failure已经能在进程异常退出时重启。客户端Docker方式在创建容器时可以在“高级设置”-“重启策略”中选择“总是重启”或“除非停止否则总是重启”。客户端任务计划方式可以写一个简单的监控脚本定期检查frpc进程是否存在不存在则拉起。或者使用更强大的进程管理工具如supervisor。5. 疑难杂症与踩坑合集这里是我在部署和使用过程中遇到的实际问题及解决方案希望能帮你节省大量时间。5.1 连接失败类问题问题FRPC客户端日志显示connection timed out或dial tcp [服务器IP]:7000: i/o timeout。排查思路服务器防火墙确认Oracle Cloud控制台“子网”下的“安全列表”已添加入站规则允许源0.0.0.0/0访问目标端口7000(TCP)。系统防火墙确认服务器内部sudo ufw status显示7000/tcp是ALLOW。服务是否监听在服务器上执行sudo netstat -tunlp | grep 7000看是否有frps进程在监听。网络可达性从你的本地网络telnet 服务器IP 7000看是否能连通。如果不通很可能是云服务商层面的问题如实例没分配公网IP、IP被墙等。问题连接成功但访问映射的端口如5000时超时或拒绝连接。排查思路客户端配置IP错误确认frpc.toml中的localIP确实是群晖的内网IP且NAS上对应服务如DSM正在运行且监听所有接口或该IP。Docker网络模式如果用了Docker确保容器网络模式是host或自定义网络能通宿主机。bridge模式默认不通宿主机网络。NAS自身防火墙检查群晖“控制面板”-“安全性”-“防火墙”确保没有规则阻止了来自Docker网桥或本地网络的连接。5.2 性能与稳定性问题问题远程访问DSM界面或传输文件速度很慢。原因分析免费服务器的带宽通常很小Oracle Free Tier是500Mbps出站但入站和跨区域带宽有限。1Mbps的云服务器带宽瓶颈会非常明显。解决方案优选服务器区域选择物理距离你较近的Oracle云区域如首尔、东京对亚洲用户较好。压缩与加密取舍在frpc.toml中可以为每个代理设置transport.useEncryption false和transport.useCompression true。关闭加密可以降低CPU开销开启压缩可以减少传输数据量对文本、网页类流量提升明显但对已压缩的文件如视频、图片效果不大。减少不必要的数据同步远程访问主要用来管理或取放小文件大文件批量传输建议在局域网内进行。问题FRP连接偶尔会断开需要手动重启客户端。解决方案启用心跳检测在frpc.toml和frps.toml中配置心跳参数有助于保持长连接。# frpc.toml 和 frps.toml 都加上 transport.heartbeatInterval 30 transport.heartbeatTimeout 90配置TCP保活在系统层面可以调整TCP的keepalive参数但更直接的是依靠上述应用层心跳。5.3 安全相关注意事项令牌Token强度auth.token务必使用高强度、无规律的随机字符串这是防止未授权连接的第一道防线。仪表板访问限制FRPS的仪表板端口默认7500不要暴露在公网。可以通过修改webServer.addr 127.0.0.1只允许本地访问然后通过SSH隧道ssh -L 本地端口:127.0.0.1:7500 用户服务器IP来安全查看。或者在防火墙层面只允许特定管理IP访问。最小化端口暴露只映射必要的端口。不要图省事把NAS的所有端口都映射出去。常用的就是DSM的5000/5001以及具体应用端口如File Station的6690。定期更新关注FRP项目的GitHub Release定期更新客户端和服务端到稳定版本修复潜在的安全漏洞。6. 备选方案与延伸思考当免费的Oracle Cloud服务器因各种原因不可用时我们可以快速切换到备用方案。备选方案使用免费容器平台以Railway为例它提供每月5美元的免费额度对于低流量的FRP服务端绰绰有余。在Railway上新建一个项目选择“从GitHub部署”。准备一个简单的Dockerfile和frps.toml配置文件。Railway会自动构建并运行容器。它会分配一个*.up.railway.app的域名。你只需要将群晖FRPC客户端的serverAddr改为这个域名并将serverPort改为Railway暴露的端口通常在环境变量中设置。优点是完全免运维缺点是免费额度有限且域名可能被墙或访问不稳定。延伸结合DDNS实现更高可用性如果你有动态公网IP哪怕概率很小可以同时配置DDNS作为备用访问方式。在路由器或群晖上设置DDNS客户端如花生壳当检测到公网IP时直接通过域名访问速度最快当没有公网IP时自动回退到上述FRP方案。两者并不冲突可以共存。折腾这一套“真·免费”的内网穿透最大的收获不是省下了每月几十块的服务器费用而是对整个网络架构、数据流向有了更清晰的认识。从被云服务商“投喂”的Quick Connect用户变成了能自主掌控数据通道的玩家这种安全感和自由度是花钱买不到的。整个过程就像在搭乐高每一步的问题排查和解决都让最终成型的系统更加稳固可靠。最后一个小建议所有关键配置文件一定要做好备份。当你熟练之后从零重建一套这样的环境可能只需要一杯咖啡的时间。