NAT(Network Address Translation)网络地址转换,即在私有地址和全局地址之间转换的协议。私有地址是不能用在 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
。这些 IP 地址是用于私有的网络,与之对应的是全局地址,就是正规的自己电脑的地址,全网络承认。
NAT 协议的工作过程如下所示:
![](https://i-blog.csdnimg.cn/blog_migrate/4231745aa971d7a30ca759de8a885a22.png#pic_center)
假设一个私有地址为 10.1.0.2
的主机想访问互联网服务器 162.105.192.12
,那么首先它首先把消息发出给 NAT 路由器。路由器记录了它的内网地址和端口,并且给它分配一个全局地址和全局端口。这个地址关系记录在 NAT 路由表中。之后按照目的地址发给服务器。一段时间之后,服务器回应了请求给 NAT 路由器,那么路由器根据目的地址和端口(此时是全局的)按照 NAT 路由表转换为对应的主机地址,再发送给主机,这样主机就收到了服务器的回应。
从上面的过程就能看到 NAT 路由器的作用:针对出境包源地址进行替换;在 NAT 转换表中记录映射关系;针对入境包目标地址进行替换。
NAT 的路由表如下所示:
![](https://i-blog.csdnimg.cn/blog_migrate/3c2b6c71c2f39bdcb6cf8b6d39d70fe0.png#pic_center)
功能
NAT 不仅能解决 IP 地址不足的问题,而且还能够有效地避免来自网络外部的攻击,隐藏并保护网络内部的计算机。作用是把内网的私有地址,转化成外网的公有地址。使得内部网络上的(被设置为私有 IP 地址的)主机可以访问 Internet。
- 宽带分享:这是 NAT 主机的最大功能。
- 安全防护:NAT 之内的 PC 联机到 Internet 上面时,他所显示的 IP 是 NAT 主机的公共 IP,所以 Client 端的 PC 当然就具有一定程度的安全了,外界在进行 portscan(端口扫描) 的时候,就侦测不到源 Client 端的 PC 。
实现方式
NAT 的实现方式有三种,即静态转换 Static Nat、动态转换 Dynamic Nat 和端口多路复用 OverLoad。
- 静态转换是指将内部网络的私有 IP 地址转换为公有 IP 地址,IP地址对是一对一的,是一成不变的,某个私有IP地址只转换为某个公有IP地址。借助于静态转换,可以实现外部网络对内部网络中某些特定设备(如服务器)的访问。
- 动态转换是指将内部网络的私有 IP 地址转换为公用 IP 地址时,IP 地址是不确定的,是随机的,所有被授权访问上 Internet 的私有 IP 地址可随机转换为任何指定的合法 IP 地址。也就是说,只要指定哪些内部地址可以进行转换,以及用哪些合法地址作为外部地址时,就可以进行动态转换。动态转换可以使用多个合法外部地址集。当 ISP 提供的合法 IP 地址略少于网络内部的计算机数量时。可以采用动态转换的方式。
- 端口多路复用是指改变外出数据包的源端口并进行端口转换,即端口地址转换(PAT, Port Address Translation)。采用端口多路复用方式。内部网络的所有主机均可共享一个合法外部 IP 地址实现对 Internet 的访问,从而可以最大限度地节约 IP 地址资源。同时,又可隐藏网络内部的所有主机,有效避免来自 Internet 的攻击。因此,目前网络中应用最多的就是端口多路复用方式。
1 NAT 原理
1.1 NAT 路由器
家庭网络可以是都由私有地址而组成的专用网络,这种地址进对网络中的设备有意义的网络,可以称之为具有专用地址的地域。由于现在存在着数十万家庭网络,有很多的设备都在使用私有地址,而此时当全球因特网进行收发分组时,私有地址的编址问题应该如何解决?NAT 技术就可以化解这个难题,接下来我们来谈一下 NAT 技术原理。
装有 NAT 软件的路由器叫做 NAT 路由器,NAT 路由器具有一个接口,连接一个具有相同网络前缀的网络。NAT 能够使得路由器对于外界而言不像是一个路由器,而是使得 NAT 路由器对外界的行为就像是一个具有单一 IP 地址的单一设备,从本质上讲 NAT 使得路由器对外界隐藏了家庭网络的细节。也就是说对于外界而言,发给一个家庭网络的所有数据报都会被 NAT 路由器接收进来。
![](https://i-blog.csdnimg.cn/blog_migrate/049ae3899bca73fbc2e0199dfadf0f6b.png#pic_center)
1.2 NAT 转换表
接下来考虑,从广域网到达 NAT 路由器的所有数据报的目的 IP 地址,应该都是 NAT 路由器的 IP 地址,NAT 路由器要如何得知某个分组应该发送给那个内部主机呢?解决方案就是 NAT 转换表,在表中包含了端口号和对应的 IP 地址。
NAT 转换表在一次工作中的变化为:内部主机 A 用本地地址 IPa 和互联网上主机 B 通信所发送的数据报必须经过 NAT 路由器。NAT 路由器将数据报的源地址 IPa 转换成全球地址 IPg,并把转换结果记录到 NAT 地址转换表中,目的地址 IPb 保持不变,然后发送到互联网。NAT 路由器收到主机 B 发回的数据报时,知道数据报中的源地址是 IPb 而目的地址是 IPg。根据 NAT 转换表,NAT 路由器将目的地址 IPG 转换为 IPA,转发给最终的内部主机 A。 也就是说在一次内部主机与外部主机通信时,在 NAT 路由器上发生了两次地址转换:离开专用网时,替换源地址,将内部地址替换为全球地址;进入专用网时,替换目的地址,将全球地址替换为内部地址。
![](https://i-blog.csdnimg.cn/blog_migrate/9f0a076143dd7b15e3a28a9fac586a09.png#pic_center)
由此可见,通过 NAT 路由器的通信必须由专用网络内的主机发起,否则 NAT 路由器无法完成转换工作。专用网络内部的主机也不能充当服务器,因为互联网上的客户无法请求专用网内的服务器提供服务。
1.3 NAPT
为了更加有效地利用 NAT 路由器上的全球 IP 地址,现在常用的 NAT 转换表把运输层的端口号也利用上。这样就可以使多个拥有本地地址的主机,共用一个 NAT 路由器上的全球 IP 地址,因而可以同时和互联网上的不同主机进行通信。使用端口号的 NAT 叫做网络地址与端口号转换 NAPT,不过这与 NAT 的原理是一样的,并没有本质上的区别。
NAPT 把专用网内不同的源 IP 地址,都转换为同样的全球 IP 地址。但对源主机所采用的 TCP 端口号(不管相同或不同),则转换为不同的新的端口号。因此当 NAPT 路由器收到从互联网发来的应答时,就可以从 IP 数据报的数据部分找出运输层的端口号,然后根据不同的目的端口号,从 NAPT 转换表中找到正确的目的主机。
![](https://i-blog.csdnimg.cn/blog_migrate/99e1fc247c2e5ba3a79a7c7dbc800217.png#pic_center)
1.4 NAT 引发的争议
NAT 在得到广泛应用的同时,也存在着很多争议,主要包括以下 4 点:
- 路由器应该仅针对网络层,仅负责完成网络层的功能,转发网络层的分组;
- NAT 违背了端到端通信的原则,存在 NAT 路由器作为中继;
- 端口号应该是用于进程寻址,而不是应用于主机寻址;
- IPv4 地址不足的问题完全可以使用 IPv6 来解决。
1.5 与 DHCP 协议的关系
当我们讨论完 NAT 技术,现在我们回到一开头想一想,家庭网络计算机从哪儿得到地址?NAT 路由器是如何得到单一的全球地址呢?答案就是我们之前讨论过的 DHCP 协议,路由器将从 ISP 的 DHCP 服务器得到它的地址,并且路由器运行一个 DHCP 服务器,为位于 NAT-DHCP 路由器控制的家庭网络地址空间中的计算机提供地址。
![](https://i-blog.csdnimg.cn/blog_migrate/153a1650fcfe5cdda2ea558b105bacda.png#pic_center)
2 实验分析
用在家庭网络的一个客户端 PC 发送到 www.baidu.com 简单 HTTP 请求并且捕获它。在家庭网络中,家庭网络路由器会提供 NAT 服务。
下图显示我们的 Wireshark NAT 实验抓包收集方案。
![](https://i-blog.csdnimg.cn/blog_migrate/23bcee8ca06841ae4e0c234305d91f5f.png#pic_center)
在该客户端 PC 进行抓包,并存为NAT_home_side文件。同样我们因为需要研究 NAT 路由器发送到 ISP 网络的数据包,因此将会一个上图中的未展示 PC 收集从 NAT 路由到 ISP 网络的第二数据包。路由左侧连接 ISP 网络的集线器将会起到连接 NAT 路由器和 ISP 的第一跳路由(第一级路由的作用)。我们将位于 NAT 路由连 ISP 网络的 Wireshark 的抓包结果称为NAT_ISP_side。
2.1 NAT HOME分析
- 根据收集到的信息,我们可以找到客户端的 IP 地址:
![](https://i-blog.csdnimg.cn/blog_migrate/f5ec3bf427300a040600562d08c9d1be.png#pic_center)
客户端实际上与几个不同的 Google 服务器通信,以实现“安全浏览”。提供主要 Google 网页的服务器地址是 64.233.169.104,为了仅仅显示客户端的请求和服务器的响应,请在 Wireshark 过滤器输入过滤式 http && ip.addr == 64.233.169.104
。由此,我们可以知道在不同时间的客户端发送到 Google 服务器的 IP 数据报上的源 IP 地址、目标 IP 地址、TCP 源和目标端口。
![](https://i-blog.csdnimg.cn/blog_migrate/0cd6f5f8be1cf8efe8e2e19aec8a311f.png#pic_center)
例如:选择在 7.109267s 时间的客户端发送到 Google 服务器(其 IP 地址为64.233.169.104)的 HTTP GET。承载此 HTTP GET 的 IP 数据报上的源 IP 地址192.168.1.100;端口 4335。目的 IP64.233.169.104;端口 80。
- 找到 Google 服务器收到相应状态码的时间,以及其他信息:
![](https://i-blog.csdnimg.cn/blog_migrate/126cd4dea511d2d503dcfed542ac080d.png#pic_center)
例如:7.158797s 时从 Google 服务器收到相应的状态码 200、状态 OK 的 HTTP 响应消息。
携带状态码200、状态 OK 的 HTTP 响应消息的 IP 数据报上的源和目标 IP 地址64.233.169.104,端口 80;以及 TCP 源 IP地址192.168.1.100,端口 4335。
2.2 NAT ISP
- 根据打开收集到的跟踪文件,同样在 Wireshark 过滤器输入过滤式
http && ip.addr == 64.233.169.104
,我们可以找到跟刚才客户端相应时间,同样目的地发送的 HTTP GET 消息出现在 NAT_ISP_side 跟踪文件中的时间。
![](https://i-blog.csdnimg.cn/blog_migrate/ac58d83ecf392fa8f4ad822688d2d23c.png#pic_center)
例如:找到跟刚才客户端 7.109267s 同样目的地发送的 HTTP GET 消息,该消息出现在NAT_ISP_side跟踪文件中的时间是 6.069168s;承载此 HTTP GET 消息的 IP 数据报的源 IP71.192.34.104,端口 4335;目的 IP64.233.169.104,端口 80。
- 对比两个收集到的跟踪文件,可以发现 HTTP GET 消息中的任何字段都没有更改。
![](https://i-blog.csdnimg.cn/blog_migrate/434e1e0c10f171ffb82a270b70d79357.png#pic_center)
2.3 回答问题
下载作者抓包结果并且解压打开进行分析
- 客户端的IP 地址是多少?
答:192.168.1.
![](https://i-blog.csdnimg.cn/blog_migrate/0293033c186e068b4ee3457f9fdda34f.png#pic_center)
-
客户端实际上与几个不同的 Google 服务器通信,以实现"安全浏览"。提供主要 Google 网页的服务器地址是
64.233.169.104
,为了仅仅显示客户端的请求和服务器的响应,请在 Wireshark 过滤器输入以下过滤式http && ip.addr == 64.233.169.104
。
答:见下图 -
请选择在 7.109267s 时间的客户端发送到 Google 服务器(其 IP 地址为 IP 地址
64.233.169.104
)的 HTTP GET。承载此 HTTP GET 的 IP 数据报上的源 IP 地址和目标 IP 地址以及 TCP 源和目标端口是什么?
答:源IP:192.168.1.100,端口:4335;目的IP:64.233.169.104,端口:80
![](https://i-blog.csdnimg.cn/blog_migrate/87caec2011d7331e6774bf2057386e08.png#pic_center)
-
什么时候从 Google 服务器收到相应的状态码200、状态 OK 的 HTTP 响应消息?携带状态码200、状态 OK 的 HTTP 响应消息的 IP 数据报上的源和目标 IP 地址以及 TCP 源和目标端口是什么?
答:时间 7.158797 s;源 IP:64.233.169.104,端口:80;目的 IP:192.168.1.100,端口:4335
-
回想一下,在将 GET 请求发送到 HTTP 服务器之前,TCP 必须首先使用三次SYN/ACK消息建立连接。在什么时间客户端发送了含有TCP SYN 的报文建立连接消息用于发送在7.109267s 的 GET 请求?TCP SYN 报文的源 IP 地址和目标 IP 地址以及源端口和目标端口是什么?为响应 SYN 报文而发送的 ACK 报文的源和目标 IP 地址以及源和目标端口是什么?在客户端收到此 ACK 报文什么时间?
答:这里使用了 tcp 和 ip 双重过滤器找到了结果。SYN 报文——时间:7.075657 s;源IP:192.168.1.100,端口:4335;目的IP:64.233.169.104,端口:80。SYN ACK 报文——时间:7.108986 s;源IP:64.233.169.104,端口:80,目的IP:192.168.1.100,端口:4335。
![](https://i-blog.csdnimg.cn/blog_migrate/5f99148b9f4226cb50d5071940e4438d.png#pic_center)
- 在 NAT_ISP_side 跟踪文件中,找到跟刚才客户端 7.109267s 同样目的地发送的 HTTP GET 消息(这个时间是在 NAT_home_side 跟踪文件中记录的时间)。该消息何时出现在 NAT_ISP_side 跟踪文件中?承载此HTTP GET 消息的IP 数据报的源和目标 IP 地址以及 TCP 源和目标端口是什么?与您对上述问题3 的回答相比,哪些字段相同,哪些字段不同?
答:出现时间:6.069168s;源IP:71.192.34.104,端口:4335,目的IP:64.233.169.104,端口:80
![](https://i-blog.csdnimg.cn/blog_migrate/fe5c938f78b1f34262ec6c5899587f2a.png#pic_center)
- HTTP GET 消息中的任何字段是否已更改?携带 HTTP GET 的 IP 数据报中的以下哪个字段发生了变化:版本,标题长度,标志,校验和。如果这些字段中的任何一个发生了变化,请说明为什么。
答:比对未发现HTTP GET 消息字段更改。
![](https://i-blog.csdnimg.cn/blog_migrate/61ee90997b5dd18a5e2bbce706dee265.png#pic_center)
但是在IP 封包中生存时间,校验和,发送源IP 均已更改。因为NAT 路由会接收该网域的客户端PC 流量,解包处理IP 封包,并且进行TTL-1(经过每个路由器生存时间-1,当为0 时被舍弃),且重新计算校验和并且以自己源头重新封包进行转发。
![](https://i-blog.csdnimg.cn/blog_migrate/1e6275d1b4ba06e5cbb177828ac9406d.png#pic_center)
- 在 NAT_ISP_side 跟踪文件中,从 Google 服务器收到的第一条 HTTP 200 OK 消息在
什么时间?携带此 HTTP 200 OK 消息的 IP 数据报上的源和目标 IP 地址以及 TCP 源和目标端口是什么?与您第 4 问回答的 NAT_home_side 结果相比哪些字段相同,哪些字段不同?
答:时间 6.117570s,源IP:64.233.169.104,端口:80,目的IP:71.192.34.104,端口:4335。比对除TCP 校验码以外未见承载的TCP 报文有何不同,除此以外IP 封包不同,原因请见上一题。
![](https://i-blog.csdnimg.cn/blog_migrate/7ddd488e0fa8e2188dd54addecd2373f.png#pic_center)
-
在 NAT_ISP_side 跟踪文件中,跟上面的问题 5 相同地址的客户端到服务器 TCP SYN 报文和服务器到客户端 TCP ACK 报文在什么时间出现?这两个段的源和目标 IP 地址以及源和目标端口是什么?与您的问题 5 相比,哪些字段相同,哪些字段与不同?
答:同样这里使用了 tcp 和 ip 双重过滤器找到了结果。SYN 报文——时间:6.035475s,源IP:71.192.34.104,端口:4335,目的IP:64.233.169.104,端口:80。SYN ACK 报文——时间:6.06775s,源IP:64.233.169.104,端口:80,目的IP:71.192.34.104,端口:4335。
比对除TCP 校验码以外未见承载的TCP 报文有何不同,除此以外IP 封包不同,原因请见上一题。
总结:NAT 转换更改TCP 报校验码,IP 封包的生存时间,校验和,发送源IP。 -
使用您的第 1 到 8 题的答案,做出跟课本类似的HTTP 连接的NAT 转换表。
答:
![](https://i-blog.csdnimg.cn/blog_migrate/8ee83a88a933ad782dd184bf5d36d56c.jpeg#pic_center)
![](https://i-blog.csdnimg.cn/blog_migrate/c479f640c7ea973d389345be7e0f6eaf.png#pic_center)
- 在作者上面的抓包结果中,除了上面提到的 HTTP GET 消息和HTTP 200 OK 消息以外,还与其他 Google 服务器有额外的连接,例如,在 NAT_home_side 跟踪文件中,分析时间为1.572315s 的客户端到服务器 GET 消息,以及时间为7.573305s的 GET 消息。仔细研究这两个HTTP 消息的使用并写出说明解释这些消息的目的。
答: 查阅维基百科以及官方的相关资料,这是谷歌公司开发的一套安全浏览工具用来保证使用他们公司搜索的用户的安全。最常出现情况是使用Chrome 浏览器访问某些网站“此网站可能会损害您的计算机”通知,根据官网说明是这个网站被自动检测系统发现了病毒/木马/漏洞,或者被用来钓鱼造成用户财产盗取隐私泄露问题,因此会有专门的服务器监管这些。这个工具的确起到一些保护用户安全的功能,但是批评者认为有些个人企业等小型网站如果被入侵被检测到就会被提示禁止访问,并且需要恢复重新提交检测才能恢复原状,因此需要花费时间和经历并且等待。