#1677·hysteria

SOCKS5 UDP 关联没有空闲超时 – 临时端口耗尽

作者: eidos-case创建于 2026年9月10日更新于 2026年9月10日

** 描述错误**

每个 SOCKS5 UDP 协会都绑定一个电平端口,用于中继插座和 在控制TCP连接关闭前保持. 没有闲置的暂停,所以 打开许多关联并保持控制连接的客户端—— 通向SOCKS桥的普通外形, 转发 DNS —— 每端接一端口 无限期的结社。

一旦麻黄范围被耗尽 损害是整个主机,而不是局部的 代理: 需要新套接字的任何进程失败, 而代理程序本身停止 接受连接时, 它的收听积压会增加 。

应用/内部/socks5/server.go',andleUDP ()'创建了新的网'。 听着,UDP ' 每个协会加一个QUIC会话和两个goroutines,然后等待 CloseErr = <-errChan ' ——即直到控制连接结束。 无截止日期 在该文件中的任何地方设置 :

grep -nE "SetDeadline QQSetReadline" "Timeout" idle-Idle" app/ Internal/socks5/ server.go 互联网档案馆的存檔,存档日期2013-12-02.
没有匹配

UdpServer ()'区块位于UdpCon.ReadFrom UDP (buf)',没有截止日期, 控制连接被“io.Copy(io)”排出。 弃之而去,相取而去',亦有而无. UDP 没有FIN 或 RST,所以只能知道协会由 控制连接关闭或被闲置的超时关闭 。 已存在。 客户没有义务关闭任何东西。

** 废除**

打开多个 SOCKS5 UDP 关联, 打开每个控制连接, 发送 中继端口数 。 测试完全正确 这一点已包含在链接的PR中:

测试 ./ 应用/ 内部/ socks5/ - 运行 TestUDP 协会

** 预期行为**

一个停止运输的协会在其港口释放了它的麻黄口 如tproxy'、tun'和`forward'已经这样做了,而不是等待 关闭,可能永远不会到来。

** 记录**

从上面的测试而不是部署,所以数字是 可再生产。 50个关联, 所有控制连接打开, 没有发送数据克 :

在修复之前
活时间:50人
闲置后保存: 50 (控制连接仍然打开)
FAIL: 所有闲置的协会必须释放它们的端口

修复后
活时间:50人
闲置后保存 : 0 of 50( 控制连接仍然打开)
辅助系统

每次运行的第一行是控制:没有它,即使测试会通过 `UDP Associate ' 从未捆绑过任何东西。 唯一的区别 两个运行是闲置期限是否被刷新。

两个伴奏测试覆盖了边界:

  • 试验协会 IdleTimeout " -- -- 一个闲置协会释放其港口; 它的 " 单独联系必须释放其麻黄口 " 未能成功。
  • " TestUDP AssociationSurvivesTraffic " -- -- 一个协会 * 载运 * 交通不是 拆下,所以固定不能被误认为是硬的终身盖.

** 设备和操作系统**

Linux x86 64, app/v2.12.2'. master' 是该标记前面的两个承诺; 其中之一 他们,1676号,触摸 . . . . . . .

内容来源: apernet/hysteria