跳转至

NAT

RFC1918 规定了三个保留地址段落:10.0.0.0-10.255.255.255/8;172.16.0.0-172.31.255.255/12;192.168.0.0-192.168.255.255/16。这三个范围分别处于 A,B,C 类的地址段,不向特定的用户分配,被 IANA 作为私有地址保留。

对于有 Internet 访问需求而内部又使用私有地址的网络,就要在组织的出口位置部署 NAT 网关,在报文离开私网进入 Internet 时,将源 IP 替换为公网地址,通常是出口设备的接口地址。一个对外的访问请求在到达目标以后,表现为由本组织出口设备发起,因此被请求的服务端可将响应由 Internet 发回出口网关。出口网关再 将目的地址替换为私网的源主机地址,发回内部。这样一次由私网主机向公网服务端的请求和响应就在通信两端均无感知的情况下完成了。依据这种模型,数量庞大的内网主机就不再需要公有 IP 地址了。这也就是NAT(Network Address Translation,网络地址转换)做的事情。

NAT 缓解了 IPV4 地址不够用的问题,还可以隐藏私有网络,达到保护私有网络的目的。但是也带来很多问题:

  1. NAT 违反了 IP 的结构模型:结构模型声明每个 IP 地址均唯一标识了世界上的一台机器。 Internet 的软件结构也是建立在这样的事实基础之上的。
  2. NAT 打破了 Internet 的端·端的连接模型,即任何一个主机可在任何时间给任何一台其他主机发送数据包。因为 NAT 盒子上的映射是由出境数据包建立的,只能在出境数据包之后到达的入境数据包才能被接受。
  3. NAT Internet 从一个无连接网络改变成一个面向连接网络特有的形式。问题在于 NAT 盒子必须为每一个从它这里经过的连接维护必要的信息(即映射关系)。让网络维护连接状态是面向连接网络的一种特性,而不是无连接网络的特性。如果 NAT 盒子崩溃,并且它的映射表丢失,那么它的所有 TCP 连接都将被摧毁。
  4. NAT 违反了最基本的协议分层规则:第 k 层不应该对第 k+1 层在本层的有效载荷宇段中放什么作任何假设。这条基本原则可以保证层与层之间的独立性。
  5. Internet 上的进程并不一定必须使用 TCP 或者 UDP 。如果机器 上的一个用户决定使用一种新的传输协议与机器 上的用户进行通话(比如,一个多媒体应用),那么,由于 NAT 的介入,这样的应用将无法工作,因为 NAT 盒子将无法正确地定位到 TCP Source port。
  6. 有些应用以规定的方式使用多个 TCP/IP 连接或者 UDP 端口。例如,标准的文件传输协议(FTP, File Transfer Protocol) 在数据包正文插入地址,接收方正文中提取出这些地址,并使用它们。所以 FTP 服务无法正常工作,当然也可以专门为此打个补丁。

如果说一开始我们就能认识到 32 位的 IP 地址不够而使用 IPv6 就不用 NAT 这个打补丁的协议了,然而这就是现实,现实是受制于历史的发展进程的。另外,现在绝大多数的主机都处在内网内通过 NAT 协议访问 Internet。

NAT 的分类

RFC3489,NAT Variations。

  • Full Cone NAT(一对一 NAT):把所有相同(internal IP address,port)的请求映射到相同的(external IP address,port)。因此,任何一个外部主机均可通过该映射发送数据包到该内部主机。
  • Restricted cone NAT:限制性锥 NAT 把所有来自相同(internal IP address,port)的请求映射到相同的(external IP address,port)。但是, 和全锥 NAT 不同的是:只有当内部主机先给外部主机(某 IP 地址)发送数据包, 该外部主机(该 IP 地址)才能向该内部主机发送数据包。
  • Port restricted NAT:端口限制性锥 NAT 与限制性锥 NAT 类似, 不过又多了端口号的限制, 即只有内部主机先向(某外部地址:某端口号)对发送数据包, (该外部主机:该端口号)才能使用特定的端口号向内部主机发送数据包。所以说,上面三种类型依次更加严格。
  • Symmetric NAT:对称型 NAT 把从相同(internal IP address,port)到相同(destination IP address,port)地址和端口的所有请求,都映射到同一个(external IP address,port)。并且这个映射只有在所以这也是也这是最严格的类型。

NAT Tunnel

NAT Tunnel,翻译做 NAT 打洞或者 NAT 穿透,简单地讲就是要让处于不同 NAT 网络下的两个节点 (Peer) 建立直接连接。换言之,双方要交换自己的 (外网IP,TCP src port')