家里的 NAS、开发机或小型服务器没有公网 IPv4,运营商还可能使用 CGNAT,这时即使在路由器上配置端口转发,外网也不一定能连回来。FRP 的解决思路是:在有公网 IP 的 VPS 上运行 frps,内网设备主动运行 frpc 连接 VPS,再由 VPS 把外部请求转发回内网服务。
这也是一个和 VPS 购买高度相关的场景。FRP 本身很轻,但公网 IPv4、线路延迟、端口策略、带宽和月流量都会直接影响体验。本文以 Ubuntu 24.04 VPS 和 Linux 内网设备为例,使用当前官方二进制、TOML 配置、Token 文件与 systemd,完成 SSH、Web 服务、HTTPS、安全访问、更新和故障排查。
FRP 官方文档将其定义为专注内网穿透的高性能反向代理,由公网服务器上的 frps 和内网设备上的 frpc 组成。它支持 TCP、UDP、HTTP、HTTPS、STCP、XTCP 和端口复用等模式。
| 方案 | 最适合 | 是否需要公网 VPS | 默认访问范围 | 主要限制 |
|---|---|---|---|---|
| FRP | 把 SSH、NAS、Web、TCP/UDP 服务映射到公网 | 是 | 可公开,也可做私密访问 | 流量通常经过 VPS,需要自己加固 |
| WireGuard | 自己的手机、电脑安全进入家庭内网 | 通常需要 | VPN 成员 | 公开分享给普通访客不方便 |
| Tailscale | 多设备私网互联和身份管理 | 不一定 | 账号授权设备 | 依赖协调服务,公开服务需额外方案 |
| Cloudflare Tunnel | 不开放入站端口发布 HTTP/HTTPS 应用 | 否 | Web 访问 | 不适合任意公网 TCP/UDP 场景 |
| SSH 反向隧道 | 临时映射一个 TCP 服务 | 是 | 按 SSH 配置 | 多服务管理和监控能力有限 |
如果只是自己从手机或笔记本访问 NAS,优先考虑WireGuard VPN,攻击面通常更小。需要为不同用户提供公开域名、固定 TCP 端口或 UDP 服务时,FRP 更灵活。
还要理解一个容易混淆的点:普通 TCP、UDP 和 HTTP 映射的数据会经过 VPS;XTCP 尝试让两端点对点连接,但并非所有 NAT 环境都能成功。不要把 FRP 当成“流量完全不经过服务器”的魔法。
FRP 控制进程的 CPU 和内存占用通常不高,真正需要关注的是公网 IP、线路和流量。
| 使用场景 | 建议起步配置 | 带宽与流量重点 |
|---|---|---|
| 只转发 SSH、远程管理 | 1 vCPU、512MB–1GB 内存、10GB 磁盘 | 10Mbps、每月几百 GB 通常足够 |
| NAS 管理页、相册和少量文件 | 1–2 vCPU、1GB 内存、20GB 磁盘 | 建议 100Mbps,至少 1TB 月流量 |
| 视频串流、大文件下载 | 2 vCPU、1–2GB 内存 | 高带宽、大流量或不限流量条款最重要 |
| 多个家庭或团队共用 | 2 vCPU、2GB 内存 | 独立 Token/OIDC、端口白名单、监控 |
持续占用 10Mbps 的理论月传输量约为 3.24TB,持续 100Mbps 则约为 32.4TB。实际不会一直跑满,但这能说明为什么“1Gbps 端口”不等于“适合长期中继大文件”。购买前必须确认:
- 套餐是按出站流量、双向流量还是公平使用政策计费;
- 超额后是限速、停机还是按量收费;
- 是否提供独立公网 IPv4,是否允许自定义 TCP/UDP 端口;
- 机房到主要访问者和家庭宽带的延迟、丢包、晚高峰表现;
- 服务商是否允许反向代理、端口转发和长期大流量中继。
FRP 的访问路径大致是“用户 → VPS → 家里”,VPS 机房并非越远越好。主要用户在国内而 VPS 在远距离机房时,两个网络段的延迟和丢包会叠加。上线后建议用VPS 流量监控与超额预警持续观察,而不是等账单或停机通知出现才处理。
本文采用以下端口:
| 端口 | 协议 | 用途 | 公网规则 |
|---|---|---|---|
22 | TCP | VPS 自身 SSH | 只允许管理员 IP 更好 |
7000 | TCP | frpc 连接 frps 的控制端口 | 必须开放;能限制来源时尽量限制 |
6000 | TCP | 示例:转发内网 SSH | 只允许管理员 IP |
8080 | TCP | 示例:NAS Web 到 VPS 本机 | 不开放公网,由 Caddy 本机访问 |
80/443 | TCP | Caddy 域名与 HTTPS | 发布 Web 服务时开放 |
7500 | TCP | 可选 Dashboard | 不开放公网,只监听 127.0.0.1 |
端口号可以更换,但服务器配置、客户端配置、UFW 和云安全组必须一致。不要把 1-65535 全部开放,也不要允许获得 Token 的客户端任意占用服务器端口。
登录 VPS,更新系统并安装下载、校验和防火墙工具:
sudo apt update
sudo apt upgrade -y
sudo apt install -y curl ca-certificates tar openssl ufw
创建没有登录 Shell 的独立服务用户:
sudo useradd --system \
--home-dir /var/lib/frp \
--create-home \
--shell /usr/sbin/nologin \
frp
sudo install -d -m 750 -o root -g frp /etc/frp
sudo install -d -m 750 -o frp -g frp /var/lib/frp
id frp
不要使用 root 运行 frps。FRP 只需要监听 7000 和本文允许的高位代理端口;域名 HTTPS 由 Caddy 监听 80/443,因此 frps 不需要低端口权限。
截至 2026 年 8 月,官方发布通道的当前版本是 v0.71.0。小版本会继续更新,部署前应再次查看FRP 官方 Releases,不要从不明一键脚本或网盘下载安装包。
在 x86_64 VPS 上执行:
FRP_VERSION=0.71.0
FRP_ARCH=amd64
FRP_PACKAGE="frp_${FRP_VERSION}_linux_${FRP_ARCH}.tar.gz"
cd /tmp
curl -fLO \
"https://github.com/fatedier/frp/releases/download/v${FRP_VERSION}/${FRP_PACKAGE}"
curl -fLO \
"https://github.com/fatedier/frp/releases/download/v${FRP_VERSION}/frp_sha256_checksums.txt"
grep " ${FRP_PACKAGE}$" frp_sha256_checksums.txt | sha256sum -c -
tar -xzf "$FRP_PACKAGE"
sudo install -m 755 \
"frp_${FRP_VERSION}_linux_${FRP_ARCH}/frps" \
/usr/local/bin/frps
/usr/local/bin/frps --version
sha256sum 必须返回 OK。如果没有匹配到文件名或校验失败,先停止安装,重新核对版本、架构和下载来源,不能跳过校验继续执行。
ARM64 VPS 要把 FRP_ARCH 改为 arm64。可先运行:
uname -m
x86_64 对应 amd64,aarch64 或 arm64 对应 arm64。
从 v0.64.0 起,FRP 支持从文件读取 Token,避免把密钥直接写进 TOML。生成 32 字节随机 Token:
sudo sh -c 'umask 027; openssl rand -hex 32 > /etc/frp/server_token'
sudo chown root:frp /etc/frp/server_token
sudo chmod 640 /etc/frp/server_token
sudo wc -c /etc/frp/server_token
文件长度应为 65 字节:64 个十六进制字符加换行。不要把 Token 发到群聊、工单、截图或 Git 仓库。
创建 /etc/frp/frps.toml:
bindAddr = "0.0.0.0"
bindPort = 7000
auth.method = "token"
auth.tokenSource.type = "file"
auth.tokenSource.file.path = "/etc/frp/server_token"
transport.tls.force = true
allowPorts = [
{ single = 6000 },
{ single = 8080 },
{ start = 6100, end = 6199 }
]
maxPortsPerClient = 10
log.to = "console"
log.level = "info"
log.disablePrintColor = true
这里做了四层约束:
- Token 验证 frpc 是否有权连接;
transport.tls.force = true拒绝未启用 TLS 的客户端;allowPorts限制客户端能申请的远程端口;maxPortsPerClient防止单个客户端无限创建代理。
官方认证文档说明,auth.token 与 auth.tokenSource 不能同时使用。配置了文件来源后,不要再额外添加明文 auth.token。
保存配置后设置权限并验证语法:
sudo chown root:frp /etc/frp/frps.toml
sudo chmod 640 /etc/frp/frps.toml
sudo -u frp /usr/local/bin/frps verify -c /etc/frp/frps.toml
官方支持使用 frps verify 和 frpc verify 在启动前检查 TOML。不要继续使用旧教程中的 INI 格式;INI 已弃用,新功能只支持 TOML、YAML 或 JSON。
创建 /etc/systemd/system/frps.service:
[Unit]
Description=FRP server
Wants=network-online.target
After=network-online.target
[Service]
Type=simple
User=frp
Group=frp
WorkingDirectory=/var/lib/frp
ExecStart=/usr/local/bin/frps -c /etc/frp/frps.toml
Restart=on-failure
RestartSec=5
NoNewPrivileges=true
PrivateTmp=true
ProtectSystem=strict
ProtectHome=true
ReadWritePaths=/var/lib/frp
[Install]
WantedBy=multi-user.target
启用并检查:
sudo systemctl daemon-reload
sudo systemctl enable --now frps
sudo systemctl status frps --no-pager
sudo journalctl -u frps -n 100 --no-pager
sudo ss -lntp | grep ':7000'
这一方式与FRP 官方 systemd 指南一致,并增加了独立用户与 systemd 沙箱限制。ProtectSystem=strict 下如果以后把日志写入文件,需要单独创建可写目录并加入 ReadWritePaths;本文直接把日志交给 journald。
先确认 SSH 规则,再开放控制端口:
sudo ufw allow OpenSSH
sudo ufw allow 7000/tcp comment 'FRP control'
sudo ufw enable
sudo ufw status numbered
如果内网出口有固定公网 IP,例如 198.51.100.20,控制端口可以进一步限制来源:
sudo ufw delete allow 7000/tcp
sudo ufw allow from 198.51.100.20 to any port 7000 proto tcp
家庭宽带公网地址经常变化时,无法长期使用固定来源规则,就必须依赖强随机 Token、TLS、端口白名单和日志监控。
云厂商安全组也要添加对应规则。UFW 与安全组是两层防火墙;进程监听正常但外网无法连接时,可以按端口、防火墙与安全组排查清单检查。
以下命令会根据常见 Linux 架构选择安装包:
FRP_VERSION=0.71.0
case "$(uname -m)" in
x86_64) FRP_ARCH=amd64 ;;
aarch64|arm64) FRP_ARCH=arm64 ;;
armv7l) FRP_ARCH=arm ;;
*) echo "Unsupported architecture: $(uname -m)"; exit 1 ;;
esac
FRP_PACKAGE="frp_${FRP_VERSION}_linux_${FRP_ARCH}.tar.gz"
cd /tmp
curl -fLO \
"https://github.com/fatedier/frp/releases/download/v${FRP_VERSION}/${FRP_PACKAGE}"
curl -fLO \
"https://github.com/fatedier/frp/releases/download/v${FRP_VERSION}/frp_sha256_checksums.txt"
grep " ${FRP_PACKAGE}$" frp_sha256_checksums.txt | sha256sum -c -
tar -xzf "$FRP_PACKAGE"
sudo install -m 755 \
"frp_${FRP_VERSION}_linux_${FRP_ARCH}/frpc" \
/usr/local/bin/frpc
创建客户端用户和目录:
sudo useradd --system \
--home-dir /var/lib/frp \
--create-home \
--shell /usr/sbin/nologin \
frp 2>/dev/null || true
sudo install -d -m 750 -o root -g frp /etc/frp
sudo install -m 640 -o root -g frp /dev/null /etc/frp/client_token
sudo nano /etc/frp/client_token
把 VPS 上 /etc/frp/server_token 的内容通过可信 SSH 会话或密码管理器复制进去,保存后检查权限:
sudo chown root:frp /etc/frp/client_token
sudo chmod 640 /etc/frp/client_token
sudo wc -c /etc/frp/client_token
服务端与客户端 Token 必须完全相同,包括不要误加空格。FRP 会自动去掉文件首尾空白,但仍不应该在 Token 文件中写注释或额外行。
假设 VPS 公网地址使用文档示例 IP 203.0.113.10。创建 /etc/frp/frpc.toml:
serverAddr = "203.0.113.10"
serverPort = 7000
auth.method = "token"
auth.tokenSource.type = "file"
auth.tokenSource.file.path = "/etc/frp/client_token"
transport.tls.enable = true
[[proxies]]
name = "home-ssh"
type = "tcp"
localIP = "127.0.0.1"
localPort = 22
remotePort = 6000
transport.bandwidthLimit = "10MB"
transport.bandwidthLimitMode = "server"
将 203.0.113.10 替换为 VPS 的真实公网 IP。验证配置并前台测试:
sudo chown root:frp /etc/frp/frpc.toml
sudo chmod 640 /etc/frp/frpc.toml
sudo -u frp /usr/local/bin/frpc verify -c /etc/frp/frpc.toml
sudo -u frp /usr/local/bin/frpc -c /etc/frp/frpc.toml
看到代理注册成功后,到 VPS 检查端口:
sudo ss -lntp | grep ':6000'
只允许管理员固定 IP 访问示例 SSH 映射:
sudo ufw allow from 198.51.100.30 to any port 6000 proto tcp
然后从该管理员网络测试:
ssh -p 6000 [email protected]
替换用户、VPS IP 和管理员来源 IP。FRP Token 只负责验证 frpc,不能代替内网 SSH 的密钥认证。内网设备仍应禁用弱密码、限制用户,并保留 SSH 自身的安全策略。
在内网 Linux 设备创建 /etc/systemd/system/frpc.service:
[Unit]
Description=FRP client
Wants=network-online.target
After=network-online.target
[Service]
Type=simple
User=frp
Group=frp
WorkingDirectory=/var/lib/frp
ExecStart=/usr/local/bin/frpc -c /etc/frp/frpc.toml
Restart=on-failure
RestartSec=5
NoNewPrivileges=true
PrivateTmp=true
ProtectSystem=strict
ProtectHome=true
ReadWritePaths=/var/lib/frp
[Install]
WantedBy=multi-user.target
启动并查看日志:
sudo systemctl daemon-reload
sudo systemctl enable --now frpc
sudo systemctl status frpc --no-pager
sudo journalctl -u frpc -n 100 --no-pager
如果内网 SSH 只监听某个局域网 IP,不在 127.0.0.1:22,把 localIP 改成真实监听地址。先在内网设备上执行 ss -lntp 和 ssh localhost,确认本地服务可用,再排查 FRP。
直接把 NAS 后台映射到公网高位端口虽然简单,但没有 HTTPS、访问控制和统一日志。更稳妥的结构是:
访问者 -> HTTPS 443 -> VPS Caddy -> 127.0.0.1:8080 -> frps -> frpc -> NAS 127.0.0.1:5000
在内网设备的 /etc/frp/frpc.toml 末尾增加:
[[proxies]]
name = "nas-web"
type = "tcp"
localIP = "127.0.0.1"
localPort = 5000
remotePort = 8080
transport.bandwidthLimit = "20MB"
transport.bandwidthLimitMode = "server"
验证后重启客户端:
sudo -u frp /usr/local/bin/frpc verify -c /etc/frp/frpc.toml
sudo systemctl restart frpc
sudo journalctl -u frpc -n 50 --no-pager
在 VPS 上确认本机可以访问映射端口,但不要开放 8080 的 UFW 规则:
curl -I http://127.0.0.1:8080
sudo ufw status numbered
把 nas.example.com 的 A 记录指向 VPS,然后安装和配置 Caddy:
nas.example.com {
reverse_proxy 127.0.0.1:8080
}
开放 Web 端口:
sudo ufw allow 80/tcp comment 'HTTP for Caddy'
sudo ufw allow 443/tcp comment 'HTTPS for Caddy'
Caddy 的官方仓库安装、DNS、自动证书和日志配置可以参考站内的Caddy 反向代理教程。
这里的 HTTPS 只保护“访问者到 VPS”这一段;VPS 到内网服务的流量还经过 FRP 通道。FRP 从 v0.50.0 起默认启用 TLS 加密,但默认生成的证书并不会让 frpc 验证 frps 身份。对高敏感业务,应进一步配置自有 CA 和证书进行单向或双向校验,而不是仅依赖默认加密。
数据库、NAS 管理后台、远程桌面和家庭路由器后台不适合直接开放给全网。FRP 的 STCP 模式要求访问端也运行 frpc,VPS 不对公网监听业务端口。
被访问的内网设备增加:
[[proxies]]
name = "secret-nas-admin"
type = "stcp"
secretKey = "use-a-separate-random-secret"
localIP = "127.0.0.1"
localPort = 5000
访问者设备配置:
serverAddr = "203.0.113.10"
serverPort = 7000
auth.method = "token"
auth.tokenSource.type = "file"
auth.tokenSource.file.path = "/etc/frp/client_token"
[[visitors]]
name = "secret-nas-admin-visitor"
type = "stcp"
serverName = "secret-nas-admin"
secretKey = "use-a-separate-random-secret"
bindAddr = "127.0.0.1"
bindPort = 8500
示例中的 secretKey 必须替换为另一组随机密钥,不能和 frps Token 共用。访问者随后打开 http://127.0.0.1:8500。如果只有自己的少量设备需要访问,WireGuard 或 Tailscale 往往比维护 STCP visitor 更简单。
FRP Dashboard 会显示客户端、代理名称、连接和流量信息。官方配置默认监听 127.0.0.1,这是合理的安全边界。如果确实需要 Dashboard,可以在 frps.toml 中配置本机监听、独立随机密码,再通过 SSH 隧道访问;不要直接放行 7500/TCP。
SSH 隧道访问方式:
ssh -L 7500:127.0.0.1:7500 [email protected]
然后浏览器打开 http://127.0.0.1:7500。Prometheus 指标与 Dashboard 共用同一地址,因此启用监控也不能成为把管理端口暴露全网的理由。
FRP 是单个二进制文件,更新不复杂,但必须同时考虑配置兼容性和短暂断线。安全流程如下:
- 查看官方 Release Notes 和兼容策略;
- 备份当前二进制、TOML 与 Token;
- 下载对应架构的新版本并校验官方 SHA-256;
- 用新二进制执行
verify; - 先更新 frps,再逐台更新 frpc;
- 检查控制连接、所有代理和实际业务;
- 失败时恢复旧二进制并重启。
VPS 端备份:
backup_stamp=$(date +%Y%m%d-%H%M%S)
sudo install -d -m 700 "/root/frp-backup-${backup_stamp}"
sudo cp -a /usr/local/bin/frps /etc/frp \
"/root/frp-backup-${backup_stamp}/"
安装新二进制前先验证:
/tmp/new-frps verify -c /etc/frp/frps.toml
sudo cp /usr/local/bin/frps /usr/local/bin/frps.previous
sudo install -m 755 /tmp/new-frps /usr/local/bin/frps
sudo systemctl restart frps
sudo systemctl status frps --no-pager
sudo journalctl -u frps -n 100 --no-pager
如果启动失败:
sudo install -m 755 /usr/local/bin/frps.previous /usr/local/bin/frps
sudo systemctl restart frps
从 v0.69.0 起,官方给出了跨多个小版本的兼容支持窗口,但使用新 wire protocol 等功能时仍可能要求两端同时升级。长期维护时让 frps 和 frpc 保持相近版本,排障会更简单。
在内网设备测试 DNS、路由和端口:
ping -c 4 203.0.113.10
nc -vz 203.0.113.10 7000
sudo journalctl -u frpc -n 100 --no-pager
在 VPS 检查:
sudo systemctl status frps --no-pager
sudo ss -lntp | grep ':7000'
sudo ufw status numbered
sudo journalctl -u frps -n 100 --no-pager
如果本机监听正常但外部超时,通常是云安全组、UFW 或上游网络拦截。出现 connection refused 则更像进程未监听或绑定地址错误。
两端分别计算 Token 文件哈希,比较结果而不直接显示密钥:
sudo sha256sum /etc/frp/server_token
sudo sha256sum /etc/frp/client_token
服务端执行第一条,客户端执行第二条。哈希必须一致。修改 Token 后,先更新所有客户端文件,再在维护窗口重启 frps 和 frpc,避免部分客户端永久断线。
按三层检查:
- 内网设备本机能否访问
localIP:localPort; - VPS 是否监听
remotePort; - UFW 和云安全组是否允许正确的协议与来源。
curl -I http://127.0.0.1:5000
sudo ss -lntup | grep -E ':6000|:8080'
sudo journalctl -u frpc -n 100 --no-pager
sudo journalctl -u frps -n 100 --no-pager
还要确认 remotePort 位于 frps 的 allowPorts 范围内。端口不在白名单时,frpc 会注册失败,而不是自动绕过限制。
分别测试“用户到 VPS”和“VPS 到家庭宽带”的线路,不要只测 VPS 下载速度。重点观察:
- 家庭宽带上行是否成为瓶颈;
- VPS 是否晚高峰丢包或 CPU 被超售;
transport.bandwidthLimit是否限制过低;- 月流量是否已经触发服务商限速;
- TCP 套 TCP、远距离中继是否放大丢包影响。
FRP 支持 KCP 和 QUIC,但切换传输协议不是万能优化。它们需要额外开放 UDP,并可能增加 CPU、策略和排障成本。先用稳定的 TCP 基线确认瓶颈,再根据实测决定。
公网端口被扫描是正常现象,不代表攻击者已经登录。应确认:
- Dashboard 只监听
127.0.0.1; - SSH 映射只允许管理员来源 IP;
- NAS 和 Web 应用自身启用了强认证与多因素认证;
allowPorts没有放出大段无用端口;- Token 没有出现在 Git、Shell 历史、截图或日志中;
- UFW、云安全组和应用日志都有记录。
FRP 只负责转发,不会自动修复被转发服务本身的漏洞。把一个没有密码的 NAS 后台通过 FRP 暴露公网,风险与直接做端口映射没有本质区别。
- VPS 有独立公网 IP,服务商允许反向代理和计划中的流量规模;
frps与frpc都从官方 Release 下载并通过 SHA-256 校验;- 使用 TOML,不再复制已弃用的 INI 示例;
- frps 以独立的
frp用户运行,而不是 root; - Token 位于权限受控的文件中,未明文写进 Git;
transport.tls.force = true,并理解默认 TLS 不验证服务器身份;allowPorts和maxPortsPerClient已限制代理权限;7000/TCP、业务端口、UFW 与云安全组保持一致;- Dashboard 未开放公网;
- SSH、NAS、Web 应用仍保留自身认证和更新机制;
- 已测试重启后 frps/frpc 自动恢复;
- 已配置流量监控、超额告警,并完成一次配置备份和回滚演练。
必须有一台能被两端访问、通常带公网 IP 的服务器运行 frps。它可以是云服务器、VPS 或其他公网主机;对大多数个人用户,低配 VPS 是最容易长期维护的选择。
少量 SSH 和管理流量通常可以,但还要给系统更新、日志和监控留空间。大量连接和高速中继更看重带宽、流量与网络稳定性,不能只看内存。
普通 TCP、UDP、HTTP、HTTPS 和 STCP 代理通常会经过 VPS,因此可能计入 VPS 流量。XTCP 尝试点对点传输,但受 NAT 类型影响,不能保证成功。
不能简单互相替代。FRP 擅长把具体服务映射出去;WireGuard 擅长让授权设备进入私网。如果只有自己的设备访问家庭网络,WireGuard 通常更安全、更省配置。
不够。Token 验证的是 frpc,不会替被转发的 SSH、NAS 或 Web 服务做用户认证。仍要限制端口来源、启用 TLS、使用强密码或密钥,并及时更新应用。
Dashboard 包含客户端、代理和流量信息,也扩大了管理攻击面。监听 127.0.0.1 后通过 SSH 隧道查看,可以少开放一个公网管理入口。
FRP 部署成功的标准不是“frpc 显示 online”,而是公网入口、内网服务、认证、HTTPS、防火墙、流量告警和重启恢复都经过实际验证。先用一个低风险 SSH 或测试 Web 服务跑通完整链路,再逐步迁移 NAS、相册和其他长期业务。
