3

我想在两个对等方之间建立 UDP 通信,比如 Alice 和 Bob。Alice 位于端口受限的锥形 NAT 后面(这样即使目的地改变了,相同的内部端口也会映射到相同的外部端口),而 Bob 位于对称 NAT 之后(这意味着每次新的外部端口都会改变)目的地的选择与内部端口无关,因此使外部端口不可预测)。我在两者之间有一个服务器,我想打一个 UDP 打孔。

我实施了以下策略:

  • Bob 打开大量端口,并从所有端口向 Alice 的外部端口发送一个数据包(他知道是否通过服务器)。
  • Alice 在随机端口向 Bob 的 NAT 发送数据包,直到建立连接。

手头有两个这种类型的 NAT,我做了一些实验。Bob 开放 32 个端口,Alice 每 0.1 秒发送 64 个数据包。连接通常在 1 或 2 秒内建立,这非常适合我的需求。

但是,我想知道我是否会遇到一些严格的 NAT 路由器或防火墙的问题。例如,路由器不允许内部对等方打开 32 个端口是否会发生?或者(这听起来更有可能)是否会发生这样的情况:路由器看到大量从随机端口传入的数据包被丢弃,会将 IP 列入黑名单并丢弃其所有数据包一段时间?我读到有时这可能发生在 DoS 攻击的情况下,但我的数据包速率比 DoS 攻击轻 4 到 6 个数量级。

我问的是合理的网络配置:我很确定原则上可以设置防火墙以这种方式运行。我将主要针对位于标准家庭连接之后的用户,因此我的主要目标是使用 NAT 的普通互联网提供商。

4

1 回答 1

2

这是一个有趣的问题。

首先,我不确定是否有人有您正在寻找的确切答案。不同的网络使用不同的设备和不同的配置。两个 ISP 可以为他们的路由器、防火墙、NAT、入侵检测设备、DPI 设备等使用十个不同的供应商;更不用说所有这些设备具有的可能配置的数量。

虽然商业和企业网络已经够糟糕了,但家庭网络更糟糕。这里有更多的供应商销售调制解调器、NAT 盒和各种影响网络连接的软件(如防火墙和防病毒软件)。所有这些都掌握在技术不熟练的用户手中,他们将其保留为默认设置,或者更糟

此外,在家庭网络和商业网络中都可能存在多层 NAT。我知道一家公司的每个实验室都有一个 NAT(将其与其他实验室和研发网络隔离)。然后,每个实验室都连接到研发 NAT(以将其与其他部门隔离),后者又连接到公司范围的 NAT,顺便说一下,该 NAT 也有严密的防火墙。再加上一个可能的 ISP 级(运营商级)NAT,您将看到多达 4 层的 NAT。希望这是一个极端的例子,但现在两层 NAT 很常见,家庭 NAT 和运营商级 NAT。

鉴于此,随机网络将这种行为视为可疑并加以限制的可能性有多大?坦率地说,我不确定,我认为其他人也没有高度确定性。

尽管如此,我有根据的猜测是,通信设备(NAT、路由器等)的合理默认配置不应阻止此类行为。毕竟,许多应用程序打开了几个端口;更不用说 NAT 无法知道发送此流量的 IP 本身并不是一个 NAT 设备,后面有几十台计算机——每台计算机都有几个开放端口。

我也猜想简单的防火墙应该没问题,只要 UDP 本身没有被阻止,并且允许使用各种端口。然而,试图阻止端口扫描和反 DDoS 设备的防火墙可能会带来问题,因为这种流量可能看起来很可疑,因此它可能取决于此类设备和软件的配置/实施细节。所以不幸的是,判断你的策略在现实世界中的表现的唯一方法是在各种不同的网络上进行尝试。

其次,我想对你的打孔策略说几句话。如果 Alice 和 Bob 都有一个共享服务器,并且 Alice 在一个锥形 NAT 后面,我看不出你的策略有什么意义。锥形 NAT 是最容易克服的 NAT。如果您希望 Alice 能够连接到 Bob(这很棘手,因为他在对称 NAT 后面),您真正需要做的就是让 Bob 在 Alice 的请求下连接到 Alice。

为此,Alice 和 Bob 都应该始终与服务器建立持久的 TCP 或 UDP 连接。连接在大多数情况下不应该携带任何数据,并且应该偶尔保持活动状态。

当 Alice 想要连接到 Bob 时,它只需要打开一个端口(比如端口 X),然后从该端口连接到服务器。服务器看到与端口 X 对应的 Alice 的外部端口 - 比如说端口 Y。此时,Alice 通知服务器她希望 Bob 连接到她。由于 Bob 连接到同一台服务器,服务器通知 Bob 它应该在端口 Y 连接到 Alice。这应该在它们之间建立连接,而无需任何猜测。

于 2015-03-05T13:16:01.900 回答