如何发现给定接口后面的 NAT 类型

Posted

技术标签:

【中文标题】如何发现给定接口后面的 NAT 类型【英文标题】:How to discover the type of the NAT a given interface is behind 【发布时间】:2010-09-27 01:08:14 【问题描述】:

我想了解给定网络接口的 NAT 类型(FullCone、Restricted Cone、Port Restricted cone、Symmetric)。

我测试了不同的工具(http://freshmeat.net/projects/jstun/、http://code.google.com/p/boogu/),但它们针对同一界面报告了不同的结果。

我正在寻找 Python (或其他语言,第二选择是 Java,如果没有其他可用的话)的明确答案。

【问题讨论】:

【参考方案1】:

我赞同@S.Lott 的回答:不可能使用 STUN(或任何其他协议)来 100% 确定您所使用的 NAT 类型。

问题是(正如我最近所看到的)NAT 有时可能充当Address-Dependent(对称),有时充当Endpoint-Independent(完整、受限或端口受限锥形)。

当您考虑它时,地址依赖意味着当您从 NAT 后面的客户端上的一个套接字发送数据包到两个不同的服务器时,NAT 将为每个服务器创建两个自定义公共地址:端口元组.在我的例子中,这些绑定看起来完全是随机的,但如果范围很小,有时这些元组实际上是相等的!这使测试感到困惑。

当时我正在使用this library,有时它告诉我 NAT 的行为与地址相关,有时它与端点无关(两者之间的切换似乎也是完全随机的,有时它发生在我重新启动设备,有时在一段时间后,...)。

这发生在我使用Slovak Telekom 的移动设备上,这家公司主要由Deutsche Telekom 所有,所以我认为问题至少会出现在整个欧洲。

我想说这里的规则是这样的:如果 STUN 测试告诉您您在对称 NAT 后面,那么情况就是如此,但如果它告诉您其他情况,那么您就不能 100% 确定。

最后一点,检查 NAT 与 TCP 相关的行为的一种简单方法是在 google 中输入“我的 IP 地址是什么”,然后首先打开(比如说)五个页面。如果页面与您的 IP 地址不一致一致,则您的 NAT 的行为是地址相关或地址和端口相关(对称)。但同样,如果它们确实对应,您就无法确定。

【讨论】:

【参考方案2】:

http://en.wikipedia.org/wiki/STUN

NAT 设备在一个 不同类型地址的数量 和端口映射方案。眩晕 不能与所有这些都正常工作。

这是否足够明确?这只是***的引用,但从这里看来,您的请求在物理上是不可能的。

【讨论】:

【参考方案3】:

正如@S.Lott 所说,STUN 是您的首选协议。

然后,STUN 只是一个协议。这是我的建议:

1 STUN 现在有两个版本:旧版本是RFC3489 - 这是一个轻量级协议,允许应用程序发现它们与公共 Internet 之间的 NAT 和防火墙的存在和类型(所以它主要且仅用于检测 NAT 类型);新版本是RFC5389 - 这是其他协议处理NAT穿越的工具。

2 还有一个名为 TURN RFC5766 的 STUN 中继扩展。 TURN 允许主机控制中继的操作并使用中继与其对等方交换数据包。 TURN 与其他一些中继控制协议的不同之处在于它允许客户端使用单个中继地址与多个对等方通信。

工具:

STUN 服务器 (RFC3489) : stund By c++

STUN 客户端 (RFC3489) : pystun 由 python

TURN 服务器 (RFC5766) : turnserver By c

TURN 客户端 (RFC5766) : turn-client 通过 c 和 python

注意: 由于TURN是新版本STUN的扩展,TURN服务器也支持RFC5389的新STUN请求。

【讨论】:

以上是关于如何发现给定接口后面的 NAT 类型的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 php 获取 NAT 后面的 ip?

在java上的nat后面打开套接字

如何在 NAT 后面的两个节点之间进行通信?

C#如何确定一个类型是不是实现了给定的接口?

如何识别 NAT 后面的服务器 Socket 端口

如何在 2 个 nat 后面执行 p2p?