NAT Check
Version 3, with TCP Support!
检查你的NAT (Network Address Translator) 和p2p协议的兼容性
NAT Check by Bryan Ford, web magic by Dave Andersen
Hosted by the MIDCOM-P2P project on SourceForge
P2P协议的实现在当前IPV4环境下,就技术上来讲,更重要的是如何穿越NAT以及保证连接的稳定性能。有必要先澄清几个概念。
Firewall, NAT, Loopback tanslation (参考 http://blog.csdn.net/hxhbluestar/archive/2004/11/11/177793.aspx)
NAT Check是这样的一个小程序,它可以自动检测你的NAT对P2P协议的支持程度,version 3版本可以检测以下功能:
- TCP/UDP consistent translation
- TCP simultaneous open
- TCP/UDP loopback translation
- TCP unsolicited connections filtered
- UDP unsolicited messages filtered
你可以在下载、编译运行这个C程序:natcheck.c (如果是64位电脑,可以在添加编译参数"-DHAVE_STDINT"或者直接修改程序的#define)
如果你想在Windows平台上运行NAT Check, 首先安装Windows上的GCC环境MinGW,然后使用-lws2_32编译选项编译即可)
Technical Explanation
Required NAT Behavior
Changes in Version 2
- 不再尝试猜测nat的类型,基本NAT还是NATP。因为大部分NATP会在绑定公私网端口的时候,首选相同的端口,这在表现形式上是和基本NAT是一样的。NAT Check碰到这种情况,就会误以为此NAT是Basic类型的。唯一的方法是在同一私网内的两台机器上同时运行NAT Check。
- 可以测试NAT的一个特性: 回环转换(loopback translation, 是原文作者自己起的名称). 如果NAT支持回环转换,表示一台主机可以通过NAT赋予的公网地址和端口访问位于同一NAT后的私有网域中的另外一台主机。大部分的NAT可能还不支持这个功能,不过,它将会变得越来越重要,因为许多P2P客户端位于自己的NAT和ISP配置的公用NAT之后。(Twice-NAT) [注:此处Twice-NAT术语来自于natcheck.c,"BAD for P2P over Twice-NAT", 当NAT不支持loopback translation时,p2p over Twice-NAT会有问题。据我的理解,Twice-NAT指两层NAT,而不是平常所说的Twice NAT,后者是NAT的一种新特性,可以同时更改IP包的源地址(端口)和目的地址(端口),解决nat内的IP地址和外部IP地址重叠的问题(IP overlapping)]
- NAT Check 的命令行选项"-v", 打开它,你就鞥在测试过程中看到详细的反馈信息。
What NAT Check Does
natcheck.c 本质上来讲,只是"ping" 两个不同的位于Internet上的服务器的众所周知的udp端口。这两台服务器都运行同样的程序natserver.c. 另外,还有第三台运行natbouncer.c 的"conspiring"服务器。前面的两台服务器只要收到udp请求,除了直接回复客户程序外,还会向第三台服务器发送一份,而这第三台服务器会将这个包回复给那个客户端,这个由第三台服务器发送的包不是客户端所期望的,属于“对方主动发起的”("unsolicited")。这个"bounce"的过程主要是测试NAT的安全性能,看它是否过滤这些"unsolicited"的包。
natcheck.c 会绑定同一本地端口向前两台公网服务器同时发送一些udp包,根据判断两台服务器的回复包中报告的客户端公网地址/端口是否相同来判定此NAT是否实现了上面所说的"desirable behavior",也就是同一内部ip/port发起的多个session只共享映射到nat上的一个公网ip/port对。
Related Links
防火墙 (Firewall)
防火墙限制了私网与公网的通信,它主要是将(防火墙)认为未经授权的的包丢弃,防火墙只是检验包的数据,并不修改数据包中的IP地址和TCP/UDP端口信息。
网络地址转换(NAT)
当有数据包通过时,网络地址转换器不仅检查包的信息,还要将包头中的IP地址和端口信息进行修改。以使得处于NAT之后的机器共享几个仅有的公网IP地址(通常是一个)。网络地址转换器主要有两种类型:
-
基础NAT (Basic NAT) :基础NAT 将私网主机的私有IP地址转换成公网IP地址,但并不将TCP/UDP端口信息进行转换。基础NAT一般用在当NAT拥有很多公网IP地址的时候,它将公网IP地址与内部主机进行绑定,使得外部可以用公网IP地址访问内部主机。
-
网络地址和端口转换 (Network Address/Port Translator NAPT):这是最普遍的情况,网络地址/端口转换器检查、修改包的IP地址和TCP/UDP端口信息,这样,更多的内部主机就可以同时使用一个公网IP地址。
端口绑定指定了NAPT将在这个会话的生存期内进行地址转换任务。这中间存在一个这样的问题,如果P2P应用程序从内部网络的一个[私有IP地址:端口]对同时发出多条会话给不同的外网主机,那么NAT会怎样处理呢?请看以下几种方案。
- 锥形NAT (Cone NAT) :当建立了一个 [私有IP:端口]-[公网IP:端口] 端口绑定之后,对于来自同一个[私有IP:端口]会话,锥形NAT服务器允许发起会话的应用程序 重复使用这个端口绑定,一直到这个会话结束才解除(端口绑定)。
- 对称NAT (Symmetric NAT) :对称NAT,与Cone NAT是大不相同的,并不对会话进行端口绑定,而是分配一个全新的 公网端口 给每一个新的会话。(因为很难正确得知这个新分配的公网端口的具体数值,本文谈及的p2p udp hole punch技术并不适用于这种nat。事实上,对称nat已不多见)
回环转换 (Loopback translation)
当NAT的私网内部机器想通过公共地址来访问同一台局域网内的机器的时,NAT设备等价于做了两次NAT的事情,在包到达目标机器之前,先将私有地址转换为公网地址,然后再将公网地址转换回私有地址。我们把具有上叙转换功能的NAT设备叫做“回环转换”设备。
更多内容,可以技术细节可参考 http://midcom-p2p.sourceforge.net/draft-ford-midcom-p2p-01.txt