一般来说网络服务需要部署在具有外网IP的机器上,否则只能同网络的机器访问,内网穿透的目的是为了实现内网机器上部署的服务也能同公网机器部署的服务一样所有联网的机器都能访问它。

内网穿透的意义:
  1. 出于安全或者信息隐藏,比如通过反向代理内网的http 服务
  2. 低成本部署网络服务 
  3. 学习研究

内网环境示意图
    


    我们只有对PC1/2/3的控制权,部署在PC1上的服务只能同网络的 PC2,PC3 访问,外部用户A因为不知道地址无法访问,也不能穿过层层的NAT 防火墙,内网穿透的目的就是让外网用户A 可以访问到部署在内网PC1上的服务。


内网穿透的方法
  1. 通过反向代理转发数据包
  2. 使用公网机器中转数据包
  3. 直连穿透,在用户和内网两个nat 防火墙之间直接对发数据包
下面我们分别研究下这三种方法的部署情况和可能面临的问题。

反向代理内网穿透

在对各层级的NAT服务器有控制权的情况下可以配置端口转发实现内网穿透,这种只在企业服务上有使用,家庭网络没法实现。


使用公网机器穿透

    

实现方法步骤:
1. 在内网网络的某台机器上部署 “内网端” 服务,也可以直接在内网服务的机器上部署,比如PC1上
2. 在有公网的机器上部署 “服务端”

3. 内网端主动请求服务端,并使用心跳保持流量通道

4. 服务端收到外部用户请求时,使用内网端和服务端的流量通道,将请求转发到内网机器,同样内网端的响应也使用通道转发到外部用户


说明:
内网端和服务端,以及外部用户A和服务端之间的流量是允许通过的,而内网端所在机器同PC1,PC2,PC3属于同一子网,可以直接访问,因此我们只要保持内网端和服务端的流量通道,使用这个通道就可以实现将用户A 的请求转发到内网端网络的每一台机器,同样的内部服务的响应也能转发给外部用户。

优点:可穿透任何 nat 服务器
缺点:所有流量需要经过外网服务器中转


NAT 直连穿透



NAT 直连穿透的目的:建立内网nat和用户外网nat 之间的直通,使流量不经中间服务器,流量路径如图中的红色线。
NAT 直连穿透需要数据包穿越NAT 防火墙,下面我们分析下 nat 防火墙的类型以及穿透方法。


Nat防火墙 - UDP 地址转换概况


当内网上的机器访问外网服务时, nat 防火墙会给内网机器建立nat 映射,防火墙根据这个映射关系实现数据包的过滤和流量转发,如图:内网PC1 访问公网服务时 nat 防火墙建立两个关联的映射关系:nat 和内网, nat 和外网。


锥型 nat 防火墙


锥形防火墙同一个内网地址,只会有一个出口地址与其对应, 即对于 ip1,port1, 不论它访问 ipA,portA 还是其他的 ipA/portB, ipC/portC, ipC/portC 都会使用同一个地址 ip2/port2,此类 nat 防火墙有三种包过滤策略:

1. 无限制型  nat 防火墙

ip2/port2 建立映射后可以接受任何地址向它发送的数据包,并转发到内网地址 ip1/port1。


2. 限制 ip 型 nat 防火墙

ip2/port2 只接受它曾经发出过包的目标ip地址的来包,比如nat 曾经向 ipA/portA, ipC/portC 发出过包则任何来自 ipA,ipC 的数据包都会接收,但它没有发送过的比如 ipD 的数据包会被丢弃。


3. 限制ip/port 型

    ip2/port2 只接受它曾经发出过目标ip/port的来包,比如nat 曾经向ipA/portA 发送过包,则来自 ipA/portA的数据包都可以接收,其它地址,比如ipA/portB, ipC,portA 的数据包都会被丢弃。


    说明:锥形防火墙在穿透前需要被穿透方先发送数据包,这种防火墙是最容易穿透的,因为地址不变,我们只需使用同一内网地址先发送数据包到穿透服务器,穿透服务器将nat 双方的出口地址告诉对方,双方互发数据包即可,真正难以穿透的nat 是接下来要讲的  “对称型 nat 防火墙”。


对称型 nat 防火墙


对称型 nat,对于同一内网地址,在其访问不同的目标地址时都会分配新的外网端口, 地址对呈现的形状不再是锥形而是一对一的平行线型,对称型NAT,内网地址在  nat 和 外网之间的地址是1对1的。
对称型 nat 防火墙会对来源数据包的Ip/port 过滤,同ip/port 锥形防火墙一样只接受它曾经发送过数据包的地址,同一内网地址每次访问不同的外网地址都会分配新的随机端口,因此对同一内网地址,nat 防火墙映射后的出口地址最多可以有3w+。
对称型 nat 由于端口会发生变化因此我们不能再使用它访问穿透服务器时的地址, 数据包要穿透 nat 则只能靠盲猜,如下图:



内网端地址映射:

    ip1/port1 -> ip2/port_x-> ipo_2/port_A
外网端地址映射:

    ip_o1/port_o1->ip_o2/port_o2 ->ip2/port_n


当且仅当有个地址对满足:

    port_x 等于 port_n 并且 port_o2 等于 port_A 时穿透才能成功


对于对称型防火墙,使用蛮力碰撞即使双方暴力了所有随机端口,nat 防火墙也很可能打不穿。


更多分享请关注个人微信公众号: 


本文系本站原创,转载请注明出处:http://xrkmonitor.com/a/investigation_inner_acl.html