NAT简介

  • 在计算机网络中是一种在IP数据包通过路由器或防火墙时重写来源IP地址或目的IP地址的技术。这种技术被普遍使用在有多台主机但只通过一个公有IP地址访问互联网的私有网络中。它是一个方便且得到了广泛应用的技术。当然,NAT也让主机之间的通信变得复杂,导致了通信效率的降低。

6ec07d3cdb89b3f2c0493d1021092089.png

NAT产生的原因有两种

  • 第一种是IPv4的地址不够,解决IPv4地址不够有两种方案,其中最好的是使用IPv6,IPv6的地址池更多,基本上每台主机都有自己的IP地址。还有一种就是进行NAT穿越,就是内网数万台主机都有自己的IP地址,但是映射到外网只有一个IP地址或者几个IP地址,它通过端口好来区分每一台主机,那就形成了一对几百或者以对几万,大大减少了公网IP地址的使用。
  • 第二个是处于网络安全的考虑。
  1. NAT
  • ==尽管有许多穿越NAT的技术,但没有一项是完美的,这是因为NAT的行为是非标准化的==

  • NAT这一意义重大的技术,竟然没有公认的发明者。NAT第一个版本的RFC作者,只是整理归纳了已被广泛采用的技术。

  • RFC1918规定了三个保留地址段落:---。这三个范围分别处于A,B,C类的地址段,不向特定的用户分配,被IANA作为私有地址保留。这些地址可以在任何组织或企业内部使用,和其他Internet地址的区别就是,仅能在内部使用,不能作为全球路由地址。这就是说,出了组织的管理范围这些地址就不再有意义,无论是作为源地址,还是目的地址。对于一个封闭的组织,如果其网络不连接到Internet,就可以使用这些地址而不用向IANA提出申请,而在内部的路由管理和报文传递方式与其他网络没有差异。

  • NAT穿透协议

    • STUN TURN

两种转换方式

  • 基本网络地址转换 NAT
    • 静态NAT(Static NAT) 是一种网络地址转换技术,其核心特征是 一对一的固定地址映射。根据RFC 2663的定义,静态NAT可分为两种类型:
      1. 纯IP地址映射(无端口修改):仅替换内网IP地址为公网IP地址,不修改端口号(如 :80 → 203.0.113.5:80)。
      2. 静态端口映射(IP+端口绑定):固定映射内网IP的特定端口到公网IP的指定端口(如 :8080 → 203.0.113.5:80)。
      • 静态NAT修改IP地址时,需重新计算以下校验和:
        1. IP头部校验和:必须更新,因IP地址改变。
        2. 传输层校验和:若端口未修改(纯IP映射),TCP/UDP伪头部的IP地址变化仍会导致校验和失效,需重新计算。
        3. 应用层数据:若数据包含IP地址信息(如自定义协议),也需同步更新。

base_translation.png

  • 网络地址端口转换 NAPT
    • 这种方式支持端口的映射,并允许多台主机共享一个公网IP地址。
      支持端口转换的NAT又可以分为两类:源地址转换和目的地址转换。前一种情形下发起连接的计算机的IP地址将会被重写,使得内网主机发出的数据包能够到达外网主机。后一种情况下被连接计算机的IP地址将被重写,使得外网主机发出的数据包能够到达内网主机。实际上,以上两种方式通常会一起被使用以支持双向通信。
      port_translation.png

NAT 的副作用以及解决方案

  • 副作用
    • 对等网络传输需穿透NAT:IP协议的定义中,在理论上,具有IP地址的每个站点在协议层面有相当的获取服务和提供服务的能力,不同的IP地址之间没有差异。但NAT工作原理破坏了这个特征,如需实现真正意义上的对等网络传输,则需要穿透NAT。这是本文重点。
    • 应用层需保持UDP会话连接:由于NAT资源有限,会根据一定规则回收转换出去的资源(即ip/port组合),UDP通信又是无连接的,所以基于UDP的应用层协议在无数据传输、但需要保持连接时需要发包以保持会话不过期,就是通常的heartbeat之类的。
    • 基于IP的访问限制策略复杂化
  • 国内移动无线网络运营商在链路上一段时间内没有数据通讯后, 会淘汰NAT表中的对应项, 造成链路中断。
    • NAT带来的第一个副作用:NAT超时:
      而国内的运营商一般NAT超时的时间为5分钟,所以通常我们TCP长连接的心跳设置的时间间隔为3-5分钟
    • NAT带来的第二个副作用就是:NAT墙。
      NAT会有一个机制,所有外界对内网的请求,到达NAT的时候,都会被NAT所丢弃,这样如果我们处于一个NAT设备后面,我们将无法得到任何外界的数据。

