NAT连通性测试工具以及Flash P2P中的NAT穿透原理

由于公网IP有限,NAT几乎是无处不在。比如我们在家里,牵一个ADSL,用Modem拨号得到一个公网IP,然后在Modem后面再接一个路由使得多个设备能同时上网。路由会有一个公网IP一个私网IP,然后家里的其它设备都用的是私网IP。此时路有器就要完成一个很重要的职责:对于进出它的包做网络地址转换。

NAT是在传输层及以上做的,传输层最主要的2个协议是TCP和UDP,下面只考虑UDP。对于UDP而言,每个包都有很基本的4个要素:src ip、src port、dst ip、dst port。根据在做NAT的时候是否保留src ip和src port,可以把NAT分为这么三种:

Cone: 将src ip映射到一个固定的IP,并且将src port映射到一个固定的Port,无论dst ip和dst port是什么。假如我从192.168.0.2:5000,通过路由器发一个UDP包给66.66.88.88:4000端口,而路由器把这个包的src ip和src port翻译成了173.245.73.182:5000。那么在此后一段时间内,无论我从192.168.0.2:5000往外面的任意IP、任意端口发包,src ip、src port都会被翻译成173.245.73.182:5000。

Single IP address, symmetric:将src ip映射到一个固定的IP,将src port映射到一个随机的port,但是保证对于相同的(dst ip,dst port), src port始终相同。(否则双方没法通话啊,回来的包回给哪个端口呢?)举例:假如我从192.168.0.2:5000,通过路由器发一个UDP包给66.66.88.88:4000端口,而路由器把这个包的src ip和src port翻译成了173.245.73.182:5000。那么在此后一段时间内,无论我从192.168.0.2:5000往外面的任意IP、任意端口发包,src ip都会被翻译成173.245.73.182,但是src port嘛,可就说不准了。

Multiple IP address, symmetric:与上面类似,但是src ip可能会被映射到多个IP中的一个。最典型的就是假如你的网关做了双线接入,那么你访问电信的资源就会走电信的那个IP出去,你访问网通的资源就会走网通的IP出去。这种策略对于做P2P来说简直就是恶梦啊!!

上面只说了发,下面说收。根据对收到的包的过滤限制,可能把Cone分为3种:

Full Cone: 不对收到的包的IP端口做任何限制. 这种NAT通常被称为static NAT,在外面看就像是一个透明代理一样。比如我在192.168.0.1上,用iptables把80端口映射到192.168.0.2的8080上。那么无论从哪来的包,都会被转发过去。

Restricted Cone: Restricted Cone会对收到的包的IP做限制。假如我从192.168.0.2:5000,通过路由器173.245.73.182:5000端口发给173.245.88.88:4000端口。然后对方从173.245.88.88:4000给173.245.73.182:5000回了一个包,那么毫无疑问我们的路由器应该接受这个包,并转发给192.168.0.2:5000。假设有另外一台我根本不认识的机器,比如66.66.99.99要给173.245.73.182:5000发包,那么我们的路由器就会丢弃这个包。

Port Restricted Cone: 它就是在Restricted Cone的基础上对端口也做了限制。假如我从192.168.0.2:5000,通过路由器173.245.73.182:5000端口发给173.245.88.88:4000端口。然后对方从173.245.88.88:4000给173.245.73.182:5000回了一个包,那么毫无疑问我们的路由器应该接受这个包。如果你换个端口,从173.245.88.88:6000给173.245.73.182:5000回包,我们的路由器就会丢弃。

对于Cone,可采用很简单的NAT穿透的方式建立P2P直连。

RTMFP中的P2P打洞过程:

假设一共三个角色:Server、Initiator(Peer1)、Target(Peer2)。Target已经与Server建立RTMFP连接。

image

上图中曲线代表NAT设备。

在连接建立之后,Target就有了一个唯一的PeerID,Server通过UDP包头可以得知这个Peer的公网IP和端口。

此外,在建立连接后,Target还会通过一个名为SetPeerInfo的RPC调用,将自己的IP、端口号汇报给Server。

例如:

2012-06-20 17:17:08 9640 (i)2581173 rtmfp send message, session: 0BC276C8 flow: 056A5C00 kMsgCmdEx idByte=17 streamId=0 time=84 trxId=0 kEncodingAMF0 setPeerInfo cmdData=( kNullType ) arg0=( kStringType “192.168.146.1:61920” ) arg1=( kStringType “192.168.15.1:61920” ) arg2=( kStringType “10.4.8.84:61920” )

然后Server就会维护一张映射表,key是PeerID,value是地址(IP和端口号)列表。

