先抛出问题表象:
[W] [service.go:104] login to server failed: EOF
EOF
先说结论
防火墙应该是探测到了某些特征流量而触发了规则,导致frp认证的包被重置,于是服务端frp关闭了链接,而翻开源码,我们能看到再发送完认证信息后执行了ReadMsgInto方法,因为连接已经关闭,所以我们就得到了EOF错误!
回头再看wireshark的RST包之前的三个IRC包,等等,IRC是什么鬼?在FRP源代码中根本搜不到这个关键字啊!从源代码的登录逻辑来看,基本都是TCP的操作。于是再试着抓一次包,IRC又变回了TCP,看来wireshark也有误报的情况发生。
究其原因,很有可能是这一段明文数据暴露了frp,然后导致被防火墙封杀。
那么如何解决login to server failed: EOF的问题呢?
其实看了源代码就知道了,原来frp在v0.25.0版本后增加了一个客户端选项,支持了tls传输,也就是传说中的非对称加密,原来在frps初始化服务时,在内存中已经为我们生成了一个简易的TLS服务,简直完美!
解决方案
其实解决该问题很简单,在服务端和客户端原来的[common]配置中加入tls_enable = true即可!
注意:服务端和客户端都要配置!
另一种解决办法
还有一种解决办法,但是不一定能行,而且可能会带来一些问题!
既然防火墙检测了我的tcp,那我换成udp行不行?
frp支持使用kcp作为底层的通讯协议,而kcp默认就是基于udp协议,废话不多说,赶紧试一试!
步骤(假设kcp的端口为7000):
在服务端原来的[common]配置中加入kcp_bind_port = 7000,使其支持udp
在客户端原来的[common]处加入protocol = kcp即可,注意端口一定要对上!
评论区