frp 用一台可从公网访问的服务器,把内网服务转发出来。frps 在公网服务器上运行,frpc 在内网机器上运行,两端配置不能写反。
这篇使用官方当前支持的 TOML 配置方式,以官方发行作为安装入口,不混用第三方一键脚本与旧 Docker 镜像。

说明图:frp:内网主动连公网,外部访问指定业务端口
下载与目录
从 frp 官方 Releases 选择与系统、CPU 架构匹配的包,两端尽量使用匹配版本。解压后保留需要的二进制和配置文件,不必在教程里固定一个很快过时的下载版本号。
先在前台运行,确认端口与鉴权正常,再按官方指南或当前系统的服务管理方式配置开机运行。服务目录、运行用户和配置文件权限也要一起规划,不要把配置中的 token 留给所有本机用户读取。
服务端 frps.toml
下面开放 7000 作为控制连接端口,只允许代理使用远端 8443。token 和面板密码都是必须替换的占位符。
bindPort = 7000
allowPorts = [{ single = 8443 }]
[auth]
method = "token"
token = "REPLACE_WITH_THE_SAME_LONG_RANDOM_TOKEN"
[transport.tls]
force = true
[webServer]
addr = "127.0.0.1"
port = 7500
user = "frp-admin"
password = "REPLACE_WITH_ANOTHER_LONG_RANDOM_PASSWORD"
填写 allowPorts 时注意数组括号完整闭合。控制端口、业务端口和管理面板各做一件事,不要把整个端口范围都开放出来。

说明图:三个端口,三种用途
客户端 frpc.toml
假设你确实需要把内网 192.168.100.20:443 的 HTTPS 服务暴露到服务器 8443:
serverAddr = "YOUR_PUBLIC_SERVER_IP"
serverPort = 7000
[auth]
method = "token"
token = "REPLACE_WITH_THE_SAME_LONG_RANDOM_TOKEN"
[transport.tls]
enable = true
[[proxies]]
name = "home-https"
type = "tcp"
localIP = "192.168.100.20"
localPort = 443
remotePort = 8443
把服务端地址、内网 IP 和 token 替换成真实值,并确认 frpc 所在机器可以直接访问这个内网服务。目标服务自己应有合适的 HTTPS 证书和认证;不要直接把路由器或 NAS 的无保护管理界面开放到公网。
frp 传输层的 TLS 加密的是两端之间的连接。它不会把目标服务的 HTTP 自动改成 HTTPS,也不替代业务账户认证。HTTPS 域名与证书仍需匹配实际使用方式。
启动与检查
服务端从对应目录启动:
./frps -c ./frps.toml
客户端先核对配置,再启动:
./frpc verify -c ./frpc.toml
./frpc -c ./frpc.toml
在服务端安全组和防火墙放行需要的 TCP 7000 与 8443,限制控制连接来源更好。7500 面板只监听回环地址,需要查看时用 SSH 转发,不要为了方便直接改成全网监听。
ssh -L 7500:127.0.0.1:7500 your-user@your-server
故障先分层
frpc 连不上,先查服务端地址、7000、防火墙与 token;登录成功但代理注册失败,查远端端口冲突和 allowPorts;代理正常但页面打不开,查内网服务本身、8443 与 HTTPS 域名/证书。每一层都看对应日志,不要同时乱改所有参数。