侧边栏壁纸
博主头像
沙漠渔

把過去的累積,善用到當下

  • 累计撰写 489 篇文章
  • 累计创建 295 个标签
  • 累计收到 960 条评论
标签搜索

目 录CONTENT

文章目录

[内网穿透]FRP异常阻断,出现EOF问题

沙漠渔
2022-05-09 / 0 评论 / 0 点赞 / 1,231 阅读 / 816 字 / 正在检测是否收录...
温馨提示:
本文最后更新于 2022-05-09,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

先抛出问题表象:

[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即可,注意端口一定要对上!

0
广告 广告

评论区