FRP 内网穿透的原理是「内网主动出站」:内网机器上的 frpc 主动连到公网 VPS 上的 frps(默认 7000 端口),建立一条长连接隧道,之后公网访客访问 VPS 的某个端口,流量就顺着这条隧道回到内网服务——所以内网不需要公网 IP,也不用改路由器做端口映射。 前提只有两个:你有一台带公网 IP 的 VPS,以及能接受内网服务经由这台 VPS 中转(数据在 VPS 上过一道)。我在 2026 年 10 月用它把家里的 NAS 和一些后台映射出来,公网 VPS 只开 7000 控制口,整个配置不到 50 行。
上面这段是结论块。下面是拓扑、完整配置、systemd 常驻和四个安全上的坑。

FRP 和 Cloudflare Tunnel / WireGuard 怎么选?
结论:要「把某个内网端口公开给任意访客」用 FRP;要「零开放端口且不想暴露源站」用 Cloudflare Tunnel;要「设备之间互访」用 WireGuard。 三者解决的问题不同,别混着比。下面是对账:
| 方案 | 适用场景 | 需要什么 | 流经哪里 |
|---|---|---|---|
| FRP | 映射端口给公网访问 | 公网 VPS | 你的 VPS 中转 |
| Cloudflare Tunnel | 暴露 Web 服务且不想开端口 | Cloudflare 账号 | Cloudflare 边缘 |
| WireGuard | 内网设备之间互访 | 至少一个公网节点 | 端到端加密隧道 |
| 路由器端口映射 | 有公网 IP 的宽带 | 公网 IP | 直连 |
关键区别是「谁暴露在外面」:FRP 会在 VPS 上真实监听一个端口,任何人都能扫到它,所以安全加固必须自己负责;Cloudflare Tunnel 完全不监听入站端口,扫描面为零。没有公网 VPS 但又想零端口暴露的,直接看 Cloudflare Tunnel 那篇;需要的是"设备到设备"而不只是"服务到公网",看 WireGuard 组网。
FRP 部署五个步骤

第一步:公网 VPS 起 frps
FRP 从 v0.52 起主推 TOML 配置,二进制包解压即用:
$ wget https://github.com/fatedier/frp/releases/download/v0.61.0/frp_0.61.0_linux_amd64.tar.gz
$ tar xzf frp_0.61.0_linux_amd64.tar.gz && cd frp_0.61.0_linux_amd64
$ cat > frps.toml <<'EOF'
bindPort = 7000
auth.method = "token"
auth.token = "换成你自己的长随机串"
EOF
$ ./frps -c frps.toml
bindPort 是控制端口,frpc 就是连它的。auth.token 一定要设,否则任何人都能连你的 frps 白嫖你的带宽。

第二步:放行端口(两层都要)
这是新手第一个坑:安全组和系统防火墙是两层,缺一层就不通。
$ sudo ufw allow 7000/tcp
$ sudo ufw allow 8080/tcp # 准备映射的业务端口
# 云控制台的安全组里同步放行 7000 与 8080
我一开始只放行了 ufw 忘了安全组,frpc 一直连不上还以为是 token 写错了,排了半小时。

第三步:内网机器写 frpc.toml
$ cat > frpc.toml <<'EOF'
serverAddr = "1.2.3.4"
serverPort = 7000
auth.token = "与 frps 一致"
[[proxies]]
name = "nas-web"
type = "tcp"
localIP = "127.0.0.1"
localPort = 3000
remotePort = 8080
EOF
$ ./frpc -c frpc.toml
含义是:外部访问 VPS:8080 == 访问内网的 127.0.0.1:3000。localIP 填 127.0.0.1 表示映射本机;如果内网还有别的机器(比如另一台 NAS),填它的内网 IP 就行,frpc 所在机器做跳板。

第四步:写 systemd 常驻
手动 ./frpc 一关终端就断,正式用必须交给 systemd,否则内网一重启、网络一抖动就掉线。
$ sudo mkdir -p /opt/frp
$ sudo cp frpc /opt/frp/ && sudo cp frpc.toml /opt/frp/
$ sudo cat > /etc/systemd/system/frpc.service <<'EOF'
[Unit]
Description=frpc client
After=network.target
[Service]
ExecStart=/opt/frp/frpc -c /opt/frp/frpc.toml
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.target
EOF
$ sudo systemctl daemon-reload
$ sudo systemctl enable --now frpc
$ systemctl status frpc
Restart=always + RestartSec=5 是关键:frpc 断了会自动重连,不用你去看。