例如:sdp双方交换ip和端口信息,从而进行端到端的通讯

但是这种机制有一个解决方案:就是如果我们A主动往B发送一条信息,这样A就在自己的NAT上打了一个B的洞。这样A的这条消息到达B的NAT的时候,虽然被丢掉了,但是如果B这个时候在给A发信息,到达A的NAT的时候,就可以从A之前打的那个洞中,发送给到A手上了。

简单来讲,就是如果A和B要进行通信,那么得事先A发一条信息给B,B发一条信息给A。这样提前在各自的NAT上打了对方的洞,这样下一次A和B之间就可以进行通信了。

不同类型的NAT

NAT.png

  1. 完全圆锥型NAT
  • 完全圆锥型NAT(Full cone NAT),即一对一(one-to-one)NAT
    一旦一个内部地址(iAddr:port)映射到外部地址(eAddr:port),所有发自iAddr:port的包都经由eAddr:port向外发送。任意外部主机都能通过给eAddr:port发包到达iAddr:port(注:port不需要一样)

    就是当内网中的某一台主机经过NAT映射形成一个外网的IP地址和端口,也就是外网所有的主机,只要知道这个地址都可以向这个地址发送数据,基本上就是没有什么限制,这就是安全性比较低的一种类型,也就是谁都能来。
    完全圆锥型NAT
    完全锥型是非常简单的 ,左边是内网的主机,它有自己的内网IP地址和端口 ,通过防火墙之后,它形成一个外网的IP地址,那么外网的三台主机要想与内网的主机进行通信的时候,首先要由内网的主机向外发送一个请求,请求外网中的其中一台主机,这样会形成的结果就是它会在NAT服务上打 一个洞,这样会形成一个外网的IP地址和端口,那么形成了外网的IP地址和端口之后,其他的主机只要获得了这个IP地址和端口它都可以向它发送数据。并且可以顺利的通过防火墙发送给内网的主机。这样就可以进行通讯了,这是完全锥型,也是最好穿越的一种 NAT类型。但是安全性就差很多。
    NAPT-1.png

  1. 受限圆锥型NAT
  • 内部客户端必须首先发送数据包到对方(IP=X.X.X.X),然后才能接收来自X.X.X.X的数据包。在限制方面,唯一的要求是数据包是来自X.X.X.X。
  • 内部地址(iAddr:port1)映射到外部地址(eAddr:port2),所有发自iAddr:port1的包都经由eAddr:port2向外发送。外部主机(hostAddr:any)能通过给eAddr:port2发包到达iAddr:port1。(注:any指外部主机源端口不受限制,但是目的端口必须是port2。只有外部主机数据包的目的IP 为 内部客户端的所映射的外部ip,且目的端口为port2时数据包才被放行。)

    受限圆锥型NAT 又称为地址限制锥型NAT:
    也就是大家觉得完全锥型安全性问题太大了,那就做一些限制,也就是请求出去的时候会记录一下出去的IP地址,那么当你回来的时候只有这台地址的主机才能给我回消息,对于公网上的其他地址来说,我一检查IP地址不对,就给PASS掉。这种就是地址限制型。只要我没向你发送过请求,你直接向我发数据,这是不允许的。
    受限圆锥型NAT
    它的安全性好一些,它会在防火墙上形成一个五元组,就是内网主机的IP地址和端口和映射后的公网IP地址和端口以及我要请求的这个主机IP地址,他们首先有一个公共的步骤,第一步就是要先由内网的主机向外网发送一个请求,在这个防火墙上或者NAT服务上形成一个映射表,那形成之后外网的主机就可以和内网的主机进行通讯了。
    NAPT-2.png

  1. 端口受限圆锥型NAT
  • 类似受限制锥形NAT(Restricted cone NAT),但是还有端口限制。
  • 一旦一个内部地址(iAddr:port1)映射到外部地址(eAddr:port2),所有发自iAddr:port1的包都经由eAddr:port2向外发送。
  • 在受限圆锥型NAT基础上增加了外部主机源端口必须是固定的。

    端口限制型就是在IP地址的限制基础上又增加了对端口的限制,也就是我发送信息的时候会给主机的某个应用的某个端口发送数据,那么你回来的时候 ,只有这个端口回来的数据才接受,对于同一台主机其他端口发送过来的数据都拒绝接收。更何况 是其他的主机 了,所以它的限制更加严格。
    端口受限圆锥型NAT
    端口限制型就更加严格一些了,不光是对IP地址,还要对端口做限制,所以在这个防火墙上就形成了六元组,不光有内网的IP地址和端口以及映射后的公网的IP地址和端口,还有你请求的主机的IP地址和端口,那么在在这种情况下P这台主机,它发送消息的时候,如果请求的是P这台主机的这个q这个端口的服务,只有它这个服务才能返来,其他的端口(如:r端口)发送数据就不行了。
    NAPT-3.png

  1. 对称NAT
  • 每一个来自相同内部IP与端口,到一个特定目的地地址和端口的请求,都映射到一个独特的外部IP地址和端口。同一内部IP与端口发到不同的目的地和端口的信息包,都使用不同的映射
  • 只有曾经收到过内部主机数据的外部主机,才能够把数据包发回

    感觉类似端口受限NAT,只是同一个内部主机每次有新连接就是一个新的端口受限NAT
    NAPT-4.png

    当我进行NAT转换的时候,内网的主机出外网的时候形成的映射,并不是形成一个IP地址和端口,它会形成多个,对于访问不同的主机,它会形成不同的IP地址和端口,这就更加严格,想知道IP地址都很困难,比如说你通过这个地址请求A,那么A告诉B通过这个IP地址是可以访问,那B实际上是访问不通的。内网的主机与第三个主机连接的时候,它会新建一个IP地址 和端口,这个就更加复杂,这个对NAT穿越就提出了更高的要求,对于对称型的NAT基本上都是不能穿越的。
    对称NAT
    对称限制型就更加严格了,以前的类型是在防火墙上形成映射后的公网的IP地址是保持不变的,大家要找还是能找到它的,虽然不 通,但是对于 这个对称型它就不一样了,它就发生了变化,不光是形成了这个一个IP地址和端口,而且还会形成多个,对于每一台主机都会形成一个不同的IP地址和端口对,所以这个 时候当内网主机给Pq发送请求的时候,Pq可以回来信息,其他的都回不来。但是给M主机 n端口发送数据的时候,又形成一个C和d,这个M,n在发数据的时候不会像A,b发送数据,必须向C,d发送数据 才可以过来,这样才能进行互通,这个就是对称型的NAT穿越。这个就是对称型的NAT穿越。

  1. NAT的用途
  • 负载均衡:目的地址转换NAT可以重定向一些服务器的连接到其他随机选定的服务器。
  • 失效终结:目的地址转换NAT可以用来提供高可靠性的服务。如果一个系统有一台通过路由器访问的关键服务器,一旦路由器检测到该服务器宕机,它可以使用目的地址转换NAT透明的把连接转移到一个备份服务器上。
  • 透明代理:NAT可以把连接到因特网的HTTP连接重定向到一个指定的HTTP代理服务器以缓存数据和过滤请求。一些因特网服务提供商就使用这种技术来减少带宽的使用而不用让他们的客户配置他们的浏览器支持代理连接。

实际应用中的NAT穿透方法:

  • RTMFP
    • Adobe定义的一种UDP穿透NAT协议,在flash p2p中使用,也可以用openrtfmp的开源项目实现其他设备上的nat穿透。
  • STUN/TURN
    • IETF定义的一种UDP穿透规范,最为普遍。
      STUN/TURN协议详解
  • ICE
    • 包括ALG,STUN,TURN等各种穿透方式的组合。

NAT打洞