现在Initiator要连接Target。

  1. Initiator首先向Server发InitiatorHello请求,其中带上Target的peerID。Initiator此时并不知道Peer2的地址,它只知道Target的PeerID。
  2. Server向Initiator回复一个Redirect消息,里面包含Target的公网IP端口(通过UDP包头可以得到)、以及Target的所有内网IP端口, 如下面这条日志所示: 
    2012-06-20 17:17:17 9640 (d)0000000 core redirect { epd: 210fce584f9dcf7962d475af4128437d71233bb99f8debd2da8f9f558d60cf6071bb tag: 24dfff0da10b24d3b33af1931e0cf699 fromAddr: 173.245.73.182:61922 instanceInterfaceID: 2 } to { derived 66.66.99.99:61920;reported 192.168.146.1:61920;reported 192.168.15.1:61920;relay 66.66.88.88:19351;} 
    RTMFP Redirect消息就像HTTP的302一样,收到者(Initiator)需要向新地址重新建立连接,即发送InitiatorHello包。这里面所说的relay应该是经Server中转的意思,具体流程我还不明白。
  3. 同时,Server给Target发一个Forward Message,里面包含Peer1的公网IP端口。 如下面这条日志所示: 
    2012-06-20    17:17:17    9640    (d)0000000    core forward { epd: 210fce584f9dcf7962d475af4128437d71233bb99f8debd2da8f9f558d60cf6071bb tag: 24dfff0da10b24d3b33af1931e0cf699 fromAddr: 173.245.73.182:61922 instanceInterfaceID: 2 }    - 
    其中epd就是Initiator的peerID,173.245.73.182:61922 就是Initiator公网IP端口。 
    Forward Message就像servlet里面的forward一样,收到者(Target)需要直接给原始的请求者(Initiator)回下一个握手包(即Response Hello)。
  4. 对Initiator来说,哪个地址先回给它第一个Response Hello包,它就跟哪个地址继续握手。

假设Initiator和Target处于同一个NAT中,那么会尽量通过redirect消息进行直连,以后的交互就跟NAT没有关系。但是怎么控制这个的呢?我还不明白。

假设Initiator和Target处于不同的NAT之中,两个NAT类型都是Port Restricted Cone,那么Peer1收到Redirect消息的时候,然后向Peer2发送InitiatorHello的时候,就在Peer1的NAT上打了一个洞。虽然这个InitiatorHello也许会被Peer2的防火墙拦掉,但是没有关系,正因为有了这个洞,Peer2的ResponseHello才能进来。

假设Initiator是处于symmetric single IP NAT之后,那么Server给Target的地址其实是一个错误的地址(端口号不对),所以Target收到Forward消息后所作的那个ResponseHello包,Initiator根本就收不到(Initiator没有用那个端口给Target发过包)。但是假如Target是Restricted Cone,发完这个ResponseHello之后它就能接收来自Initiator的任何端口包。所以它们能接着Redirect消息之后的流程继续走下去。

如果很不幸,Target也是处于symmetric single IP NAT之后,那么Target在回复Forward消息的时候就要采用猜端口的方式,给Initiator多发几个ResponseHello包,如果有幸猜中了Initiator答复Redirect消息时所采用的端口,那么两者就可以连接起来了。不过Flash好像没有这么做。

NAT检查工具:http://cc.rtmfp.net/

Public UDP port number same as local UDP port number:这个是指NAT是否将src port做了转换。

Can receive from same IP address, same UDP port number:这个值应当永远是Yes。因为如果连这个检查都通不过,连接根本就建立不起来。

Can receive from same IP address, different UDP port number:如果这个值是true,说明是Port Restricted Cone,它会把出去的包的dst port记录下来,然后收到包时检查port number。

Can receive from different IP address, different UDP port number:如果这个值是true,说明是Restricted Cone,即它不对端口号做检查。

Can send to different IP address after server introduction:这个值应当永远是Yes。

Source IP address is preserved from original connection:这个是看server收到的包是否都来自于同一个IP。这个有一定的假阳性在里面,只要有一次为false,就说明用的是Multiple IP address symmetric NAT。

Source UDP port number is preserved from original connection:true说明是cone NAT,false说明是symmetric NAT。

