前文:
关于“内网穿透”的一些知识(续)
——————————
根据前文可以知道,有两种情况下是无法打洞互联的,必须使用中转服务器进行通信中转:
4. 一方为端口Port Restricted Cone,另一方为Symmetric NAT
无法打洞互联,只能中继服务器中转。
5. 双方都为Symmetric NAT
无法打洞互联,只能中继服务器中转。
第4种情况不能互联是因为Port Restricted Cone要求必须知道对方的公网端口(只有知道对方公网对口才能发送数据给该端口,从而实现对该端口数据的接收),而Symmetric NAT是使用随机端口的(无法知道每次通信使用的公网端口是哪个);第5种情况是业务Symmetric NAT同样要求必须知道对方的公网端口(主动发送数据的一方必须知道对方的建立映射关系后的公网端口,以保证对方使用该端口来发送回数据以实现打洞的目的),而对方也是Symmetric NAT是使用随机端口的,无法确定每次通信时对应的公网端口。
但是针对第4种情况下,也有一种在一定概率上可以实现打洞互联的技术,叫做“端口预测”,其实就是对对方为Symmetric NAT情况下使用的公网端口进行猜测,本文主要讲下这个内网穿透打洞中的“端口预测”技术。
假设:
B主机的外网IP:222.33.22.22 内网IP:192.168.2.222
A主机与B主机的映射关系:
内网:192.168.1.100:3333 ——> A的公网:222.22.22.22:2222 ——》B的公网:222.33.22.22 ——》B的内网:192.168.2.222
此时我们假定一个主机的合法端口为30000个,A主机使用上面的映射关系对B主机的30000个端口发送数据,也就是A使用内网:192.168.1.100:3333 ——> A的公网:222.22.22.22:2222这个映射关系对B主机的公网IP的30000个端口发送数据;B主机使用某个映射关系向A主机的公网:222.22.22.22:2222发送数据,假设此时的B主机的端口为5555,那么B的映射关系为B的公网:222.33.22.22:xxx ——》B的内网:192.168.2.222:5555;由于此时的B的公网端口xxx虽然未知,但是一定在A主机发送的30000个不同端口号的访问数据中,因此该种方式一定可以使这个数据包穿过A主机的NAT设备而被A主机接收到,从而实现打洞。
但是,该种方式只能在一定概率上实现。因为A主机向B主机的公网IP一次性发送30000个数据包需要一定的时间,同时短时间内发送大量的数据其实可以被看做是一种网络攻击(端口扫描技术),可能会被A主机所在内网的防火墙屏蔽,有可能被B主机所在内网的防火墙屏蔽,同时A主机所在内网的NAT设备为一个内网的IP保持30000个映射关系也是很难实现的,因为这很可能超过了A主机所在网络的NAT设备的缓存表大小,比如一个Port Restricted Cone类型的NAT设备为某个内网IP最多保留5000个映射关系等;因此使用该种方式只能在一定概率上成功,所以该种方式最好的形式就是A主机使用最有可能的一些B主机的公网端口来发送数据,比如B主机最有可能使用的5000个公网端口,当然该种方式只要网关设备不将这种端口扫描行为判断威胁而屏蔽掉我们完全可以有把30000个可能端口挨个试一遍。
A主机对B主机可能的公网端口发送的一次数据假设为500B,一次性发送30000个数据包,网速为100Mb/s,30000*500B/100Mb/s=1.2秒,考虑到一定的延迟,只要网关设备允许这种端口扫描或者在猜测端口的时候比较准(第一次发送的5000个端口数据中就有真正的端口)那么就可以成功打洞。
针对第5种情况,双方都为Symmetric NAT,“端口预测”技术如何实现打洞:
假设:
A主机的外网IP:222.22.22.22:xxx 内网IP:192.168.1.100:3333
B主机的外网IP:222.33.22.22:yyy 内网IP:192.168.2.222:5555
希望获得的信息:A主机与B主机的映射关系:
A内网:192.168.1.100:3333 ——> A的公网:222.22.22.22:xxx ——》B的公网:222.33.22.22:yyy ——》B的内网:192.168.2.222:5555
假设内网主机在访问一个外网IP的任一端口时其公网端口是不变的,在这里就是A主机对B的公网IP端口扫描时xxx是固定不变的值。如同第4种情况,A主机向B的公网IP的30000个端口进行扫描,而B主机对A公网IP的30000个端口进行扫描,也就是说只有在A发给B公网的端口正好为yyy并且B发给A的公网端口正好为xxx时才可以建立互联。但是由于NAT设备的地址映射表的限制不可能为一个内网IP和内网端口保存如此多的映射关系,比如NAT设备可以为一个内网IP和内网端口保存的映射关系为5000个,A、B之间对彼此公网端口的扫描都是在顺序进行的情况下彼此第一次扫描对方端口可以实现连接建立的可能性为1/36,如果NAT设备的映射表中的旧数据不能被新映射关系抢占那么就需要自动等待过期,而这个过期时间大致需要2分钟,因此在双方都是Symmetric NAT的情况下通过“端口预测”建立互联的概率是比较低的,毕竟即使不存在网关防火墙防御的问题也不可能为建立连接而花费大量的扫描时间。在NAT设备中如果对内网IP和端口的映射关系有一个上限数量的情况下,比如这里假设的数量为5000,那么在一个时刻点允许打洞的对方公网端口也就只有这5000个,而这5000个对方公网端口号还正好是对方正在使用的公网端口号并且对方也正好扫描到自己的公网端口号,这个概率是比较低的,所以在双方都为Symmetric NAT的情况下“端口预测”技术是难以在较短时间内实现打洞的,因此在实际中可行性较差。
参考:
https://www.cnblogs.com/colin-vio/p/13323228.html
https://blog.csdn.net/u011060906/article/details/129533798
——————————