Frp(fast reverse proxy)是一个开源的内网穿透工具:一台有公网 IP 的服务器跑 frps,内网机器跑 frpc,两者维持一条长连接,公网用户访问服务器端口时,流量经这条连接转发到内网服务。典型场景:在家里的机器上跑了个 Web 服务或 SSH,想从外面访问。
配置文件使用 TOML 格式(frps.toml / frpc.toml,v0.52+ 起 INI 格式已废弃)。
服务端 frps
公网服务器上解压 frp 发行包,编辑 frps.toml:
bindPort = 7000 # frpc 连接用的端口
auth.token = "一个足够长的随机密码" # 客户端必须填同一个值
webServer.addr = "0.0.0.0" # 内置监控面板
webServer.port = 7500
webServer.user = "admin"
webServer.password = "面板密码"
vhostHTTPPort = 8080 # HTTP 代理的入口端口,按需开启
用 systemd 托管,/etc/systemd/system/frps.service:
[Unit]
Description = frp server
After = network.target
[Service]
Type = simple
ExecStart = /opt/frp/frps -c /opt/frp/frps.toml
Restart = on-failure
RestartSec = 5
[Install]
WantedBy = multi-user.target
sudo systemctl enable --now frps
记得在云厂商的安全组里放行 7000(frpc 连接)、7500(面板)以及后续代理用到的端口——这是最常见的"连不上"原因。
客户端 frpc
内网机器上编辑 frpc.toml:
serverAddr = "服务器公网 IP"
serverPort = 7000
auth.token = "和服务端相同的密码"
# TCP 直转:把内网 22 端口映射到服务器的 6022
[[proxies]]
name = "ssh"
type = "tcp"
localIP = "127.0.0.1"
localPort = 22
remotePort = 6022
# HTTP 站点:走 vhostHTTPPort,用域名区分不同代理
[[proxies]]
name = "web"
type = "http"
localPort = 3000
customDomains = ["app.example.com"]
启动:
frpc -c frpc.toml
之后 ssh -p 6022 用户@服务器IP 就能连到内网机器,浏览器访问 http://app.example.com:8080 就能打开内网的 3000 端口。
Linux 客户端同样建议 systemd 托管(把上面 service 里的 frps 换成 frpc 即可);Windows 客户端可用 winget install fatedier.frp 安装,再用任务计划程序设置开机启动 frpc -c frpc.toml。
常见问题
- login to server failed: token in login doesn’t match token in configuration —— 两边
auth.token不一致,或客户端连到了别的 frps 实例。 - 端口不通 —— 先查服务端
frps.log里代理是否注册成功,再查云安全组和系统防火墙(ufw/firewalld)。 - HTTP 代理 404 ——
customDomains的域名必须解析到服务器 IP,且访问的是vhostHTTPPort而不是remotePort。 - 需要 HTTPS —— 在 frps 前面挂 nginx 做 TLS 终结,或使用 frp 的
https2http插件。