frp连接失败主因是版本、IP、端口、token四者未严格对齐:frps与frpc版本必须完全一致;server_addr须填公网IP而非域名;SSH穿透需type="tcp"且remote_port与local_port不可混淆;auth.token须字节级一致,建议用sha256sum校验。

frp 能用,但配置错一个字就彻底连不上——80% 的失败不是网络问题,而是版本、IP、端口或 token 四个点没对齐。
frps 和 frpc 版本必须完全一致
frp 不像多数工具能向下兼容。frps 是 v0.56.0,frpc 就必须也是 v0.56.0;哪怕只是 v0.56.0 和 v0.56.1,启动时不会报错,但日志里只显示 login to server failed: dial tcp x.x.x.x:7000,然后反复重连。这不是连接超时,是协议握手直接被拒绝。
实操建议:
- 从 GitHub releases 页面 下载同一版本的压缩包,解压后分别取
frps+frps.ini放服务端,frpc+frpc.ini放客户端 - 别用包管理器(如 apt/yum)装,官方不提供稳定源,容易混入旧版
- 验证方式:在两台机器上分别执行
./frps -v和./frpc -v,输出必须一字不差
serverAddr 必须填公网 IP,不能填域名
即使你绑了 frp.example.com 并做了 DNS 解析,frpc 启动时默认调用 getaddrinfo(),在 OpenWrt、树莓派旧系统或某些容器环境里极易失败,报错 lookup frp.example.com: no such host。这不是 DNS 设置问题,是 frpc 本身不走系统缓存,也不支持自动重试。
实操建议:
-
frpc.ini中写死server_addr = "203.123.45.67",别加http://或端口 - 如果 VPS IP 是动态的(比如家庭宽带做服务端),frp 原生不支持自动更新配置,得额外写脚本抓 IP + 替换
frpc.ini+kill -HUP进程,复杂度远超预期 - 云服务器 IP 固定的话,顺手在安全组放行
bind_port(默认 7000),否则 telnet 都不通,配再对也没用
SSH 穿透必须用 type = "tcp",remotePort 和 localPort 别搞反
很多人以为 type = "ssh" 是合法值,其实 frp 没这个类型,填了会静默忽略整个 proxy 段;还有人把 local_port 写成和 remote_port 一样(比如都写 60022),结果外网连 VPS 的 60022,流量根本到不了家里那台机器的 22 端口。
实操建议:
-
frpc.ini里加一段:
[ssh] type = tcp local_ip = 127.0.0.1 local_port = 22 remote_port = 60022
-
frps.ini中确保allow_ports = 60000-60999(或包含 60022) - 启动后,在外网执行
ssh -p 60022 user@203.123.45.67,不是连你家 IP - 别忘了检查家里服务器的 SSH 是否监听
0.0.0.0:22(而非仅127.0.0.1:22),否则 frpc 拿不到连接
auth.token 字节级一致,空格和换行都不能多
token 不匹配不会报明确错误,frpc 日志只会显示 connection refused,而 frps 日志几乎无记录。最坑的是:你复制粘贴时可能带了不可见字符,或者 Windows 编辑器保存了 BOM 头,Linux 上读出来就是乱码。
实操建议:
- 用
echo -n "your_token_here" | sha256sum在服务端和客户端分别算一次哈希,必须完全一致 - 编辑配置文件统一用
vim或nano,别用带格式的文本编辑器(如 VS Code 默认可能加 BOM) - token 建议全小写字母+数字,避开
+、=、空格等易出错字符
真正卡住人的从来不是“怎么配”,而是“哪一行悄悄错了”。四个硬性条件——版本、IP、端口、token——只要一个不对,frp 就拒绝握手,且不告诉你具体原因。盯着日志里的 login to server failed 反复改配置,不如先跑一遍这四条核对清单。











