[GH-ISSUE #3497] xtcp的双向打洞尝试 #2795

Closed
opened 2026-05-05 13:48:19 -06:00 by gitea-mirror · 20 comments
Owner

Originally created by @chendx-github on GitHub (Jun 26, 2023).
Original GitHub issue: https://github.com/fatedier/frp/issues/3497

Describe the feature request

如果有A,B两个客户端通过S服务器打洞,如果A -> B方向打洞不能成功,希望可以 从 B -> A方向尝试打洞 然后进行数据连接,而不是A -> B方向打洞失败之后就认为失败了。

Describe alternatives you've considered

No response

Affected area

  • Docs
  • Installation
  • Performance and Scalability
  • Security
  • User Experience
  • Test and Release
  • Developer Infrastructure
  • Client Plugin
  • Server Plugin
  • Extensions
  • Others
Originally created by @chendx-github on GitHub (Jun 26, 2023). Original GitHub issue: https://github.com/fatedier/frp/issues/3497 ### Describe the feature request 如果有A,B两个客户端通过S服务器打洞,如果A -> B方向打洞不能成功,希望可以 从 B -> A方向尝试打洞 然后进行数据连接,而不是A -> B方向打洞失败之后就认为失败了。 ### Describe alternatives you've considered _No response_ ### Affected area - [ ] Docs - [ ] Installation - [ ] Performance and Scalability - [ ] Security - [X] User Experience - [X] Test and Release - [ ] Developer Infrastructure - [X] Client Plugin - [X] Server Plugin - [ ] Extensions - [ ] Others
Author
Owner

@fatedier commented on GitHub (Jun 26, 2023):

你可以直接提供 xtcp 失败的日志和环境来分析原因。

<!-- gh-comment-id:1606972242 --> @fatedier commented on GitHub (Jun 26, 2023): 你可以直接提供 xtcp 失败的日志和环境来分析原因。
Author
Owner

@chendx-github commented on GitHub (Jul 10, 2023):

当前版本的打洞成功率太低了,我自己使用工具打洞是能打通的,但是frp的xtcp不行下面是log 总是报超时 实际上就是没通
我看log端口和地址都是获取的正常的,quic 和 kdp 我都试过了 同样的问题
2023/07/10 13:56:18 [I] [xtcp.go:70] [be9b15ae07cf35f3] [xtcp_3389_l] nathole prepare success, nat type: EasyNAT, behavior: BehaviorNoChange, addresses: [*.36:5250 :5250], assistedAddresses: [192.168.0.107:59900 192.168.138.1:59900]
2023/07/10 13:56:18 [I] [xtcp.go:91] [be9b15ae07cf35f3] [xtcp_3389_l] get natHoleRespMsg, sid [16889685777758f62ffe5c184c], protocol [kcp], candidate address [
:49181], assisted address [10.20.178.3:49181 192.168.23.1:49181 10.20.178.1:49181], detectBehavior: {Role:receiver Mode:0 TTL:7 SendDelayMs:0 ReadTimeoutMs:5000 CandidatePorts:[] SendRandomPorts:0 ListenRandomPorts:0}
2023/07/10 13:56:23 [W] [xtcp.go:99] [be9b15ae07cf35f3] [xtcp_3389_l] make hole error: wait detect message error: read udp4 0.0.0.0:59900: i/o timeout

<!-- gh-comment-id:1628291966 --> @chendx-github commented on GitHub (Jul 10, 2023): 当前版本的打洞成功率太低了,我自己使用工具打洞是能打通的,但是frp的xtcp不行下面是log 总是报超时 实际上就是没通 我看log端口和地址都是获取的正常的,quic 和 kdp 我都试过了 同样的问题 2023/07/10 13:56:18 [I] [xtcp.go:70] [be9b15ae07cf35f3] [xtcp_3389_l] nathole prepare success, nat type: EasyNAT, behavior: BehaviorNoChange, addresses: [*.36:5250 *:5250], assistedAddresses: [192.168.0.107:59900 192.168.138.1:59900] 2023/07/10 13:56:18 [I] [xtcp.go:91] [be9b15ae07cf35f3] [xtcp_3389_l] get natHoleRespMsg, sid [16889685777758f62ffe5c184c], protocol [kcp], candidate address [*:49181], assisted address [10.20.178.3:49181 192.168.23.1:49181 10.20.178.1:49181], detectBehavior: {Role:receiver Mode:0 TTL:7 SendDelayMs:0 ReadTimeoutMs:5000 CandidatePorts:[] SendRandomPorts:0 ListenRandomPorts:0} 2023/07/10 13:56:23 [W] [xtcp.go:99] [be9b15ae07cf35f3] [xtcp_3389_l] make hole error: wait detect message error: read udp4 0.0.0.0:59900: i/o timeout
Author
Owner

@fatedier commented on GitHub (Jul 10, 2023):

你可以配置 keep_tunnel_open = true 过一段时间再观察状态。

或者多连接几次测试看看,排查这种问题需要各端详细的日志,你提供的部分日志不能完全看出问题。

<!-- gh-comment-id:1628306362 --> @fatedier commented on GitHub (Jul 10, 2023): 你可以配置 `keep_tunnel_open = true` 过一段时间再观察状态。 或者多连接几次测试看看,排查这种问题需要各端详细的日志,你提供的部分日志不能完全看出问题。
Author
Owner

@chendx-github commented on GitHub (Jul 10, 2023):

我已经测试好几天了

<!-- gh-comment-id:1628306750 --> @chendx-github commented on GitHub (Jul 10, 2023): 我已经测试好几天了
Author
Owner

@chendx-github commented on GitHub (Jul 10, 2023):

你需要那些log 我可以尝试提供

<!-- gh-comment-id:1628307984 --> @chendx-github commented on GitHub (Jul 10, 2023): 你需要那些log 我可以尝试提供
Author
Owner

@fatedier commented on GitHub (Jul 10, 2023):

每个人环境都不一样,如果实在不行,那就只能在代码中添加日志尝试定位了

<!-- gh-comment-id:1628308148 --> @fatedier commented on GitHub (Jul 10, 2023): 每个人环境都不一样,如果实在不行,那就只能在代码中添加日志尝试定位了
Author
Owner

@chendx-github commented on GitHub (Jul 10, 2023):

我不知道该在那些地方添加日志

<!-- gh-comment-id:1628311070 --> @chendx-github commented on GitHub (Jul 10, 2023): 我不知道该在那些地方添加日志
Author
Owner

@fatedier commented on GitHub (Jul 10, 2023):

你可以配置 keep_tunnel_open = true 过一段时间再观察状态。

或者多连接几次测试看看,排查这种问题需要各端详细的日志,你提供的部分日志不能完全看出问题。

那你就按照这个方法配置之后,过一天,然后搜集所有的日志。

<!-- gh-comment-id:1628317452 --> @fatedier commented on GitHub (Jul 10, 2023): > 你可以配置 `keep_tunnel_open = true` 过一段时间再观察状态。 > > 或者多连接几次测试看看,排查这种问题需要各端详细的日志,你提供的部分日志不能完全看出问题。 那你就按照这个方法配置之后,过一天,然后搜集所有的日志。
Author
Owner

@chendx-github commented on GitHub (Jul 10, 2023):

我测试了很长时间,全部都是我发的那个log的重复

<!-- gh-comment-id:1628320838 --> @chendx-github commented on GitHub (Jul 10, 2023): 我测试了很长时间,全部都是我发的那个log的重复
Author
Owner

@fatedier commented on GitHub (Jul 10, 2023):

如果可以的话,就按照我说的配置和采集和贴出所有的日志,不行的话,那我也没办法了

<!-- gh-comment-id:1628326090 --> @fatedier commented on GitHub (Jul 10, 2023): 如果可以的话,就按照我说的配置和采集和贴出所有的日志,不行的话,那我也没办法了
Author
Owner

@chendx-github commented on GitHub (Jul 10, 2023):

我有一个猜想,我的网络环境存在防火墙,会不会是 stun的服务返回的数据暴露了打洞的意图然后被防火墙给拦截了,在以前版本中应该是自己定义的 nat服务器,所以没有特征,就可以打洞成功.而现在由于使用了stun服务器数据是没有被加密的所以就获取到了双方的打洞ip和端口

<!-- gh-comment-id:1628327875 --> @chendx-github commented on GitHub (Jul 10, 2023): 我有一个猜想,我的网络环境存在防火墙,会不会是 stun的服务返回的数据暴露了打洞的意图然后被防火墙给拦截了,在以前版本中应该是自己定义的 nat服务器,所以没有特征,就可以打洞成功.而现在由于使用了stun服务器数据是没有被加密的所以就获取到了双方的打洞ip和端口
Author
Owner

@fatedier commented on GitHub (Jul 10, 2023):

有很多种可能性,这个问题通常比较复杂,你这种 EasyNAT 属于易于打通的环境,在开发阶段基本上是不存在问题的。但是这个也要看两端的情况。

你的猜测也是有可能的,或者还有其他的原因,提供长时间的完整的日志有可能能有帮助,但也不一定。因为复杂的情况一般还需要通过抓底层的数据包来结合判断。

<!-- gh-comment-id:1628340215 --> @fatedier commented on GitHub (Jul 10, 2023): 有很多种可能性,这个问题通常比较复杂,你这种 EasyNAT 属于易于打通的环境,在开发阶段基本上是不存在问题的。但是这个也要看两端的情况。 你的猜测也是有可能的,或者还有其他的原因,提供长时间的完整的日志有可能能有帮助,但也不一定。因为复杂的情况一般还需要通过抓底层的数据包来结合判断。
Author
Owner

@fatedier commented on GitHub (Jul 10, 2023):

也可以换个国内的 stun server 试试,比如 stun.qq.com:3478

<!-- gh-comment-id:1628350199 --> @fatedier commented on GitHub (Jul 10, 2023): 也可以换个国内的 stun server 试试,比如 `stun.qq.com:3478`
Author
Owner

@chendx-github commented on GitHub (Jul 10, 2023):

我刚刚试了 还是一样的问题,可以提供一下打洞的流程吗, 我自己使用串口工具是可以打通的,我看看是不是打洞流程的问题,go语言的代码我不熟悉,看着比较费劲

<!-- gh-comment-id:1628358695 --> @chendx-github commented on GitHub (Jul 10, 2023): 我刚刚试了 还是一样的问题,可以提供一下打洞的流程吗, 我自己使用串口工具是可以打通的,我看看是不是打洞流程的问题,go语言的代码我不熟悉,看着比较费劲
Author
Owner

@chendx-github commented on GitHub (Jul 10, 2023):

现在 B 往A 方向打通了,但是A往B方向打洞不通, 这个就是我说的那个双向打洞的问题,也叫反向打洞,意思是 A 不能到达B,但是B可以到达A这个时候可以用 B 往A打洞的方式来使线路联通,将流程调转一下。这样说能明白部

<!-- gh-comment-id:1628438331 --> @chendx-github commented on GitHub (Jul 10, 2023): 现在 B 往A 方向打通了,但是A往B方向打洞不通, 这个就是我说的那个双向打洞的问题,也叫反向打洞,意思是 A 不能到达B,但是B可以到达A这个时候可以用 B 往A打洞的方式来使线路联通,将流程调转一下。这样说能明白部
Author
Owner

@fatedier commented on GitHub (Jul 10, 2023):

你可以配置 keep_tunnel_open = true 过一段时间再观察状态。
或者多连接几次测试看看

那你就按照这个流程操作一下再测试看看

<!-- gh-comment-id:1628445731 --> @fatedier commented on GitHub (Jul 10, 2023): > 你可以配置 keep_tunnel_open = true 过一段时间再观察状态。 > 或者多连接几次测试看看 那你就按照这个流程操作一下再测试看看
Author
Owner

@chendx-github commented on GitHub (Jul 10, 2023):

我刚刚说的那个问题是FRP从诞生以来就存在的,我现在使用套一层 frp 来实现的反向链接这个是原理图
image

<!-- gh-comment-id:1628470079 --> @chendx-github commented on GitHub (Jul 10, 2023): 我刚刚说的那个问题是FRP从诞生以来就存在的,我现在使用套一层 frp 来实现的反向链接这个是原理图 ![image](https://github.com/fatedier/frp/assets/55473491/801c6773-173a-49ed-bef1-95446c4212b2)
Author
Owner

@chendx-github commented on GitHub (Jul 12, 2023):

最后A 连接 B的xtcp也通了,虽然通了但是我觉得这个问题依然存在 可能只是我一直尝试打洞 某些情况下达到了A联通B的条件所以通了的。后续再观察一下

<!-- gh-comment-id:1631700646 --> @chendx-github commented on GitHub (Jul 12, 2023): 最后A 连接 B的xtcp也通了,虽然通了但是我觉得这个问题依然存在 可能只是我一直尝试打洞 某些情况下达到了A联通B的条件所以通了的。后续再观察一下
Author
Owner

@kktt007 commented on GitHub (Nov 19, 2023):

也可以换个国内的 stun server 试试,比如 stun.qq.com:3478

好奇这个和使用默认的有什么区别吗,我经常失败,偶尔成功,是因为服务器的原因吗

今天尝试搭建,感觉不错,后续可以弃用 lanproxy 了,感谢作者

<!-- gh-comment-id:1817864901 --> @kktt007 commented on GitHub (Nov 19, 2023): > 也可以换个国内的 stun server 试试,比如 `stun.qq.com:3478` 好奇这个和使用默认的有什么区别吗,我经常失败,偶尔成功,是因为服务器的原因吗 今天尝试搭建,感觉不错,后续可以弃用 lanproxy 了,感谢作者
Author
Owner

@XuruiPro commented on GitHub (Dec 30, 2024):

感觉frp打洞成功率没有nps大,写的nat type: EasyNAT就是不成功

<!-- gh-comment-id:2564971234 --> @XuruiPro commented on GitHub (Dec 30, 2024): 感觉frp打洞成功率没有nps大,写的nat type: EasyNAT就是不成功
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: github-starred/frp#2795
No description provided.