家里的服务器、办公室电脑或 NAS 通常只能在局域网里访问。需要远程预览一个网站、接收 Webhook,或者连接内网设备的 SSH 时,可以用 frp 在公网服务器和内网设备之间建立转发通道。
本文从设备准备开始,以一个运行在内网 8080 端口的 Web 服务为例,完成安装、配置、测试与长期运行。主流程使用 Linux,另外补充 Windows 和 macOS 的客户端启动方式。
frp 的工作流程
frp 分为两个程序:frps 运行在公网服务器上,负责接收连接和转发流量;frpc 运行在内网,主动连接 frps,再将收到的请求转交给内网应用。
1 | 公网访问者 |
内网没有公网 IP、路由器没有端口映射权限,都不妨碍这个基本流程。前提是内网设备能够向外连接公网服务器,且公网服务器的相关端口可达。frp 官方安装与部署说明
需要准备哪些设备
| 设备或条件 | 是否必需 | 用途与要求 |
|---|---|---|
| 一台有公网 IP 的服务器 | 必需 | 运行 frps,能够管理端口和防火墙;通常使用云服务器或 VPS |
| 一台能持续联网的内网设备 | 必需 | 运行 frpc,可以是电脑、Linux 主机、NAS 或支持对应程序的设备 |
| 内网应用 | 必需 | 已经可以从 frpc 所在环境访问,如 Web 服务、SSH 服务 |
| 外网测试设备 | 建议 | 手机关闭 Wi-Fi 后用移动网络验证实际公网访问 |
| 域名 | 可选 | 直接用公网 IP 和端口测试时不需要;通过常规域名证书提供 HTTPS 时使用 |
| 家用路由器公网 IP | 不需要 | 内网客户端主动向外连接,无需做家用路由器端口映射 |
frpc 不一定要和应用装在同一台设备上。例如 frpc 在一台 Linux 主机上,应用在局域网另一台 NAS 上,只要前者能访问后者的 IP 和端口即可。
硬件配置取决于连接数、吞吐量和应用负载。小规模测试可以从已有的轻量主机开始;实际体验往往更受公网服务器带宽、内网上传带宽和两端线路影响。内网设备休眠、断电或失去网络,转发也会中断。
本文使用的端口
| 参数 | 示例值 | 属于哪台设备 |
|---|---|---|
serverAddr |
frp.example.com |
指向公网服务器的 DNS 记录,可直接改成公网 IP |
bindPort / serverPort |
7000 |
公网服务器接收内网客户端连接 |
localPort |
8080 |
内网 Web 应用的监听端口 |
remotePort |
18080 |
公网服务器上给访问者使用的转发端口 |
7000 是 frp 连接入口,浏览器访问的是 18080,这两个端口的作用不同。域名、路径和 token 都是示例,应替换为实际环境的值。
第一步:确认内网服务可以访问
在准备运行 frpc 的设备上执行:
1 | curl -i http://127.0.0.1:8080/ |
响应正常后再继续。如果应用在另一台设备上,例如 192.168.1.20,应改为检查:
1 | curl -i http://192.168.1.20:8080/ |
如果还没有测试应用,且机器已经安装 Python 3,可以在一个没有私密文件的空目录中临时启动静态服务:
1 | mkdir -p frp-demo |
测试时保留这个终端。该服务仅用于验证转发,不作为生产 Web 服务;目录中的文件可能被访问者读取。
第二步:下载并安装 frp
从 frp 官方 Releases 下载程序。下面固定使用 v0.68.0 演示安装,两端使用相同版本,方便复现配置;它不代表任何时候的最新版本。
选择操作系统和 CPU 架构
Linux 和 macOS 可用下面命令查看环境:
1 | uname -s |
| 环境 | 发行包标识 |
|---|---|
Linux,x86_64 |
linux_amd64 |
Linux,aarch64 / ARM64 |
linux_arm64 |
| Intel Mac | darwin_amd64 |
| Apple Silicon Mac | darwin_arm64 |
| Windows x64 | windows_amd64 |
NAS、路由器和其他架构应单独确认系统兼容性。下载预编译程序不需要额外安装 Go 开发环境。
公网服务器安装
以下命令适用于 Linux x86_64,需要已有 curl 和 tar。ARM64 服务器将 FRP_PLATFORM 改为 linux_arm64:
1 | FRP_VERSION="0.68.0" |
内网客户端安装
在内网 Linux 设备上按自身架构执行同样的下载与解压步骤,然后在解压目录安装客户端:
1 | ./frpc --version |
macOS 下载对应的 darwin 包,解压后可以直接运行 ./frpc;Windows 解压对应的 ZIP 包,在 PowerShell 中使用 .\frpc.exe。后文的 /etc/frp/frpc.toml 是 Linux 路径,其他系统可把配置放在解压目录中。
第三步:配置公网服务器 frps
先生成一个随机 token,用作两端连接认证:
1 | openssl rand -hex 32 |
将生成的值保存在自己的配置中,两端必须一致。frp token 验证的是客户端接入身份,不会给公网 Web 应用自动增加登录认证。frp 认证机制
在公网服务器上创建 /etc/frp/frps.toml:
1 | bindAddr = "0.0.0.0" |
这份配置允许客户端申请 18080 作为公网转发端口。allowPorts 只是 frp 的端口许可清单,不会自动修改云安全组或系统防火墙。frps 配置参考
测试阶段,应在安全组和防火墙中允许 TCP 7000 与 TCP 18080:前者供内网客户端连接,后者供外部测试者访问。能固定来源地址时按来源放行;不要因此清空防火墙规则。
检查配置,再前台运行:
1 | frps verify -c /etc/frp/frps.toml |
保留该终端,接下来配置内网客户端。
第四步:配置内网客户端 frpc
在内网 Linux 设备上创建 /etc/frp/frpc.toml:
1 | serverAddr = "frp.example.com" |
替换 serverAddr 和 token。如果应用在另一台局域网设备上,把 localIP 改成那台设备的地址,例如 192.168.1.20。
frp.example.com 需要直接解析到服务器。若 DNS 使用 Cloudflare,此记录应选择 DNS only;普通橙云 HTTP 代理不能直接承载这里 TCP 7000 上的 frp 连接。
Linux 检查并启动:
1 | frpc verify -c /etc/frp/frpc.toml |
macOS 在解压目录中执行:
1 | ./frpc verify -c ./frpc.toml |
Windows 在解压目录的 PowerShell 中执行:
1 | .\frpc.exe verify -c .\frpc.toml |
代理名称需要避免冲突。本文使用 TOML 的 [[proxies]] 写法,不能混用旧 INI 教程中的 [common] 和 server_addr 等字段。frp 配置格式与 verify 命令
第五步:验证公网访问
确认服务端和客户端日志没有认证、连接或代理启动错误,再用外网设备访问:
1 | http://公网服务器IP:18080/ |
也可以在外网设备执行,使用真实公网 IP 替换占位符:
1 | curl -i http://YOUR_SERVER_IP:18080/ |
能看到内网应用的响应,就说明基本穿透链路已经打通。这个测试入口使用 HTTP,不应用来传输密码或其他敏感业务数据;正式 Web 访问可继续配置下面的 HTTPS 入口。
两端配置中开启的 TLS 保护 frpc 与 frps 之间的连接,不会自动给浏览器入口提供 HTTPS。隧道需要验证服务器身份时,还应配置证书、受信任 CA 和服务名校验,不能只依赖 TLS 开关。frp TLS 配置说明
第六步:Linux 后台运行与开机自启
下面适用于使用 systemd 的 Linux,例如常见 Debian、Ubuntu 服务器。先结束前台运行的对应进程,避免新服务启动时端口被占用。
创建运行用户
在两台 Linux 设备上分别创建专用用户;若已经存在 frp 用户,无需重复创建:
1 | sudo useradd --system --user-group --no-create-home --shell /usr/sbin/nologin frp |
公网服务器设置配置权限:
1 | sudo chown root:frp /etc/frp/frps.toml |
内网设备设置客户端配置权限:
1 | sudo chown root:frp /etc/frp/frpc.toml |
公网服务器服务文件
创建 /etc/systemd/system/frps.service:
1 | [Unit] |
启动并设置开机自启:
1 | sudo systemctl daemon-reload |
内网客户端服务文件
创建 /etc/systemd/system/frpc.service:
1 | [Unit] |
启动并设置开机自启:
1 | sudo systemctl daemon-reload |
分别查看对应设备的日志:
1 | sudo journalctl -u frps -n 100 --no-pager |
修改 TOML 后先执行 verify,再重启对应服务;修改 .service 文件时还需执行 daemon-reload。systemd 使用方式见 frp 官方说明。
Windows 可使用任务计划程序配置开机运行,并填写程序、配置文件的绝对路径与工作目录;macOS 可使用 launchd。上述 systemd 文件不能直接用于这两个系统。
可选:域名与 HTTPS 访问
已有公网 Web 服务转发后,可以在公网服务器上部署 Nginx,让用户通过 https://app.example.com 访问。需要准备域名、对应 DNS 记录、有效证书以及 Nginx;证书获取和续期应由现有证书管理方案负责。
将转发端口改为本机可见
在 frps.toml 中把原有字段改成:
1 | proxyBindAddr = "127.0.0.1" |
验证并重启 frps 后,公网服务器上的 Nginx 仍可访问 127.0.0.1:18080,外部访问者不再直接连接 18080。安全组应允许 HTTPS 入口 TCP 443,同时移除之前测试用的公网 18080 放行规则。
这个设置对该 frps 的代理监听地址生效,不是只影响某一条 Web 代理。若同一实例还承担需要公网直连的其他端口,应单独规划监听方式或拆分实例。
配置 Nginx
将 app.example.com 解析到服务器,在 Nginx 的 HTTP 配置中加入:
1 | server { |
证书路径必须存在且能被 Nginx 读取,不能直接保留示例路径。检查配置后重载:
1 | sudo nginx -t |
这份配置面向普通 HTTP 应用。WebSocket 还需要配置升级请求头;AI 聊天等 SSE 接口需要检查代理缓冲和超时。相关指令见 Nginx 代理模块文档。
可选:转发 SSH
本节基于前面 proxyBindAddr = "0.0.0.0" 的公网端口方案。若已经改为回环地址,仅增加规则不会让 SSH 端口对公网开放。
先确认内网设备已经运行 SSH 服务,并在 frps.toml 的原有 allowPorts 中增加端口,不要重复定义整个字段:
1 | allowPorts = [ |
然后在 frpc.toml 末尾追加代理:
1 | [[proxies]] |
验证并重启两端服务,按访问来源放行服务器 TCP 6000,即可连接:
1 | ssh -p 6000 your_user@YOUR_SERVER_IP |
这里的 your_user 是内网机器的 SSH 账号。使用密钥认证并核对主机指纹;仅供本人或小团队访问的服务,也可以使用需要访问端参与的 STCP。frp SSH 示例、STCP 使用说明
常见问题与排查顺序
| 现象 | 优先检查 |
|---|---|
frpc 连接超时 |
公网 IP、DNS、7000 端口、安全组、系统防火墙以及内网出站策略 |
| token 认证失败 | 两端值是否完全一致,是否仍保留占位文本,是否加载了正确的配置文件 |
port already used |
转发端口是否被其他程序占用,是否重复启动了前台进程和系统服务 |
| 端口不被允许 | remotePort 是否包含在服务端的 allowPorts 中 |
proxy name ... already in use |
多个客户端是否使用了相同代理名称 |
| 客户端在线,但 Web 访问失败 | 应用是否启动,localIP 和 localPort 是否正确 |
| 服务器本机可以访问,外网不行 | 代理是否只监听回环地址,入口端口和防火墙是否一致 |
| Docker 中的 frpc 访问不到应用 | 127.0.0.1 是否错误地指向 frpc 容器本身 |
| 重启后不工作 | 二进制与配置的绝对路径、文件权限、服务是否启用和设备是否联网 |
| 登录后跳转到 localhost | 应用外部 URL、可信代理与 HTTPS 识别配置 |
Docker 场景中,同一自定义网络里的容器可以使用服务名通信;访问宿主机时使用当前平台支持的宿主机地址。宿主机应用若只监听回环地址,容器不一定能够访问,不能仅替换一个主机名就认为网络已经连通。
排查时按顺序验证每一段:
- 在内网客户端环境中用
curl检查应用。 - 查看
frpc是否成功连接和注册代理。 - 在公网服务器用
ss -lntp检查端口,再访问本机转发入口。 - 从外网设备访问公网 IP 和端口。
- 最后检查域名、HTTPS 证书和反向代理。
1 | ss -lntp |
长期运行时,把 token 配置排除在 Git 仓库之外,并使用应用自身的登录和权限控制。临时分享结束后,删除不再需要的代理规则,或停止相应服务并收回端口放行。