FRP 自建内网穿透:不用公网 IP,把内网服务映射到公网(2026)

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

上面这段是结论块。下面是拓扑、完整配置、systemd 常驻和四个安全上的坑。

FRP 内网穿透的连接方向

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 部署五个步骤

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 白嫖你的带宽。

步骤 1:公网 VPS 起 frps

第二步:放行端口(两层都要)

这是新手第一个坑:安全组和系统防火墙是两层,缺一层就不通。

$ sudo ufw allow 7000/tcp
$ sudo ufw allow 8080/tcp    # 准备映射的业务端口
# 云控制台的安全组里同步放行 7000 与 8080

我一开始只放行了 ufw 忘了安全组,frpc 一直连不上还以为是 token 写错了,排了半小时。

步骤 2:放行端口与安全组

第三步:内网机器写 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 所在机器做跳板。

步骤 3:内网机器写 frpc.toml

第四步:写 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 断了会自动重连,不用你去看。

步骤 4:写 systemd 常驻

第五步:加访问保护

别把内网管理面板裸映射出去。 一旦映射到公网,全世界的扫描器几分钟内就会找到它并开始撞密码。三个做法:

  1. 走 HTTPS + Basic Auth:在 VPS 上再放一个 Nginx 反代,套一层 auth_basic 和证书,比直接暴露裸 HTTP 端口安全得多(配置方式和 Nginx 反代 + 自动证书 一样)。
  2. 只映射必要端口,管理后台走 stcp 类型(需要另一台机器带密钥才能连)而不是 tcp。
  3. 加 IP 白名单:ufw 里把 8080 只放行你自己的固定 IP。

步骤 5:加一层访问保护

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。

四个真会踩的坑

  1. 只开了 7000,忘了业务端口。 frps 只监听 7000 是控制通道;remotePort = 8080 这个业务端口是在 frps 收到映射请求时才动态监听的——但前提是防火墙允许它。ufw 和安全组都要放开 8080。

  2. auth.token 两端不一致 → 连接被拒。 日志里会看到 authentication failed,别去查网络,先核对两边的 token 字符串是否逐字符相同(尤其注意复制时带上的空格)。

  3. TOML 与老 INI 配置混用。 网上很多老教程还在用 frps.ini 的 [common] 段格式。v0.52 之后推荐 TOML,如果你混着写,新版本会按新语法解析而忽略旧段,表现就是"配置写了但不生效"。确认你下的是 v0.61.0,且配置文件是 .toml。

  4. 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。

相关阅读

上一篇 Cloudflare Pages 部署静态博客:零服务器 + 自动构建 + 自定义域名(2026)