我自制了一张连通性图:

  Restricted Cone Port Restricted Cone symmetric single IP symmetric multiple IP Restricted Cone Yes Yes Yes No Port Restricted Cone Yes Yes No No symmetric single IP Yes No No No symmetric multiple IP No No No No

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
常见问题异次元的宝藏留下足迹分享精彩联系方式关于本站友情链接手气不错 有点便宜 卓越亚马逊 凡客诚品 当当商城 淘宝达人 你的位置: 异次元首页全部文章网络软件阅读文章 P2P终结者(P2POver) 免费版下载 [限制别人网速、BT、迅雷等] [ 网络软件 ] P2P终结者(P2POver) 刚刚发布了它的新的版本。它是一个两面性很明显的软件。它是一个可以控制整个局域网网络的管理软件。局域网的任何一台安装了它之后,就可以随意的限制局域网其他计算机的网速、限制其他计算机进行BT、迅雷下载等等,更甚至可以断开某台电脑的网络,使其不能上网。。 软件开发者的初衷是让网络管理变得更加轻松容易。但是时至今日,P2P终结者在很多时候,很多地方,如学生宿舍等地方沦为一款随意互相限速、www.x-force.cn互相攻击的恶劣工具了。。 偶还见过因为使用此软件限制别人速度而起争执打架的事件呢~所以,很多朋友都对P2P终结者有一种讨厌的心理,纷纷抵制P2P终结者,甚至还在网络上约定去攻击其官方网站等等。 以 X-Force 的个人的想法来说,其实大家不必对P2P终结者本身进行攻击或谩骂。就像刀子一样,它有好的作用,也有坏的作用。某些人用刀子去杀人了,我们就应该抵制刀子了吗?去骂发明刀子的人么? 大家对P2P终结者的讨厌,可以说,只是由某些自私的人类导致的。如果大家都学会尊重,其实P2P终结者这类软件根本没有存在的意义的~ X-Force 的职业也是程序员,比较能理解开发人员的心情,呵呵~一句话:P2P终结者本身没错,而且是非常好用非常有益的一款软件,错在那些滥用它的自私的人们。。。 P2P终结者 主界面截图www.x-force.cn P2P终结者对网管来说肯定是一款方便好用的好软件!异次元之前就介绍过一款与它非常相似的“聚生网管”,功能也非常的强大。据说是P2P终结者给其OEM的,我自己没考证过,所以也不好说。只是知道,他们的操作方式、界面、功能等一切都很相似。 P2P终结者(P2POver) 是由Net.Soft工作室开发的一套专门用来控制企业网络P2P下载流量的网络管理软件。它可以控制局域网上其他电脑的网速,解决了目前P2P软件(如迅雷、BT、电驴等)过多占用带宽导致整个网络网速变慢等问题。www.x-force.cn软件基于底层协议分析处理,也就是很多人都知道的ARP欺骗了。它可以适应绝大多数网络环境,包括代理服务器、ADSL路由器共享上网,Lan专线等网络接入环境。 新版本的P2P终结者彻底解决了交换机连接网络环境问题,做到真正只需要在任意一台主机安装即可控制整个网络的P2P流量,对于网络的主机来说具有很好的控制透明性,从而有效地解决了这一目前令许多网络管理员都极为头痛的问题,具有良好的应用价值。 P2P终结者(P2POver)具有以下功能:   1.支持目前主流P2P协议控制(Bittorrent,BaiduX,PP,Poco,Kamun,Thunder,Kugoo,eMule等)   2.支持P2P下载带宽限制自定义   3.支持指定主机全局带宽限制   4.主机网络带宽实时查看功能,可以使网络管理员对网络带宽使用情况做到一目了然   5.完全集成一些网络攻击工具的断开公网连接功能   6.IP-MAC绑定控制功能   7.网络主机通讯详细信息(IP报文内容分析)实时查看功能   8.HTTP下载自定义文件后缀控制功能www.x-force.cn   9.FTP下载限制功能   10.WWW站点自定义控制功能,支持黑名单、白名单方式   11.QQ,MSN,PoPo,UC聊天工具控制功能   12.控制日志记录   13.局域网非法Sniffer主机检测功能   14.支持绝大多数网络环境,网络结构不需要做任何改动,完美支持ADSL路由器+交换机网络环境 当然,来异次元的很多朋友可能都受到过P2P终结者、聚生网管,的骚扰或者被限制速度等等的,有时候确实很烦。X-Force的最佳解决方法是: 1、与控制者交谈,要求其尊重大家 2、与其摊牌谈判 3、找个时间真人PK一下~ (最好先带上几个70级的盗贼朋友隐身跟着你) 4、如果此人依然厚颜无耻的话,那么就大伙一起鄙视之~ 5、继续的话,就需要大伙无视之了~ 6、注意:拔其网线、关其电源、报告学校管理员、在其他事情上故意刁难他、偷偷在其电脑上防毒不是君子行为。可以的话,来几个集体吃饭不叫他,集体游玩不叫他,集体生日也不叫他(哪来的集体生日?)。。。 7、嗯,才发现。。。如果不知道那人是谁怎么办? 8、那。。。我知道你很无奈,看看这个咚咚吧~ 好了,不说了,希望大家在这里下载的P2P终结者不是拿回去让人讨厌自己的吧。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值