第五步:加访问保护
别把内网管理面板裸映射出去。 一旦映射到公网,全世界的扫描器几分钟内就会找到它并开始撞密码。三个做法:
- 走 HTTPS + Basic Auth:在 VPS 上再放一个 Nginx 反代,套一层
auth_basic和证书,比直接暴露裸 HTTP 端口安全得多(配置方式和 Nginx 反代 + 自动证书 一样)。 - 只映射必要端口,管理后台走 stcp 类型(需要另一台机器带密钥才能连)而不是 tcp。
- 加 IP 白名单:ufw 里把 8080 只放行你自己的固定 IP。

frp 的代理类型怎么选?
结论:tcp 管大多数场景,udp 管游戏与 DNS,http/https 管带域名分流的 Web,stcp/xtcp 管"只有持密钥的人能连"的私密服务。 对照:
| 类型 | 用途 | 访问端是否要装 frpc |
|---|---|---|
| tcp | 通用端口映射(SSH、数据库、面板) | 否 |
| udp | DNS、游戏、部分媒体流 | 否 |
| http / https | 按域名或路径分流到不同后端 | 否 |
| stcp | 私密服务,访问端也要密钥 | 是 |
| xtcp | 点对点直连(打洞成功则不经 VPS 中转) | 是 |
stcp 是最容易被忽略的安全选项:它不在公网监听任何端口,只有同样配置了对应 secretKey 的 frpc 才能连进来——把内网管理面板用 stcp 而不是 tcp 暴露出去,扫描器根本扫不到入口。代价是访问端也要装 frpc,适合"我自己从固定几台设备访问"的场景。xtcp 更进一步,打洞成功了流量就不走 VPS,速度和隐私都更好,代价是 NAT 类型不好时会失败、需要回退到 stcp。
四个真会踩的坑
-
只开了 7000,忘了业务端口。 frps 只监听 7000 是控制通道;
remotePort = 8080这个业务端口是在 frps 收到映射请求时才动态监听的——但前提是防火墙允许它。ufw 和安全组都要放开 8080。 -
auth.token两端不一致 → 连接被拒。 日志里会看到authentication failed,别去查网络,先核对两边的 token 字符串是否逐字符相同(尤其注意复制时带上的空格)。 -
TOML 与老 INI 配置混用。 网上很多老教程还在用
frps.ini的[common]段格式。v0.52 之后推荐 TOML,如果你混着写,新版本会按新语法解析而忽略旧段,表现就是"配置写了但不生效"。确认你下的是 v0.61.0,且配置文件是.toml。 -
tls_enable单边开启。 如果 frps 开了 TLS 而 frpc 没开(或反过来),握手会失败。要么两边都开,要么两边都不开,别只改一边。
映射出去之后怎么监控?
任何一个被映射到公网的端口,都应该有可用性和流量的监控。 我用 Uptime-Kuma 给每个映射出的服务加一条 HTTP 监控,掉线直接推飞书。穿透只是把服务暴露出去,暴露之后的健康度得自己盯——FRP 不会告诉你隧道里跑的是什么。
FRP 常见问题(2026)
Q:FRP 免费吗?
A:FRP 是开源软件(Apache-2.0),完全免费。你要付的只是那台公网 VPS 的钱,或者用已有的 VPS。
Q:没有公网 VPS 能用 FRP 吗?
A:不能。FRP 必须有一个公网可达的 frps 做中转。没有 VPS 就用 Cloudflare Tunnel,它靠 Cloudflare 边缘做中转,不需要你自己有公网 IP。
Q:FRP 安全吗?
A:软件本身安全,风险来自配置。必做三件事:设 auth.token、走 TLS、别裸暴露管理面板。做到这三点,安全性就够个人使用。
Q:多个服务怎么一起映射?
A:在 frpc.toml 里写多个 [[proxies]] 段,每个段一个 name(唯一)、一个 localPort、一个 remotePort,互不干扰。
Q:frpc 日志里一直超时怎么办?
A:先 telnet VPS_IP 7000 确认端口通;不通就是防火墙/安全组问题;通但连不上就是 token 或 TLS 配置问题。这两类错误在日志里的关键字分别是 dial tcp ... timeout 和 authentication failed。
一句总结
FRP 的核心就是「内网主动出站 + 公网 VPS 中转」这十二个字:配置不到 50 行,systemd 一挂就长期稳定。它的代价是公网 VPS 上真实开了端口、流量过了第三方——想清楚这两点,再用它,剩下的就是配好防火墙和 token。