关于nat类型分析

Regarding nat type analysis

我从 http://www.stunprotocol.org/ 下载了 stun 客户端,并试图通过命令 stunclient --mode full stun.stunprotocol.org --verbosity 9 找出 NAT 类型,我得到了以下响应。

config.fBehaviorTest = true
config.fFilteringTest = true
config.timeoutSeconds = 0
config.uMaxAttempts = 0
config.addrServer = 52.86.10.164:3478
socketconfig.addrLocal = 0.0.0.0:0
Sending message to 52.86.10.164:3478
Got response (68 bytes) from 52.86.10.164:3478 on inter
Other address is 52.201.75.212:3479

Sending message to 52.201.75.212:3478
Got response (68 bytes) from 52.201.75.212:3478 on inte
Sending message to 52.201.75.212:3479
Continuing to wait for response...
Continuing to wait for response...
Continuing to wait for response...
Continuing to wait for response...
Continuing to wait for response...
Sending message to 52.201.75.212:3479
Continuing to wait for response...
Continuing to wait for response...
Continuing to wait for response...
Continuing to wait for response...
Continuing to wait for response...
Sending message to 52.86.10.164:3478
Continuing to wait for response...
Continuing to wait for response...
Continuing to wait for response...
Continuing to wait for response...
Continuing to wait for response...
Sending message to 52.86.10.164:3478
Continuing to wait for response...
Continuing to wait for response...
Continuing to wait for response...
Continuing to wait for response...
Continuing to wait for response...
Sending message to 52.86.10.164:3478
Continuing to wait for response...
Continuing to wait for response...
Continuing to wait for response...
Continuing to wait for response...
Continuing to wait for response...
Sending message to 52.86.10.164:3478
Continuing to wait for response...
Continuing to wait for response...
Continuing to wait for response...
Continuing to wait for response...
Continuing to wait for response...
Binding test: success
Local address: 10.64.60.58:58841
Mapped address: 125.19.34.60:24604
Behavior test: fail
Filtering test: success
Nat filtering: Address and Port Dependent Filtering

我在一家公司工作,因此出于安全原因,NAT 类型 "Address and Port Dependent Filtering" 似乎可行。

但作为一种普遍现象,在我看来,对于点对点连接,大多数情况下,NAT 类型将是 "Address and Port Dependent Filtering",因此任何媒体通信都需要转向服务器。

然而,在 google 上搜索 webrtc,它表明 90% 的点对点通信是通过 stun 服务器本身建立的(通过打孔等)。这意味着完全支持在这种情况下建立连接的 NAT 类型。

专家对点对点通信要考虑的 NAT 类型分析有什么意见吗?

stunclient 程序可以使用更多的日志记录来指示它在做什么。由于我对代码略知一二,下面是我对它的解释。

Stunclient 进行两组不同的测试。首先是 "mapping behavior" 测试,这对于了解您的 NAT/Firewall 将如何影响 P2P 连接是最重要的。另一组是 "filtering tests",它指示 "open" 您的 NAT 在接收来自其他 IP/port 组合的流量方面的表现。

你的行为测试"failed"。根据您的日志输出,这可能意味着:

测试 1:在本例中选择一个随机端口 58841。从这个本地端口,对 stun.stunprotocol.org:3478 进行基本绑定测试。这是客户端收到响应的地方,其中服务器指示映射地址 (125.19.34.60:24604) 并且用于后续行为和过滤测试的眩晕备用 IP 位于 52.201.75.212。

测试 2:相同的本地端口,58851。向备用 IP 和主端口 (52.201.75.212:3478) 发送绑定请求。在您的情况下,返回的响应似乎可能是不同的 ip 或端口。在这种情况下 "test 3" 是必需的。

测试3:相同的本地端口,58851。向备用ip和备用端口(52.201.75.212:3479)发送绑定请求,这样它就可以区分"address dependent"和"address and port dependent mappings"。这是有趣的部分——你从未得到回应。尽管能够与端口 3478 上的两个 IP 地址通信。这就是测试失败的原因。

可能是以下两种情况之一:

a) 您的 NAT/Firewall 实际上对端口 3478 开放,但对端口 3479 不开放。从命令行执行此操作以检测

 stunclient 52.201.75.212 3479

如果成功获得映射地址,则立即执行此操作:

 stunclient 52.86.10.164 3478

尝试这两个 ip 地址和端口的其他组合。由此产生的行为可能意味着以下

b) 当删除 ip 和端口都更改时,您的 NAT/Firewall 拒绝端口映射。这意味着您的网络环境比 "Address and Port dependent mapping" NAT 更受限制。通常称为对称 NAT。

至于过滤测试,忽略这个结果即可。过滤测试尝试检测您是否可以发送到一个 ip:port,但从不同的 ip 或端口接收。 99% 的时间 NAT 不允许这样做。所以结果几乎总是 "Address and Port Dependent Filtering"。过滤测试结果并不能很好地说明您的 NAT 在 P2P 连接中将如何成功。

仅仅因为您的企业网络非常受限,并不意味着您无法与另一个网络上的对等方进行通信。如果他有一个性能更好的带有端点独立映射的 NAT,那么 P2P 连接仍然有机会成功。

近年来我没有跟上 NAT 的趋势,但是 80-90% 的连接仅通过 STUN 就可以成功,这听起来是正确的。其余的将需要中继解决方案,例如 TURN。

我想,你想在所有可能的场景(包括对称 NAT)中进行 p2p 之间的通信。 我的建议:尝试使用 webRTC 并使用 ice 服务器列表中的 stun 和 turn 服务器。这将为您提供 ICE 候选人的范围,webRTC 将负责连接到最佳候选人。 这应该可以避免您对 NAT 类型的担忧。