内网穿透&UDP打洞

首先文章建议 Cone NAPT 还有但愿,要是 Symmetri NAPT 就别想了,接着介绍了两种基本状况,一是一台内网机器链接外网通讯的状况,二是两台内网之间互联的状况。html

 

第一种,只须要内网主动发起链接就能够了。内网机器A(192.168.1.x:4000)要求链接外网服务端S(60.17.211.x:5000),发出链接请求后被A网所在网关NA(10.11.12.x)获取,NA将A的地址转变为其自身地址,并分配临时端口(6000)用做通信,因而,当初的 A->S 就变成如今的 A->NA->S。那么S接到请求后看到的并非A的地址,而是NA的IP和Port,此时S若是照着此地址回复,则NA收到,由于NA此时有通信临时Session被建立了,因此在必定时间内(貌似根据不一样硬件、软件设备而不一样)还记得发到6000的信息要转给A,NA就会转发给A。至此,通信成功。安全

 

第二种,两个内网之间就要复杂一些,有一个图很好,我转载了一下,特别声明,是从百度文库截图下来的。网络

 

这个图很清晰,作个简单备注就能够了。session

 

首先,两个内网A和B谁都不能直接连谁,因此第一次,都是给S发送登陆、心跳之类的,目的是代表本身的存在,并创建session,固然,这个过程仍是经过自身网络的N实现的。那么,如何作到UDP穿透呢?post

 

1. 假设左边的为A(192.168.1.77:8000),A->NA(211.133.*:6000)->S,此时,S记住了 A 的存在,NA也与A创建了对应关系(发到6000的信息就是A的),同样道理,B也与S创建了链接。htm

 

2. A经过S知道了B的存在(只是知道存在),A想连B,因而A告诉S,“让B探测我一下”blog

 

3. S把A的要求发给B,因而B发送“探测”包给A,事实上就是 B->NB->NA,可是由于 NA 不认识 NB(以前没联系过),因此 NA 就不会转发给 A,随之丢弃。可是 NB 上已经创建起了目的是 NA 的 session,这是后面打洞成功的关键一步。io

 

4. B 发送探测给 A 以后,由于 NA 一定丢弃,因此 B 向 S 发送“反馈包”,就是图中的步骤 4,目的是告诉 S 已经发送过探测包给 A 了。这一步的目的是,借 S 之手告诉 A ,我已经联系过你了,我已经有了关于你的 session 。登录

 

5. S 通知 A:“人家 B 已经联系过你了”。百度

 

6. A 知道以后,发送数据包给 B ,也就是 A->NA->NB->B。当 NA->NB 时,由于 NB 存有当初连接 NA 的信息,因此 NB 认为它本身认识 NA ,会接受 NA 发送的信息,转发给 B,至此,理论上,打洞完成。AB之间能够互通了。还未通过本身试验,不知道对不对。

 

图中右上角步骤2中的文字“...给NAT211.134.*”应该是错误的,正确的应该是“211.133.*”,由于是 S 让 B 去链接 A,而 A 的地址是 211.133.*,另外还有几点疑惑和说明的地方

 

1. “信息不请自来,NAT 安全起见,是会被丢弃的”——A->NA->S 时,NA 接到请求会建立 session ,分配某端口如6000对应 A ,目的是接到发到 6000 端口上的信息就知道转发给 A,但只会接受当初 A 所请求的远程主机 S 所发过来的信息才会转发给 A,其它地址则会丢弃。这也是为何两个内网不能直接互发的缘由,举个例子就是洞还没打,外界发过来的信息,也会被看门人 NA 给扔掉,因 NA 那有一个记录表,A 曾经要求链接 S,这条记录就会有关于 S 的信息,好比另外一台 S2 发过来一样的 6000 端口信息,因为 NA 没有记录不认识 S2 ,是会丢弃不会转发的。 

 

2. 打洞要从内部向外部打,S 想链接 A,A 向 S 打洞(发起链接)。A 想链接 B,要经过 S 告诉 B 让 B 向 A 打洞,B 打完 A 沿此路打回去,才能成功。

 

出处:http://www.cnblogs.com/wzsblogs/p/5341078.html

相关文章
相关标签/搜索