没有公网IP怎么连家里NAS?frp内网穿透自己搭,三十几块一年的服务器当中转站

表弟微信甩来一张截图:公司电脑连家里群晖,传输速度480KB每秒,后面跟着三个字——又卡了。这事我得负一半责任,他家那条移动宽带是100.64开头的CGNAT,公网IP想都别想;去年我帮他把IPv6直连理顺了,手机流量贴脸能跑5MB每秒,他高兴了没俩月就发现新问题:他白天在公司,公司WiFi是个老四格网络,压根没有v6,直连这条路在公司断头。断头了就退回群晖官方中继,免费档就五百KB每秒上下,傍晚高峰还得再打折。远程访问的路子拢共就那么几条,我在这篇三条路总账里都写过,剩给他的只剩一条没走:自己搭个中转站。
frp干的就一件事:租台有公网IP的机器替你传话
原理说白了特别朴素。你花几十块租一台云服务器,它有固定公网IP,这是家里宽带给不了的东西。服务器上跑一个叫frps的程序(服务端),家里的NAS上跑一个叫frpc的程序(客户端),frpc主动去连frps——注意这个方向,是家里往外连。家宽出站随便连,谁也拦不着,所以光猫一个字都不用改,路由器端口转发一条不用配。
连上之后,外面的人访问「服务器IP:18088」,数据从服务器钻进隧道,再从你家NAS的5000端口钻出来。对NAS来说,frpc就是个往外递话的信差,所有流量都走这条现成的通道,不存在打洞成功不成功的说法——frp压根不打洞,全程中继,所以它稳。代价也明摆着:速度的天花板就是那台服务器的带宽,这个后面算账细说。
跟厂商自带的官方中继比,frp赢在三个字:不挑食。官方中继只走它自家App那条协议,你用群晖的QuickConnect就只能干群晖允许你干的事;frp转发的是裸TCP端口,NAS后台、SMB、监控的RTSP、远程桌面3389,想转哪个转哪个,一台服务器全包了。
掏钱之前,三笔账先摊开
钱账:轻量应用服务器2核2G,新用户秒杀价三十八块一年,阿里云和腾讯云都有这个档位;没赶上活动的,老用户同价续费档一百块上下。有个坑我上次就提过,再啰嗦一遍:首年价多半是新用户限购一次,第二年续费能给你翻到两三百,下单前先看续费价再决定。frp这玩意儿一个星期跑不了几个G的流量,最低配都绰绰有余,别为跑frp买大机器。
速度账:这是最容易被教程忽悠的一笔。中转的速度上限就是你服务器的出方向带宽,3M带宽约等于375KB每秒,4M也就500KB每秒——跟官方免费中继一个量级,谁也别笑话谁。它真正赢的地方是独享:公共中继是千万人排队,高峰期给你打折;你这台服务器上就跑你自己的流量,什么时候都是这个数,延迟还稳,因为机房位置你自己挑,挑个离自己近的。想真快也有路,加钱买大带宽或者按峰值计费的机型,那是另一笔账了。表弟的需求其实很朴素:一个稳定的、不挑网络的、能让他从公司连回家的口子,五百KB每秒够拖文档和照片,够了。
安全账:这台服务器从此替你家NAS面对整个互联网的扫描,守门的三件事一件不能省——token设一长串、远程端口全用高位、NAS管理页别裸着HTTP就往外暴露。具体怎么弄,最后一节说。
服务端frps:下载、写一个文件、跑起来
frp在GitHub上开源,releases页面按服务器架构挑,x86的机器就下linux_amd64那个包,解压出来就两个可执行文件加俩示例配置,没有安装这一说。配置文件我贴全文,就这么多:
bindPort = 7000
auth.token = "换成你自己的长密码,十六位往上"
webServer.port = 7500
webServer.user = "admin"
webServer.password = "也换掉"
bindPort是frpc连进来用的口子,7000是默认值;auth.token是两头的暗号,越长越好;webServer那三行开的是管理面板,浏览器敲「服务器IP:7500」能看到每条隧道的实时流量。有个细节我实测过:面板默认只监听127.0.0.1,想远程打开得再加一行webServer.addr = "0.0.0.0"。跑起来直接nohup ./frps -c frps.toml &,讲究点的写个systemd服务开机自启。最后一步最容易漏:云厂商控制台的安全组,把7000和你打算用的远程端口(比如18088)的TCP放行,我第一回测试卡了十分钟,就是忘这事。
NAS这头:一个Docker容器的事
表弟那台群晖上早就有Docker环境,镜像、容器那几个概念之前都交过底。NAS侧的容器化部署比在服务器上手搓还省事,飞牛的应用中心或者群晖的Container Manager里搜snowdreamtech/frpc,这是社区里最常更新的frpc镜像。先在NAS上建个目录,比如/docker/frpc,放一个frpc.toml,全文如下:
serverAddr = "你服务器的公网IP"
serverPort = 7000
auth.token = "跟服务端那串一字不差"
[[proxies]]
name = "nas-web"
type = "tcp"
localIP = "127.0.0.1"
localPort = 5000
remotePort = 18088
最上面三行是连服务器用的,中间那层[[proxies]]就是一条隧道:名字随便起,type是tcp,localPort 5000是群晖后台的端口(飞牛是5666),remotePort 18088是你在外网要敲的那个口子。一台NAS想多转几个服务,就把[[proxies]]这一段整个复制一份往下接着写,SMB的445、监控的554都这么转。容器创建时把配置文件挂载进去,重启策略选always,以后升级容器照着参数重建就是了。飞牛用户要是嫌图形界面建目录麻烦,SSH进去两行命令也就搞定了。
跑不通先看日志:我在本机对跑踩的那个坑
给表弟配的时候我留了个心眼:服务器还没买,先把两头的配置文件在我自己电脑上对跑了一遍——frps监听7000,本机再起个网页服务冒充NAS,frpc带着配置去连。第一趟就翻车,我把token最后两位抄岔了,日志当场甩脸:
[E] token in login doesn't match token from configuration
login to the server failed: ... With loginFailExit enabled, no additional retries will be attempted
翻译过来就是暗号对不上,而且frpc默认一次失败直接退出,连重试都不带重试的。改对token再跑,日志变成另外一副面孔:login to server success,紧跟着一行[nas-web] start proxy success,隧道就通了。浏览器走18088那个口子,冒充NAS的页面原样出来;我又往里拖了个2.7MB的文件,管理面板里todayTrafficOut跳到2702182字节,一个字节的误差都没有。
本机对跑这一步看着多余,其实是最省时间的习惯。真到生产环境,一头是你不熟悉的服务器,一头是家里的NAS,中间隔着一整个互联网,报错了你都不知道该怀疑哪头;本机先跑通,等于把两份配置文件验了明正身,到时候出问题只剩两种可能——安全组没放行,或者IP抄错了。另外说句本机实验测不了的东西:速度。localhost上跑frp快得没有参考价值,真实速度由服务器带宽决定,前面那笔账别忘。
连上之后,三件正事别省
第一件,token和端口。token十六位起步,两头的remotePort全用一万往上的高位端口,别用80、8080这种扫描器字典第一页的号。第二件,别让NAS后台裸奔。frp转出来的是明文HTTP的话,等于把你家NAS的登录页贴到了公网上,被扫被撞库就是家常便饭,要么给后台套上HTTPS,加密那点事躲不开;讲究点的做法是frp只转一个VPN的口子,连上VPN再访问NAS,多一层门。第三件,那台服务器上别顺手再跑别的服务,它现在是你家的门卫,门卫室里堆的杂物越少越好。
| 你家的情况 | 我的建议 |
| 电信宽带,能要到公网IP | DDNS加端口转发,零成本,别多此一举 |
| 自己和常去的地方都有IPv6 | v6直连,一分钱不花 |
| CGNAT,偶尔远程看个状态 | 厂商免费中继够用,忍一忍 |
| CGNAT,访问的网络经常没v6 | frp自建,一年几十块买个稳 |
| 天天用,还要转SMB、监控多种服务 | frp最合适,一台服务器全包 |
给表弟的最终配置就一条隧道转后台加一条转SMB,傍晚他在公司实测,还是那五百KB每秒上下——带宽就3M,数字上没变化,但一下午没掉过一次线,高峰期也没打折。他说的原话是:速度没变快,心却不慌了。要我说这就是frp的意义,它买的不是速度,是一个你自己说了算的口子。动手顺序给一个:先本机对跑验配置,服务器买回来跑frps,安全组放行,NAS挂容器放末位,哪一步出问题,回去翻那一节的日志看。

发表评论