内 穿透工具的原理与开发实战
有时候,我们在外想要访问家里主机的资料,要么由于主机处于家庭路由器下,是非公 IP,要么就是是运营商随机分配的一个公 IP,都很难直接连上主机获取资料。那么,有什么办法可以解决这一难题案就是 内 穿透。
一、名词解释
为了理解内 穿透我们先来了解几个概念:
(1)私有地址
因特 域名分配组织IANA组织(Internet Assigned Numbers Authority)保留了以下三个IP地址块用于私有 络。
我们可以看到其中有1个A类地址块,32个B类地址块和256个C类地址块。
主流的家用路由器使用C类私有地址作为路由器LAN端的IP地址较多,所以我们可以看到路由器设置页面的IP一般都为192.168开头。
(2)DHCP(动态主机设置协议)
路由器怎么分配内 IP/p>
DHCP是一个局域 的 络协议,使用UDP协议工作,主要用于内部 络或 络服务供应商自动分配IP地址给用户,同时也可以作为内部 络管理员作为对所有电脑作中央管理的手段。
(3)NAT( 络地址转换)
NAT(Network Address Translation)即 络地址转换,NAT能将其本地地址转换成全球IP地址。利用路由器作为内 和公 的划分,将内 与外 进行映射,并负责这两者的信息传递。
路由器负责将内 的IP与端口 映射到公 的IP与端口 ,并以该IP与端口 与外 进行通讯,并作为中间桥梁控制其间的数据传输。
目前,NAT的主要技术类型有 静态NAT 、动态NAT 和 络地址端口转换NAPT(Port-Level NAT)三种。
静态NAT设备中NAT地址映射表确定了一个内部IP地址与一个全局IP地址的对应关系(一一对应),只要管理员不重新设置,这种对应关系就一直保持。——即用户被分配到的是静态公 IP。
动态NAT设备被管理员分配了一些全局IP地址,这些全局的IP地址构成了NAT地址池,当内部主机需要访问外部 络时,设备就会在NAT地址池中为该主机选择一个目前未被占用的IP地址,当通信结束时,NAT设备将会收回该全局IP地址。——即用户被分配到的是动态公 IP。
络地址端口转换NAPT(Port-Level NAT)是目前最常使用的一种NAT类型,较为成功的解决了目前IP地址短缺问题,通过分配不同端口,是内部 络的多个主机和用户共享少数几个全局IP地址。但是,这也使得外部的 络主机不能主动访问内部 络中的主机,这是由于NAT地址映射表中不存在到达内部机器的映射,因此,外部主机发起的访问内部机器的数据 在到达NAT设备时将被抛弃,这种隐藏内部主机的方式,一定程度上提高了内部 络的安全性,但也给一些 络应用(如P2P)带来了一些问题,那些应用常常希望内部 主机和外部 主机之间能够自由的进行通信。
此外,NAPT同样可以配置地址池。配置NAPT功能后,NAT转换时,首先将复用地址池中所选择的地址,端口达到能力极限后, 再选择另一个地址完成转换。对比单一的多对多地址转换,这可大大减少地址池中公有地址的数目。
下面进一步介绍NAPT(Port-Level NAT)的工作原理。点此查看NAPT类型与测试方法
(4)NAPT( 络端口地址转换)
将多个内部地址映射为一个合法公 地址,但以不同的协议端口 与不同的内部地址相对应,也就是<内部地址+内部端口>与<外部地址+外部端口>之间的转换。
如果内 有主机向公 设备发起了请求,内 主机的请求数据包传输到了NAT 关上,那么NAT 关会修改该数据包的源IP地址和源端口为NAT 关自身的IP地址和任意一个不冲突的自身未使用的端口,并且把这个修改记录到那张映射表上。最后把修改之后的数据包发送到请求的目标主机,等目标主机发回了响应包之后,再根据响应包里面的目的IP地址和目的端口去映射表里面找到该转发给哪个内 主机。这样就实现了内 主机在没有公 IP的情况下,通过NAPT技术借助路由器唯一的一个公 IP来访问公 设备。
举例:内 机器(192.168.1.101) 访问目标主机(1.2.3.4)
1、客户机发送数据包:
目的主机 1.2.3.4
目的端口 80
源主机 192.168.1.101 (内 的私有IP)
源端口 1920 (随机打开)
2、进行地址转换
目的主机 1.2.3.4
目的端口 80
源主机 2.3.4.5 (NAT服务器的公 IP)
源端口 2345 (随机打开)
3、记录映像
192.168.1.101 tcp 1920 —– 2.3.4.5 tcp 2345
4、外部 络主机向NAT主机发送响应信息
目的主机 2.3.4.5
目的端口 2345
源主机 1.2.3.4
源端口 80
5、查找映像关系将数据包发给客户机
目的主机 192.168.1.101
目的端口 1920
源主机 2.3.4.5
源端口 2345
(5)DDNS(动态域名解析)
DDNS是将用户的动态IP地址映射到一个固定的域名解析服务上,用户每次连接 络的时候客户端程序就会通过信息传递把该主机的动态IP地址传送给位于服务商主机上的服务器程序,服务器程序负责提供DNS服务并实现动态域名解析。
(6)端口映射
公 ip只是路由器的,要实现外 访问,还需要设置端口映射把内 中的机器映射到公 去。端口映射就是将公 IP地址的一个端口映射到内 中一台机器,提供相应的服务。当用户访问该IP的这个端口时,服务器自动将请求映射到对应局域 内部的机器上。
端口映射过程就如同:你的朋友来找你,找到小区门口,不知道你住在几层,然后问保安,保安查到你的名字然后告诉你在几楼,所以你的朋友很轻松的找到了你的家,在这个过程中,保安通过业主的名字查到业主的门牌 这就是一种映射关系。
端口映射 不等于 端口转发
端口映射 不等于 端口转发
端口映射 不等于 端口转发
端口映射:
端口转发(有时被叫做隧道):
相同效果:如果公 ip为 x.x.x.x,在浏览器中输入x.x.x.x:端口a,即可看到内 服务器端口b下的实时画面。
不同原理:端口映射发生于节点与路由/ 关之间,以NAT(Network Address Translation, 络地址翻译)为原理;而端口转发以反向隧道、反向代理为原理,需要借助一台公 IP服务器转发端口,发生于两个 络节点的端口之间。
二、内 穿透概要
1. 基本情况介绍
在互联 中唯一定位一台主机的方法是通过公 的IP地址,但固定IP是一种非常稀缺的资源,不可能给每个公司都分配一个,且许多中小公司不愿意为高昂的费用买单,多数公司直接或间接的拨 上 ,电信部门会给接入 络的用户分配IP地址,以前上 用户少的时候基本分配的都是临时的静态IP地址,租约过了之后可能会更换成另一个IP地址,这样外 访问就不稳定,因为内 的静态IP地址一直变化,为了解决这个问题可以使用动态域名解析的办法变换域名指向的静态IP地址。但是现在越来越多的上 用户使得临时分配的静态IP地址也不够用了,电信部门开始分配一些虚拟的静态IP地址,这些IP是公 不能直接访问的,以前单纯的动态域名解析就不好用了。
关于如何判断自己家庭 络是否是公 IP:
首先如果发现ip在上文讲私有地址时提到的三个用于私有 络的IP地址块中,那么排除公 IP可能。使用保留地址的 络只能在内部进行通信,而不能与其他 络互连。
其次,对比 路由自动分配的IP(WAN口地址)与 络查询到的本机IP地址 是否一致,如果不一致,则不具有公 IP。
此处有一个坑,在使用长城宽带等第三方宽带运营商提供的 络服务环境下,直接在 页输入IP回显的IP地址一般和WAN口IP地址相同,这样很容易产生错误判断,上面提供的 址( 址右边显示的IP)有效解决了这个误导。
最后,使用 tracert 来查看跟踪,第一跳是路由器 关,如果后面的每一个hops不是内 IP,那么自己就是外 IP了,反之,如果自己是内 IP,那么hops显示的就是 关的内 IP,下面的例子显然说明是外 IP,但此方法针对长城宽带等第三方宽带运营商 络判断无效。
Step 2 端口映射或DMZ映射
例如你的公 ip为 x.x.x.x,这些设置完以后就可以在浏览器中输入x.x.x.x:9000,即可看到实时画面。
(2) 拥有动态公 IP情况下(动态NAT设备):
这种情况下依然可以做端口映射,但是由于IP地址不固定,所以需要通过方法来告知连接者IP到底是多少。解决这个问题可以采用DDNS(动态域名解析)技术。
Step 1 路由器静态分配内 IP
Step 2 端口映射或DMZ映射
Step 3 动态域名解析
DDNS(动态域名解析)技术就是首先获得一个域名,并要求内 设备每隔一段时间对于DDNS服务器发起请求,DNS服务器将请求的IP记录下来并且刷新相关域名的解析记录。最终可以通过该域名找到当前的IP地址。
(3) 家庭路由器上面一层连接的是ISP的另一层路由器,甚至有层层链接情况下:
(4) NAT类型为NAPT(非Full Cone)情况下:
这两种情况下,通过固定IP并在自己的路由器上设置映射是没有作用的。需要使用内 穿透技术。
3. 内 穿透原理
内 穿透,又叫NAT(Network Address Translation)穿透。对于在NAT之后的节点来说,其不是不能主动访问公 端口,而是不能反过来有效的被公 访问。内 穿透的主要思路就是利用这一点,让在NAT之后的节点主动访问一个拥有公 IP地址的服务器,并由中间服务器搭桥,打通经过该服务器从其他主机到NAT之后节点的隧道。
同样该技术除了可以访问隐藏在NAT之后的节点,同样可以穿透防火墙。由于防火墙只拦截了入站没有拦截出站,所以可以让防火墙内的服务器主动连接到一个公 服务器打通隧道,并通过该隧道最终链接到本地的其他端口。
Step 1:打通隧道
出于安全起见,除非是主机主动向对方发出了连接请求(这时会在该主机的数据结构中留下一条记录),否则,当主机接收到数据包时,如果在其数据结构中查询不到对应的记录,那些不请自来的数据包将会被丢弃。因此,位于不同局域 内的两台主机,即使是知道了对方的 IP 地址和端口 ,“一厢情愿”地将数据包发送过去,对方也是接收不到的,所以我们首先需要打通隧道。
假设公 IP为X.X.X.X,内 IP为192.168.1.2。公 主机先监听80端口,监听这个端口是用于向外部提供一个HTTP服务,80是WEB服务器的默认端口。同时其他任意一个端口(这里我们假设为7777),监听这个端口是用于让内 服务器主动连接进来打通一个隧道。接着内 再主动向公 主机的7777发起一个请求,这样内 就成功与公 主机建立了一个连接通道。然后当有任何客户端主动连接公 的80端口时,公 接收到连接请求之后马上把这连接请求通过先前建立好的隧道转发到内 主机。
Step 2:端口转发(公 主机80端口 转发至 内 80端口)
当有任何客户端主动连接公 的80端口时,公 接收到连接请求之后马上把这连接请求通过先前建立好的隧道转发到内 主机,内 主机接收到来自隧道的数据包后再主动连接内 主机自身的80端口,连接成功之后将数据包原封不动地转发数据包给80端口。
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!