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

2024-06-25 06:28:33 发布

您现在位置:Python中文网/ 问答频道 /正文

我想找出一个给定的网络接口所落后的NAT类型(FullCone、Restricted Cone、Port Restricted Cone、Symmetric)。在

我测试了不同的工具(http://freshmeat.net/projects/jstun/http://code.google.com/p/boogu/),但是它们对同一个接口报告了不同的结果。在

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


Tags: 工具语言http类型netportnat网络接口
3条回答

正如@S.Lott所说,电击是你的首选方案。在

然后,晕眩只是协议。这里我的建议是:

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

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

工具:

  • STUN服务器(RFC3489):stund由c++
  • STUN客户端(RFC3489):pystun由python编写

  • 将服务器(RFC5766):turnserver由c

  • 通过c和python转换客户端(RFC5766):turn-client

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

我从@S.Lott那里得到了答案:不可能使用STUN(或任何其他协议)来100%确定您落后于哪种类型的NAT。在

问题是(正如我最近所看到的那样),NAT有时充当Address-Dependent(对称),有时又充当Endpoint-Independent(完全、受限或端口受限的圆锥)。在

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

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

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

我想说这里的规则是这样的:如果stunt测试告诉你你是在一个对称的NAT后面,而不是这样,但是如果它告诉你,那么你不能100%肯定。在

最后一点,检查NAT相对于TCP的行为的一个简单方法是在google中输入“what is my IP address”,然后首先打开(比如)五个页面。如果页面与您的IP地址不一致,则NAT的行为与地址或端口相关(对称)。但是,如果他们真的一致,你就不能确定。在

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

NAT devices are implemented in a number of different types of address and port mapping schemes. STUN does not work correctly with all of them.

这足够确定吗?这只是维基百科上的一句话,但从这看来,你的请求实际上是不可能的。在

相关问题 更多 >