frps和frpc必须版本严格一致,否则因协议不兼容导致握手失败、反复重连或报invalid version错误;同时需确保bind_port(默认7000)在云安全组与本地防火墙均开放,且frpc中serveraddr必须填公网ip而非域名,server_port与frps的bind_port值完全一致,auth.token须字节级相同。

frps 和 frpc 必须版本严格一致,否则连接会直接失败——这是最常被忽略、却导致 80% 初次部署卡住的硬性条件。
确认服务端公网可达且端口开放
很多“连不上”的问题根本不在 frp 配置,而在网络层。你得先验证服务端的 bindPort(默认 7000)是否真能从外网访问:
- 在云服务商控制台检查安全组:必须放行
7000(或你自定义的bindPort),不是22或80 - 在服务端本地执行
ss -tuln | grep :7000,确认frps进程确实在监听0.0.0.0:7000,而非127.0.0.1:7000 - 用手机流量或朋友电脑执行
telnet your-vps-ip 7000;如果超时,说明防火墙/安全组/ISP 封禁了该端口,此时调任何frpc.toml都无效
frpc.toml 中的 serverAddr 必须填公网 IP,不能填域名
即使你已配好 DNS,frpc 启动时默认不走系统 DNS 缓存,尤其在某些嵌入式 Linux(如 OpenWrt、旧版树莓派系统)上,getaddrinfo 可能失败或返回空。填域名大概率报错 lookup your-domain.com: no such host。
- 务必使用
serverAddr = "123.45.67.89"这类纯 IP 格式 - 如果 VPS IP 是动态的(比如家庭宽带做服务端),那必须换方案——
frp本身不支持动态 DNS 自刷新,得靠脚本定期更新配置并 reload,复杂度陡增 -
serverPort必须与frps.toml中的bindPort完全一致,包括类型(int)和值
SSH 穿透必须用 tcp 类型,且 remotePort 不能被占用
想通过公网服务器的某个端口(比如 60022)SSH 连回家里的 Linux,关键不是改 frpc 的本地端口,而是正确声明 remotePort 和 localPort:
- 在
frpc.toml中新增一个[[proxies]]段,type = "tcp"(不是"ssh",frp 没这个 type) -
remotePort = 60022:这是你在公网 VPS 上对外暴露的端口,必须落在frps.toml的allowPorts范围内(如[{start=60000,end=60999}]) -
localPort = 22:这是你家里服务器上真正运行 SSH 的端口,别写成60022——那是混淆了内外端口 - 启动后,在外网执行
ssh -p 60022 user@your-vps-ip,流量才经由 frp 隧道抵达你家里的192.168.x.x:22
auth.token 不匹配是静默失败,日志里只显示 connection refused
frps 和 frpc 的 auth.token 值必须字节级完全一致,大小写、空格、特殊字符都不能差。一旦不匹配,frpc 日志只会显示类似 login to server failed: dial tcp x.x.x.x:7000: connect: connection refused,看起来像网络不通,实则是认证拒绝。
- 检查方式:在服务端执行
grep token /usr/local/frp/frps.toml,客户端执行grep token /usr/local/frp/frpc.toml,用diff对比输出 - 不要用中文引号、全角符号粘贴 token;建议生成时用
openssl rand -base64 16直接产出安全字符串 - 如果改过 token,记得重启
frps(systemctl restart frps),否则新配置不生效











