
家里有 NAS、有开发机、有挂在内网的监控和路由器管理页,可宽带不给公网 IP,人在公司就够不着家里那台机器——这是折腾自托管的人绕不开的第一道坎。市面上内网穿透工具不少,但要说免费、开源、能完全自己掌控的,frp 基本是绕不开的答案:GitHub 上 11 万颗 Star 的项目,Apache-2.0 协议,从个人 NAS 穿透到企业级内网服务暴露都在用它。这篇文章把 frp 从架构原理、服务端部署、客户端配置到 HTTPS、加密穿透、P2P 打洞一次讲透,配置全部按 v0.71 的新版 TOML 格式给出,可以直接照抄。
📥 下载地址:github.com/fatedier/frp/releases/latest(GitHub Releases,最新版 v0.71.1,Linux/Windows/macOS/Android 全平台压缩包约 12~14 MB),文档见 gofrp.org。软件本体免费开源,部署时需要一台有公网 IP 的服务器承接流量。
一、frp 是什么:一张图看懂它的架构
frp(Fast Reverse Proxy)是一款专注于内网穿透的高性能反向代理工具,由 fatedier 开发,2015 年开源至今迭代了 70 多个版本,最新版 v0.71.1 发布于 2026 年 10 月中。它的架构只有两个角色:
frps(服务端)跑在一台有公网 IP 的机器上(云服务器、VPS 都行),负责接收外部访问;frpc(客户端)跑在内网里那台真正提供服务机器上(NAS、开发机、路由器),主动连出去和 frps 建立一条长连接。外面的人访问公网服务器的某个端口,流量顺着这条隧道被送到内网机器上——因为连接是内网机器主动发起的,所以不需要公网 IP,也不需要在光猫路由器上做任何端口映射。
支持的协议类型很全:TCP、UDP、HTTP、HTTPS、STCP、XTCP,覆盖了远程桌面、SSH、Web 服务、监控流媒体、游戏联机等几乎所有场景。用 Go 写的单二进制文件,不依赖任何运行时,解压就能跑,这是它能在路由器、NAS、树莓派上遍地开花的原因。
二、为什么选 frp:和主流方案摆在一起比
| 对比项 | frp | Cloudflare Tunnel | Tailscale | 花生壳 |
|---|---|---|---|---|
| 开源 / 自托管 | 开源,服务端自己部署 | 闭源,托管在 CF | 客户端开源,协调服务托管 | 闭源商业服务 |
| 费用 | 免费,VPS 自理 | 免费额度够用 | 免费 100 台设备 | 免费版限速限流量 |
| 速度 | 取决于 VPS 带宽,可跑满 | 国内访问偏慢 | 打洞成功则快 | 免费档 1~2 Mbps |
| 隐私掌控 | 流量只过自己的服务器 | 过 CF 节点 | 打洞失败走中继 | 全走厂商 |
| 适合场景 | Web/桌面/SSH 全能,自定义强 | 纯 Web 对外发布 | 设备组网互访 | 小白开箱即用 |
一句话定位:想要完全自主可控、速度不设上限、什么协议都能穿的,frp 是首选;只是自己几台设备互访,Tailscale 更省事;对外发布纯网页且不介意国内速度,Cloudflare Tunnel 可以白嫖。frp 唯一的「成本」是你得有一台云服务器——家里宽带没有公网 IP 时,它是绕不开的落点。
三、部署前的准备:三样东西
动手前把材料备齐,后面一路顺:
① 一台有公网 IP 的云服务器。各家云厂商的轻量应用服务器就行,穿透日常 Web 和远程桌面,1 核 1G 的最低配完全够用,瓶颈在带宽不在配置。国内服务器延迟低但域名要备案走 443/80 才方便;不想备案可以选香港或海外节点,代价是延迟高一点。② 一个域名(可选但强烈建议)。穿 HTTP/HTTPS 服务时,域名 + 泛解析能让每个内网服务都有自己的网址,不用记端口号。③ 内网服务端的 IP 和端口。提前确认 NAS 管理页是 5000 还是 5001、SSH 是 22 还是自定义口,配置时直接填。
系统用主流的 Debian/Ubuntu 或 Rocky 都行,下面命令以 Linux 为例,Windows 客户端就是把解压出来的 frpc.exe 换个方式启动,配置文件完全一样。
四、服务端 frps:五分钟部署
先在服务器上把 frps 装起来并注册成系统服务:
# 下载并解压(以 linux amd64 为例,arm64 换对应包名)
wget https://github.com/fatedier/frp/releases/download/v0.71.1/frp_0.71.1_linux_amd64.tar.gz
tar -xzf frp_0.71.1_linux_amd64.tar.gz
cd frp_0.71.1_linux_amd64
cp frps /usr/local/bin/ && mkdir -p /etc/frp写服务端配置 /etc/frp/frps.toml(v0.52 起从 ini 换成了 TOML,老教程里的 ini 写法会报错,这是新人最容易踩的坑):
bindPort = 7000
auth.token = "换成一段你自己的长随机字符串"
# 管理面板(可选,建议开)
webServer.addr = "0.0.0.0"
webServer.port = 7500
webServer.user = "admin"
webServer.password = "换成强密码"
# HTTP/HTTPS 虚拟主机端口
vhostHTTPPort = 8080
vhostHTTPSPort = 8443注册成 systemd 服务 /etc/systemd/system/frps.service:
[Unit]
Description=frps service
After=network.target
[Service]
ExecStart=/usr/local/bin/frps -c /etc/frp/frps.toml
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.targetsystemctl daemon-reload && systemctl enable --now frps 搞定。然后到云厂商的安全组里放行 7000(隧道)、7500(面板)、8080/8443(Web 虚拟主机)这几个端口——安全组不放行是 frp 排障时排名第一的原因,服务端日志看着一切正常、客户端死活连不上,九成是这里。访问 http://服务器IP:7500 能看到面板,服务端就算就绪了。
五、客户端 frpc:把第一个服务穿出去
回到内网那台机器(NAS 或家里常开的电脑),同样下载解压,写 frpc.toml。第一个例子穿 SSH,最简单也最经典:
serverAddr = "你服务器的公网IP"
serverPort = 7000
auth.token = "和服务端一致的token"
[[proxies]]
name = "home-ssh"
type = "tcp"
localIP = "127.0.0.1"
localPort = 22
remotePort = 6022./frpc -c frpc.toml 启动,看到 login to server success 就通了。此后在任何能上网的地方 ssh -p 6022 用户名@服务器IP,实际登录的就是家里那台机器。Windows 远程桌面同理,把 localPort 换成 3389、remotePort 换个没被占用的(比如 6389),远程桌面客户端填 服务器IP:6389 即可。
正式使用时别用命令行裸跑:Linux 上照服务端的做法写一个 frpc.service;Windows 上推荐用 WinSW 把 frpc.exe 注册成系统服务,配置里把重启策略设为自动,开机即通、崩溃自拉起。日常运维盯着两个地方就够:服务端 7500 面板看每条隧道的实时连接数和流量,客户端日志看有没有连续的 connect server error——面板里某条代理长时间零流量,多半是内网那头的本地服务先挂了,不是 frp 的问题。
🔧 我整理的软件库
这些年折腾服务器、虚拟化和开发环境,装过的系统镜像、运维工具、开发套件、数据库与中间件,我都归档在自建的文件库里,持续补充新版本。没有弹窗广告,不强制注册,需要什么直接取。
常用工具随手可取 · 不定期补档
每个要穿透的服务就是一段 [[proxies]],可以并列写很多个:监控的 RTSP 流、路由器管理页、家里的下载工具,各自起名、各占一个 remotePort。名字重复会导致后一个注册失败,日志里会有明确提示。
六、穿 Web 服务与 HTTPS:给 NAS 一个正经网址
TCP 穿透要记端口号,穿 Web 服务用 http 类型就体面多了。先把域名的一条 A 记录指到服务器公网 IP(做泛解析 *.home.example.com 更省事),然后:
[[proxies]]
name = "nas-web"
type = "http"
localIP = "192.168.1.10"
localPort = 5000
customDomains = ["nas.home.example.com"]访问 http://nas.home.example.com:8080 就到了 NAS 管理页。要用标准 443 端口和 HTTPS,两种路子:一是在服务器前面挂 Nginx 或 Caddy 做反向代理和证书,8080 只是上游;二是 frp 1.x 之前的方案里直接用 vhostHTTPSPort 配合插件处理。反代方案更主流,证书续期、HTTP 跳转 HTTPS 都归反代管,frp 只管穿隧道,职责清晰。
一个实用细节:localIP 不用写 127.0.0.1,直接写内网目标机器的 IP,就能在一台常开机器上代理整个内网——路由器 192.168.1.1 的管理页、打印机、IoT 设备都能这样穿出去,不用每台机器都装 frpc。
七、STCP 与 XTCP:不想裸奔的进阶玩法
TCP 穿透的 remotePort 是暴露在公网上的,哪怕服务本身有密码,端口暴露总会被扫描器盯上。frp 给了两层进阶方案:
STCP(安全穿透):服务不再占用公网端口,访问者必须在自己的机器上也跑一份 frpc,配置一段 [[visitors]],凭 secretKey 才能在本地生成一条到内网服务的隧道:
# 内网服务端配置
[[proxies]]
name = "ssh-secret"
type = "stcp"
secretKey = "只有你知道的密钥"
localPort = 22
# 访问者机器上配置
[[visitors]]
name = "ssh-visitor"
type = "stcp"
serverAddr = "服务器公网IP"
serverPort = 7000
secretKey = "同一个密钥"
bindAddr = "127.0.0.1"
bindPort = 6022之后访问者连自己的 127.0.0.1:6022 就等于连家里 SSH,公网上什么都扫不到。远程桌面同理,这是把 RDP 安全暴露出去最省心的办法。XTCP(P2P 打洞)更进一步:两端在网络条件允许时直接打洞点对点通信,流量不过服务器,速度不再受 VPS 带宽限制,看家里 NAS 的高码率电影全靠它。把 type 换成 xtcp 即可,注意打洞成功率取决于两边 NAT 类型,打不洞会自动回落走服务器中继,不会断连。
八、安全加固清单:这几条至少做前三条
frp 服务端暴露在公网上,安全配置不是可选项:
| 措施 | 做法 | 防什么 |
|---|---|---|
| 强 token | auth.token 用 32 位以上随机串,不用默认值 | 陌生人蹭你的隧道中转流量 |
| 最小放行 | 安全组只放 7000 和确实要用的端口,7500 面板限自己 IP 访问 | 面板被爆破登录 |
| 端口跳变 | remotePort 别用 3389/22 等知名端口,用高位随机口 | 扫描器批量命中 |
| TLS 加密 | frpc 配 transport.tls.enable = true(新版默认开启) | 隧道流量被中间人还原 |
| 系统加固 | fail2ban 盯 SSH、及时打系统补丁 | 服务器本身沦陷 |
再啰嗦一句定位问题的心态:frp 的日志非常诚实,客户端连不上先看 connect server error 还是 proxy not exist,前者查网络和安全组,后者查两端 token 和端口配置是否一致。别一上来就重启,先读日志,九成问题日志里写得明明白白。自己搭完还是不通、或者企业场景下想一次把多条隧道、权限和审计规划好,可以找我聊聊:微信 / 手机 17712677007,把你的网络拓扑和想暴露的服务说清楚,我先帮你判断方案再动手。
九、常见问题速查
| 问题 | 原因与处理 |
|---|---|
| frpc 连不上服务器 | 先 telnet 服务器 7000 端口:不通查安全组和服务端进程,通了查 token 是否一致 |
| 老 ini 配置报错 | v0.52 起全面改 TOML,键名改成驼峰(bindPort/serverAddr),老教程配置要转格式 |
| 穿透能通但速度慢 | 瓶颈通常是 VPS 带宽;大流量场景上 XTCP 打洞或换大带宽机器 |
| HTTP 穿透打不开 | 确认域名解析到服务器、frps 配了 vhostHTTPPort、安全组放行了对应端口 |
| 客户端断线不自动重连 | frpc 本身带重连,配成 systemd/WinSW 服务才能开机自启和崩溃拉起 |
| 远程桌面能连但很卡 | 改低桌面分辨率和体验设置,或换 XTCP 打洞绕开服务器带宽瓶颈 |
十、结语:把内网的主动权拿回来
frp 的门槛比「装个 App 点一下」高那么一点,但它给你的回报是完全的掌控:协议随便穿、速度自己定、数据只过自己的服务器,11 万颗 Star 和十年迭代保证了它不是玩具。如果你已经在用它给 RustDesk 做中继,可以看看之前那篇《RustDesk 内网无公网 IP 怎么搭中继?端口映射、frp 中转与多分支机构组网实战》,两篇正好互补——一篇管远程桌面的中继,一篇管穿透本体的部署。你拿 frp 穿的第一个服务是什么?SSH、NAS 还是家里那台下载机?欢迎评论区聊聊。
✍️ 关于作者
IT 峰哥,互联网技术从业者。日常折腾服务器、虚拟化、数据库与企业级应用,关注开源系统的二次开发与基础设施落地。这里记录的是踩过的坑和验证过跑得通的方案,不是转述文档。
交流:微信 / 手机 17712677007(注明来意,看到会回)
文中方案如有疏漏,欢迎在评论区指正 · 技术问题欢迎交流