我想在两个对等方之间建立 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 的普通互联网提供商。