打开命令行输入 ipconfig 查询 ip 地址(私有地址);打开百度,输入 ip 查询,查询 ip 地址(公网地址),这两个地址是不一样的。
私有地址不能用在 Internet上 (路由器将丢弃寻址这种地址的包) 。这些地址是不能够在公网上面用的,只能用在局域网的内部。
私有地址有三种:①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。
工作原理
Network Address Translation,网络地址转换,就是替换 IP 报文头部的地址信息。NAT 通常部署在一个组织的网络出口位置,通过将内部网络 IP 地址替换为出口的 IP 地址提供公网可达性和上层协议的连接能力。
对于有 Internet 访问需求而内部又使用私有地址的网络,就要在组织的出口位置部署 NAT 网关,在报文离开私网进入 Internet 时,将源 IP 替换为公网地址,通常是出口设备的接口地址。一个对外的访问请求在到达目标以后,表现为由本组织出口设备发起,因此被请求的服务端可将响应由 Internet 发回出口网关。出口网关再将目的地址替换为私网的源主机地址,发回内部。这样一次由私网主机向公网服务端的请求和响应就在通信两端均无感知的情况下完成了。依据这种模型,数量庞大的内网主机就不再需要公有 IP 地址了。
一般使用私有 ip 作为局域网内部的主机标识,使用公网 ip 作为互联网上通信的标识。
在整个 NAT 的转换中,最关键的流程有以下几点:
- 网络被分为私网和公网两个部分,NAT 网关设置在私网到公网的路由出口位置,双向流量必须都要经过 NAT 网关;
- 网络访问只能先由私网侧发起,公网无法主动访问私网主机;
- NAT 网关在两个访问方向上完成两次地址的转换或翻译,出方向做源信息替换,入方向做目的信息替换;
- NAT 网关的存在对通信双方是保持透明的;
- NAT 网关为了实现双向翻译的功能,需要维护一张关联表,把会话的信息保存下来。
静态 NAT
如果一个内部主机唯一占用一个公网 IP,这种方式被称为一对一模型。此种方式下,转换上层协议就是不必要的,因为一个公网 IP 就能唯一对应一个内部主机。显然,这种方式对节约公网 IP 没有太大意义,主要是为了实现一些特殊的组网需求。比如用户希望隐藏内部主机的真实 IP,或者实现两个 IP 地址重叠网络的通信。
动态 NAT
它能够将未注册的 IP 地址映射到注册 IP 地址池中的一个地址。不像使用静态 NAT 那样,无需静态地配置路由器,使其将每个内部地址映射到一个外部地址,但必须有足够的公有因特网 IP 地址,让连接到因特网的主机都能够同时发送和接收分组。
NAT重载
这是最常用的 NAT 类型。NAT重载也是动态 NAT,它利用源端口将多个私网 ip 地址映射到一个公网 ip 地址(多对一)。它也被称为端口地址特换(PAT)。通过使用 PAT(NAT重载),只需使用一个公网 ip 地址,就可将数千名用户连接到因特网。其核心之处就在于利用端口号实现公网和私网的转换。
面对私网内部数量庞大的主机,如果 NAT 只进行 IP 地址的简单替换,就会产生一个问题:当有多个内部主机去访问同一个服务器时,从返回的信息不足以区分响应应该转发到哪个内部主机。此时,需要 NAT 设备根据传输层信息或其他上层协议去区分不同的会话,并且可能要对上层协议的标识进行转换,比如 TCP 或 UDP 端口号。这样 NAT 网关就可以将不同的内部连接访问映射到同一公网 IP 的不同传输层端口,通过这种方式实现公网 IP 的复用和解复用。这种方式也被称为端口转换PAT、NAPT或 IP 伪装,但更多时候直接被称为 NAT,因为它是最典型的一种应用模式。
举个例子,客户端 172.18.250.6 和百度服务器 202.108.22.5 通信,172.18.250.6 发送数据时,先转换为 219.155.6.240:1723(任意>1024的随机端口),然后再利用这个身份发送数据给百度服务器,然后百度服务器回应数据并发送给 219.155.6.240:1723,NAT 网关检查自己的关联表,意识到这是自己地私网中 172.18.250.6 的数据包,然后把这个数据发送给客户端。
也就是说,利用端口号的唯一性实现了公网 ip 转换为私网 ip 的这一步。PAT(NAT重载)能够使用传输层端口号来标识主机,因此,从理论上说,最多可让大约 65000 台主机共用一个公有 IP 地址。
NAT技术的优缺点
优点
- 节省合法的公有 ip 地址
- 地址重叠时,提供解决办法
- 网络发生变化时,避免重新编址。
缺点
- 破坏了 IP 端到端通信的能力。
IP协议的一个重要贡献是把世界变得平等。在理论上,具有IP地址的每个站点在协议层面有相当的获取服务和提供服务的能力,不同的IP地址之间没有差异。人们熟知的服务器和客户机实际是在应用协议层上的角色区分,而在网络层和传输层没有差异。一个具有IP地址的主机既可以是客户机,也可以是服务器,大部分情况下,既是客户机,也是服务器。端到端对等看起来是很平常的事情,而意义并不寻常。但在以往的技术中,很多协议体系下的网络限定了终端的能力。正是IP的这个开放性,使得TCP/IP协议族可以提供丰富的功能,为应用实现提供了广阔平台。因为所有的IP主机都可以服务器的形式出现,所以通讯设计可以更加灵活。使用UNIX/LINUX的系统充分利用了这个特性,使得任何一个主机都可以建立自己的HTTP、SMTP、POP3、DNS、DHCP等服务。与此同时,很多应用也是把客户端和服务器的角色组合起来完成功能。例如在VoIP应用中,用户端向注册服务器登录自己的IP地址和端口信息过程中,主机是客户端;而在呼叫到达时,呼叫处理服务器向用户端发送呼叫请求时,用户端实际工作在服务器模式下。在语音媒体流信道建立过程后,通讯双向发送语音数据,发送端是客户模式,接收端是服务器模式。而在P2P的应用中,一个用户的主机既为下载的客户,同时也向其他客户提供数据,是一种C/S混合的模型。上层应用之所以能这样设计,是因为IP协议栈定义了这样的能力。试想一下,如果IP提供的能力不对等,那么每个通信会话都只能是单方向发起的,这会极大限制通信的能力。细心的读者会发现,前面介绍NAT的一个特性正是这样一种限制。没错,NAT最大的弊端正在于此——破坏了IP端到端通信的能力。
- 使 IP 会话的保持时效变短。
因为一个会话建立后会在NAT设备上建立一个关联表,在会话静默的这段时间,NAT网关会进行老化操作。这是任何一个NAT网关必须做的事情,因为IP和端口资源有限,通信的需求无限,所以必须在会话结束后回收资源。通常TCP会话通过协商的方式主动关闭连接,NAT网关可以跟踪这些报文,但总是存在例外的情况,要依赖自己的定时器去回收资源。而基于UDP的通信协议很难确定何时通信结束,所以NAT网关主要依赖超时机制回收外部端口。通过定时器老化回收会带来一个问题,如果应用需要维持连接的时间大于NAT网关的设置,通信就会意外中断。因为网关回收相关转换表资源以后,新的数据到达时就找不到相关的转换信息,必须建立新的连接。当这个新数据是由公网侧向私网侧发送时,就会发生无法触发新连接建立,也不能通知到私网侧的主机去重建连接的情况。这时候通信就会中断,不能自动恢复。即使新数据是从私网侧发向公网侧,因为重建的会话表往往使用不同于之前的公网IP和端口地址,公网侧主机也无法对应到之前的通信上,导致用户可感知的连接中断。NAT网关要把回收空闲连接的时间设置到不发生持续的资源流失,又维持大部分连接不被意外中断,是一件比较有难度的事情。在NAT已经普及化的时代,很多应用协议的设计者已经考虑到了这种情况,所以一般会设置一个连接保活的机制,即在一段时间没有数据需要发送时,主动发送一个NAT能感知到而又没有实际数据的保活消息,这么做的主要目的就是重置NAT的会话定时器。
- 使依赖 IP 进行主机跟踪的机制失效。
NAT在实现上将多个内部主机发出的连接复用到一个IP上,这就使依赖IP进行主机跟踪的机制都失效了。如网络管理中需要的基于网络流量分析的应用无法跟踪到终端用户与流量的具体行为的关系。基于用户行为的日志分析也变得困难,因为一个IP被很多用户共享,如果存在恶意的用户行为,很难定位到发起连接的那个主机。即便有一些机制提供了在NAT网关上进行连接跟踪的方法,但是把这种变换关系接续起来也困难重重。基于IP的用户授权不再可靠,因为拥有一个IP的不等于一个用户或主机。一个服务器也不能简单把同一IP的访问视作同一主机发起的,不能进行关联。有些服务器设置有连接限制,同一时刻只接纳来自一个IP的有限访问(有时是仅一个访问),这会造成不同用户之间的服务抢占和排队。有时服务器端这样做是出于DOS攻击防护的考虑,因为一个用户正常情况下不应该建立大量的连接请求,过度使用服务资源被理解为攻击行为。但是这在NAT存在时不能简单按照连接数判断。