以编程方式确定路由器NAT类型

时间:2011-12-22 10:47:06

标签: nat nat-traversal stun

我需要以编程方式确定程序中的路由器NAT类型。我确实看了一些关于SO的STUN相关答案和UPnP相关信息。但没有得到任何确定的答案。

我查看了STUN RFC(rfc 5389),但没有指定如何确定NAT类型。它确实提到它的先前版本(RFC 3489)确实提供了确定NAT类型的机制。但也提到了

此外。经典STUN的NAT类型分类算法被发现是错误的,因为许多NAT并不完全适合那里定义的类型。

鉴于上述情况,请您就如何在我的软件中确定路由器NAT类型提出建议。此外,现在RFC 3489已经过时了还有其他方法吗?

提前致谢。

1 个答案:

答案 0 :(得分:5)

RFC 3489分为三个不同的RFC:

RFC 5389 - 基本STUN协议。 STUN绑定请求和绑定响应的基本协议与RFC 3489大致相同。协议标头使用占用某些事务ID字段的魔术cookie进行更新。一些STUN属性被重新定义。添加了一些新的(特别是 - XOR_MAPPED_ADDRESS)。对STUN身份验证的完成方式进行了一些更改。 NAT行为和分类讨论已移至RFC 5780。

RFC 5780 - “使用STUN进行Nat行为发现”。 NAT类型发现的基本更改是区分NAT端口映射行为与NAT过滤行为。而RFC 3489会尝试将NAT分类为几个桶中的一个(“锥形”,“端口受限”,“对称”) - 这对于描述NAT来说过于通用。

RFC 5769 - 只是概述了几种不同STUN消息类型的十六进制转储的样子。

出于好奇,我想知道你的应用程序是否在NAT后运行是有用的。但是如何知道NAT的行为会影响你的代码路径?

无耻插件 - 使用GitHub上托管的my STUN Server code