用 FRP 自建内网穿透:家里设备随时随地安全访问

家里 NAS 上的照片、软路由的管理页面、局域网里跑着的小服务,出门在外想访问一下,经常抓瞎。运营商不给公网 IP,路由器端口转发做不了,TeamViewer 之类的工具又慢又限制多。

折腾了一圈,最后留在手里的方案是 FRP:一台有公网 IP 的云服务器当中转,家里的机器主动连出去,流量经服务器转发进来。配置一次之后基本不用管,我用了大半年没出过岔子。

这篇把完整的搭建过程写下来,包括服务端、客户端、HTTPS 访问和 systemd 托管,照抄命令就能跑起来。

一、准备工作

FRP 分两端:服务端(frps)跑在云服务器上,客户端(frpc)跑在家里的设备上。云服务器只需要一台低配机器,因为流量转发对 CPU 要求很低,带宽够用就行。

用途建议配置说明
云服务器(frps)1 核 1G / 3M 带宽纯转发,带宽决定实际速度
家里设备(frpc)任意NAS、软路由、旧电脑都行

我自己用的是雨云rainyun-com的 1 核 1G 入门机,月付十几块,跑 frps 半年多很稳,注册填码:2026off,可领5折。系统选 Ubuntu 22.04 LTS,下面所有命令都基于这个系统。

先拿到一台服务器的公网 IP,假设是 1.2.3.4,后文都用它举例,记得替换成自己的。

二、部署服务端 frps

去 GitHub 搜 fatedier/frp,在 Releases 页面找到最新版本的 linux_amd64 压缩包(文件名形如 frp_0.61.0_linux_amd64.tar.gz)。云服务器访问 GitHub 经常不通,稳妥的做法是下载到自己电脑上,再 scp 传上去:

# 在自己电脑上执行,把包传到服务器scpfrp_0.61.0_linux_amd64.tar.gz root@1.2.3.4:/opt/# 然后登录服务器解压cd/opttar-zxvffrp_0.61.0_linux_amd64.tar.gzmvfrp_0.61.0_linux_amd64 frpcdfrp

新版 frp 用 toml 格式配置。编辑服务端配置文件:

nanofrps.toml

写入以下内容:

bindPort = 7000 auth.method = "token" auth.token = "换成一串足够长的随机密码" vhostHTTPPort = 8080 vhostHTTPSPort = 8443 webServer.addr = "0.0.0.0" webServer.port = 7500 webServer.user = "admin" webServer.password = "面板密码也换掉"

几个关键点:bindPort是客户端连接的端口,默认 7000;auth.token必须改成长随机串,这是唯一的认证凭据;webServer是自带的仪表盘,能看到各隧道状态。

放行防火墙端口:

sudoufw allow7000/tcpsudoufw allow7500/tcpsudoufw allow8080/tcpsudoufw allow8443/tcp

三、配置客户端 frpc

家里的设备同样下载对应架构的 frp 包(x86 机器用 linux_amd64,树莓派用 linux_arm64),编辑frpc.toml

serverAddr = "1.2.3.4" serverPort = 7000 auth.method = "token" auth.token = "和服务端一致的随机密码" [[proxies]] name = "nas-web" type = "tcp" localIP = "127.0.0.1" localPort = 5000 remotePort = 6000 [[proxies]] name = "router-ssh" type = "tcp" localIP = "192.168.1.1" localPort = 22 remotePort = 6022

每个[[proxies]]块是一条隧道。上面的例子把 NAS 的管理页(本地 5000 端口)映射到服务器的 6000 端口,把路由器的 SSH 映射到 6022。想加新服务,照着格式加一块就行,记得同时在服务器防火墙放行对应的 remotePort。

四、用 systemd 托管,开机自启

手动跑进程不靠谱,用 systemd 管起来。服务端创建/etc/systemd/system/frps.service

[Unit] Description=frp server After=network.target [Service] Type=simple ExecStart=/opt/frp/frps -c /opt/frp/frps.toml Restart=always RestartSec=5 [Install] WantedBy=multi-user.target

启用并启动:

sudosystemctl daemon-reloadsudosystemctlenable--nowfrpssudosystemctl status frps

客户端同理,把文件名和可执行文件换成 frpc、frpc.toml。之后服务器重启、家里设备断电恢复,隧道都会自动重连,不需要人工干预。

五、用域名访问 Web 服务

直接 IP 加端口能用,但给 Web 服务绑个域名体验好很多。在域名解析里加一条泛解析*.frp.你的域名指向服务器 IP,然后服务端配置追加一行:

subDomainHost = "frp.你的域名"

客户端的 Web 隧道改成 http 类型:

[[proxies]] name = "nas-web" type = "http" localIP = "127.0.0.1" localPort = 5000 subdomain = "nas"

之后访问nas.frp.你的域名:8080就能打开 NAS 管理页。如果嫌带端口麻烦,前面再套一层 Nginx 反向代理配 HTTPS,这块属于另一个话题就不展开了。

常见问题

问:连上了但转发很慢?基本是云服务器带宽瓶颈,转发流量全走服务器带宽,3M 小水管传文件就是快不起来。只访问管理页面够用,大文件传输建议升级带宽。

问:学生党预算有限怎么办?雨云rainyun-com最低配月付就十几块,先开一个月试试,不行随时退。

问:token 泄露了怎么办?直接改掉服务端配置里的 token,重启 frps,再把所有客户端同步改掉就行。平时别把配置文件传到公开仓库。

问:frpc 支持 Windows 吗?支持,Releases 里有 windows_amd64 包,配置写法完全一样,开机自启用任务计划程序实现。

总结

整套方案的核心就是一台低配合适的云服务器加 frp 两个进程,配置一次长期受益:NAS、路由器、开发机全都能从外网直达,比各类商业远程工具可控得多,也不用担心哪天服务关停。如果你也有公网 IP 焦虑,这套方案值得花半小时搭一次。