Skip to content

VNT 2.0.9 UDP 打洞会把路由器 conntrack 撑满,能否限制打洞规模? #200

Description

@CRISKAKA78

在两台路由器上用 2.0.9 遇到了这个问题:开启自动打洞后,连接跟踪表很快被大量 UDP 条目占满,连原有网络也会受影响。希望能保留 IPv4 UDP 直连,但把打洞的连接数量控制住。

环境是官方 VNT 2.0.9 / VNTS 2.0.6,TUN 三层。两端分别为 MIPSel / Linux 4.4.198 和 ARMv7 / Linux 3.14.77,其中一端走 5G 蜂窝网络。VNT 由自己的管理程序启动,使用官方未修改的二进制。两台的 conntrack 上限都是 16384。

实测过程:

  • 原配置为 no_punch = false,没有设置 punch_model。启动前两端连接表大约只有 100~160 条。
  • 保持一端运行,重新启动另一端 VNT,约 9 秒后两端都达到 16384/16384。大量条目是发往对端公网地址的 UDP / UNREPLIED,源端口和目标端口都在变化,同时出现 SSH 超时和原有 IPsec 路径连续 ping 不通。
  • 停止打洞后连接数回落。随后两端都改为 no_punch = true 做中转对照,运行约 3 分 45 秒,连接数分别在 31~91、127~158 之间,虚拟 IP 双向 ping 各 10/10。管理链路仍有零星丢包,但没有再次把连接表撑满。这个对照时间比较短,还不算长稳测试。

测试期间没有调整 conntrack 上限、超时或防火墙,也没有清空连接表。VNT 没有接管 IPv4 默认路由。

顺着 2.0.9 对应的源码看了一下,VNT 在 task.rs 里固定设置了 max_assistant_sockets(82);锁定的 rustp2p 在对称 NAT 打洞分支里,每轮预测最多 60 个端口,再随机扫描 1200~1499 个端口。每个目标都会通过 try_send_via_all 从主 socket 和所有辅助 socket 发包,然后才等待 2ms。这样一轮可能产生的五元组组合远多于路由器连接表容量。这里是源码推算,实测捕获的是连接表达到上限。

看到了已有的并发打洞限制和重试退避,不过单轮扫描本身似乎还是太大了。配置文件和命令行里暂时没找到调整辅助 socket 数量、单轮扫描数量或发包速率的选项。

想请教一下:有没有现成的限制办法?如果目前没有,能否把这些参数开放出来,或者加一个适合路由器的打洞预算,按实际发出的五元组数量限制,并让多个打洞任务共享这个预算?单纯关闭 IPv4 UDP 打洞会损失我们需要的直连能力,调大 conntrack 也不一定能解决上游 NAT 的容量问题。谢谢。

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions