是否可以强力搜索/猜测对称 NAT 端口预测以进行打孔?

网络工程 ipv4 纳特 网络发现
2021-08-01 10:48:34

假设我们有两个客户端 A 和 B 希望彼此连接,分别位于对称 NAT 的 NA 和 NB 后面。还有一个会合服务器 S,用于协助客户端 A 和 B 进行打孔过程。文献指出,由于 NA 和 NB 会在其各自的客户端发起新连接时随机分配外部端口(即使目标地址相同),因此集合点服务器 S 在其连接客户端之间交换的外部端口信息实际上是无用的。我想知道的是,为什么客户端 A 和 B 不可能先尝试 S 提供的外部端口信息,然后,如果失败,则尝试反复猜测/强制使用外部端口。

我的猜测是,尝试所有 2^16 个端口会花费太长时间或者某些事情完全超出我的头脑,而蛮力搜索将需要 (2^16)^2 次猜测,这是完全不可行的。

3个回答

为什么客户端 A 和 B 无法尝试 S 提供的外部端口信息

因为用于与 S 通信的端口永远不会是用于与任一端点通信的端口。A->S 将是一个端口;A->B 将是不同的端口。如果 NAT 正确完成,则两个端口都不可猜测。NAT 条目将 Src(ip:port)/Dst(ip:port)[inside] 映射到 Src(ip:port)/Dst(ip:port)[outside]——这是 NAT可以更改的 8 个数字当 A 从 S 变为 B 时,这是与全新的、未知的外部值的全新连接。STUN/ICE/等 指望内外 src 端口关联对于多个目的地保持不变。

A 和 B 无法知道 NAT 选择了哪个端口,即使它是“粘性的”(只要使用相同的内部 src 端口,NAT 使用相同的外部 src 端口),除非相同的端口用于多个 dst IP。S 只知道用来与它交谈的内容;如果 NAT 使用不同的外部 src 端口,则 S 和 A 都不知道该端口是什么。

“文献说,因为 NA 和 NB 在它们各自的客户端发起新连接时随机分配外部端口(即使目标地址相同),集合点服务器 S 在其连接客户端之间交换的外部端口信息实际上是无用的。”

“我想知道的是,为什么客户端 A 和 B 不可能先尝试 S 提供的外部端口信息,然后,如果失败,则尝试反复猜测/强制使用外部端口。”

  • 如果您喜欢玩彩票,这是可能的。我的 JVM 可以处理 1000 多个线程。每个线程都可以分配一个 UDP 套接字。如果端口映射它真的是随机的(它在手机信号塔上出现这种方式,但可能会偏向某些数字),那么理论上你可以从 1000 个线程并发发送 1000 个数据包,然后等待所有 1000 个这些套接字,听回复。如果有 65535 个可能的端口,那么您有 1000/65535 的机会,或 1.52% 的机会。请注意,某些对称 NAT 会在端口用完时更改您的公共 IP 地址(具有多个 IP 地址的 PAT),请参阅http://www.cisco.com/c/en/us/support/docs/ip/network- address-translation-nat/26704-nat-faq-00.html. 总而言之,鉴于对称 NAT 可以占用超过 65535 个端口(每个公共 IP 地址最多 65535 个端口,但您的手机塔可能有 1 个以上的 ip 地址),您将不得不通过 65535*n 个端口,其中 n 是 IP 地址的数量。如果您确实占用了那么多端口,“如果没有可用端口,则数据包将被丢弃,除非池中有另一个 IP 地址可用。” 这很可能导致使用该 NAT/路由器的每个人都拒绝服务。如果您一次重复尝试 1000 个端口,则必须平均 1 / .0152,或平均 66 次尝试。如果您在每次尝试之间等待 0.5 秒,则平均需要 33 秒来建立连接。

“是否可以”

  • 是的,但不实用。

仅仅猜测源端口是不够的。您还需要知道 S 的端口 当 A 连接到 S 时,NA 期望流量以 S 的源 IP 返回。因此 B 还必须欺骗 S 的端口和 IP。如果 NA 是“真正的”防火墙,您还得猜测 TCP 序列号,否则防火墙会拒绝你。