《计算机网络—自顶向下方法》 Wireshark实验(十):NAT 协议分析

news2024/11/25 6:58:08

        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 协议的工作过程如下所示:

        假设一个私有地址为 10.1.0.2 的主机想访问互联网服务器 162.105.192.12,那么首先它首先把消息发出给 NAT 路由器。路由器记录了它的内网地址和端口,并且给它分配一个全局地址和全局端口。这个地址关系记录在 NAT 路由表中。之后按照目的地址发给服务器。一段时间之后,服务器回应了请求给 NAT 路由器,那么路由器根据目的地址和端口(此时是全局的)按照 NAT 路由表转换为对应的主机地址,再发送给主机,这样主机就收到了服务器的回应。

        从上面的过程就能看到 NAT 路由器的作用:针对出境包源地址进行替换;在 NAT 转换表中记录映射关系;针对入境包目标地址进行替换。

        NAT 的路由表如下所示:

功能

        NAT 不仅能解决 IP 地址不足的问题,而且还能够有效地避免来自网络外部的攻击,隐藏并保护网络内部的计算机。作用是把内网的私有地址,转化成外网的公有地址。使得内部网络上的(被设置为私有 IP 地址的)主机可以访问 Internet。

  1. 宽带分享:这是 NAT 主机的最大功能。
  2. 安全防护:NAT 之内的 PC 联机到 Internet 上面时,他所显示的 IP 是 NAT 主机的公共 IP,所以 Client 端的 PC 当然就具有一定程度的安全了,外界在进行 portscan(端口扫描) 的时候,就侦测不到源 Client 端的 PC 。

实现方式

        NAT 的实现方式有三种,即静态转换 Static Nat、动态转换 Dynamic Nat 和端口多路复用 OverLoad。

  1. 静态转换是指将内部网络的私有 IP 地址转换为公有 IP 地址,IP地址对是一对一的,是一成不变的,某个私有IP地址只转换为某个公有IP地址。借助于静态转换,可以实现外部网络对内部网络中某些特定设备(如服务器)的访问。
  2. 动态转换是指将内部网络的私有 IP 地址转换为公用 IP 地址时,IP 地址是不确定的,是随机的,所有被授权访问上 Internet 的私有 IP 地址可随机转换为任何指定的合法 IP 地址。也就是说,只要指定哪些内部地址可以进行转换,以及用哪些合法地址作为外部地址时,就可以进行动态转换。动态转换可以使用多个合法外部地址集。当 ISP 提供的合法 IP 地址略少于网络内部的计算机数量时。可以采用动态转换的方式。
  3. 端口多路复用是指改变外出数据包的源端口并进行端口转换,即端口地址转换(PAT, Port Address Translation)。采用端口多路复用方式。内部网络的所有主机均可共享一个合法外部 IP 地址实现对 Internet 的访问,从而可以最大限度地节约 IP 地址资源。同时,又可隐藏网络内部的所有主机,有效避免来自 Internet 的攻击。因此,目前网络中应用最多的就是端口多路复用方式。

1 NAT 原理

1.1 NAT 路由器

        家庭网络可以是都由私有地址而组成的专用网络,这种地址进对网络中的设备有意义的网络,可以称之为具有专用地址的地域。由于现在存在着数十万家庭网络,有很多的设备都在使用私有地址,而此时当全球因特网进行收发分组时,私有地址的编址问题应该如何解决?NAT 技术就可以化解这个难题,接下来我们来谈一下 NAT 技术原理。
装有 NAT 软件的路由器叫做 NAT 路由器,NAT 路由器具有一个接口,连接一个具有相同网络前缀的网络。NAT 能够使得路由器对于外界而言不像是一个路由器,而是使得 NAT 路由器对外界的行为就像是一个具有单一 IP 地址的单一设备,从本质上讲 NAT 使得路由器对外界隐藏了家庭网络的细节。也就是说对于外界而言,发给一个家庭网络的所有数据报都会被 NAT 路由器接收进来。

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 路由器上发生了两次地址转换:离开专用网时,替换源地址,将内部地址替换为全球地址;进入专用网时,替换目的地址,将全球地址替换为内部地址。

        由此可见,通过 NAT 路由器的通信必须由专用网络内的主机发起,否则 NAT 路由器无法完成转换工作。专用网络内部的主机也不能充当服务器,因为互联网上的客户无法请求专用网内的服务器提供服务。

1.3 NAPT

        为了更加有效地利用 NAT 路由器上的全球 IP 地址,现在常用的 NAT 转换表把运输层的端口号也利用上。这样就可以使多个拥有本地地址的主机,共用一个 NAT 路由器上的全球 IP 地址,因而可以同时和互联网上的不同主机进行通信。使用端口号的 NAT 叫做网络地址与端口号转换 NAPT,不过这与 NAT 的原理是一样的,并没有本质上的区别。

        NAPT 把专用网内不同的源 IP 地址,都转换为同样的全球 IP 地址。但对源主机所采用的 TCP 端口号(不管相同或不同),则转换为不同的新的端口号。因此当 NAPT 路由器收到从互联网发来的应答时,就可以从 IP 数据报的数据部分找出运输层的端口号,然后根据不同的目的端口号,从 NAPT 转换表中找到正确的目的主机。

1.4 NAT 引发的争议

        NAT 在得到广泛应用的同时,也存在着很多争议,主要包括以下 4 点:

  1. 路由器应该仅针对网络层,仅负责完成网络层的功能,转发网络层的分组;
  2. NAT 违背了端到端通信的原则,存在 NAT 路由器作为中继;
  3. 端口号应该是用于进程寻址,而不是应用于主机寻址;
  4. IPv4 地址不足的问题完全可以使用 IPv6 来解决。

1.5 与 DHCP 协议的关系

        当我们讨论完 NAT 技术,现在我们回到一开头想一想,家庭网络计算机从哪儿得到地址?NAT 路由器是如何得到单一的全球地址呢?答案就是我们之前讨论过的 DHCP 协议,路由器将从 ISP 的 DHCP 服务器得到它的地址,并且路由器运行一个 DHCP 服务器,为位于 NAT-DHCP 路由器控制的家庭网络地址空间中的计算机提供地址。

2 实验分析

        用在家庭网络的一个客户端 PC 发送到 www.baidu.com 简单 HTTP 请求并且捕获它。在家庭网络中,家庭网络路由器会提供 NAT 服务。
下图显示我们的 Wireshark NAT 实验抓包收集方案。

        在该客户端 PC 进行抓包,并存为NAT_home_side文件。同样我们因为需要研究 NAT 路由器发送到 ISP 网络的数据包,因此将会一个上图中的未展示 PC 收集从 NAT 路由到 ISP 网络的第二数据包。路由左侧连接 ISP 网络的集线器将会起到连接 NAT 路由器和 ISP 的第一跳路由(第一级路由的作用)。我们将位于 NAT 路由连 ISP 网络的 Wireshark 的抓包结果称为NAT_ISP_side。

2.1 NAT HOME分析

  1. 根据收集到的信息,我们可以找到客户端的 IP 地址:

        客户端实际上与几个不同的 Google 服务器通信,以实现“安全浏览”。提供主要 Google 网页的服务器地址是 64.233.169.104,为了仅仅显示客户端的请求和服务器的响应,请在 Wireshark 过滤器输入过滤式 http && ip.addr == 64.233.169.104。由此,我们可以知道在不同时间的客户端发送到 Google 服务器的 IP 数据报上的源 IP 地址、目标 IP 地址、TCP 源和目标端口。

        例如:选择在 7.109267s 时间的客户端发送到 Google 服务器(其 IP 地址为64.233.169.104)的 HTTP GET。承载此 HTTP GET 的 IP 数据报上的源 IP 地址192.168.1.100;端口 4335。目的 IP64.233.169.104;端口 80。

  1. 找到 Google 服务器收到相应状态码的时间,以及其他信息:

        例如: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

  1. 根据打开收集到的跟踪文件,同样在 Wireshark 过滤器输入过滤式 http && ip.addr == 64.233.169.104,我们可以找到跟刚才客户端相应时间,同样目的地发送的 HTTP GET 消息出现在 NAT_ISP_side 跟踪文件中的时间。

        例如:找到跟刚才客户端 7.109267s 同样目的地发送的 HTTP GET 消息,该消息出现在NAT_ISP_side跟踪文件中的时间是 6.069168s;承载此 HTTP GET 消息的 IP 数据报的源 IP71.192.34.104,端口 4335;目的 IP64.233.169.104,端口 80。

  1. 对比两个收集到的跟踪文件,可以发现 HTTP GET 消息中的任何字段都没有更改。

2.3 回答问题

下载作者抓包结果并且解压打开进行分析

  1. 客户端的IP 地址是多少?
    答:192.168.1.
  1. 客户端实际上与几个不同的 Google 服务器通信,以实现"安全浏览"。提供主要 Google 网页的服务器地址是 64.233.169.104,为了仅仅显示客户端的请求和服务器的响应,请在 Wireshark 过滤器输入以下过滤式 http && ip.addr == 64.233.169.104
    答:见下图

  2. 请选择在 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

  1. 什么时候从 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

  2. 回想一下,在将 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。

  1. 在 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
  1. HTTP GET 消息中的任何字段是否已更改?携带 HTTP GET 的 IP 数据报中的以下哪个字段发生了变化:版本,标题长度,标志,校验和。如果这些字段中的任何一个发生了变化,请说明为什么。
    答:比对未发现HTTP GET 消息字段更改。

但是在IP 封包中生存时间,校验和,发送源IP 均已更改。因为NAT 路由会接收该网域的客户端PC 流量,解包处理IP 封包,并且进行TTL-1(经过每个路由器生存时间-1,当为0 时被舍弃),且重新计算校验和并且以自己源头重新封包进行转发。

  1. 在 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 封包不同,原因请见上一题。
  1. 在 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。

  2. 使用您的第 1 到 8 题的答案,做出跟课本类似的HTTP 连接的NAT 转换表。
    答:

  1. 在作者上面的抓包结果中,除了上面提到的 HTTP GET 消息和HTTP 200 OK 消息以外,还与其他 Google 服务器有额外的连接,例如,在 NAT_home_side 跟踪文件中,分析时间为1.572315s 的客户端到服务器 GET 消息,以及时间为7.573305s的 GET 消息。仔细研究这两个HTTP 消息的使用并写出说明解释这些消息的目的。
    答: 查阅维基百科以及官方的相关资料,这是谷歌公司开发的一套安全浏览工具用来保证使用他们公司搜索的用户的安全。最常出现情况是使用Chrome 浏览器访问某些网站“此网站可能会损害您的计算机”通知,根据官网说明是这个网站被自动检测系统发现了病毒/木马/漏洞,或者被用来钓鱼造成用户财产盗取隐私泄露问题,因此会有专门的服务器监管这些。这个工具的确起到一些保护用户安全的功能,但是批评者认为有些个人企业等小型网站如果被入侵被检测到就会被提示禁止访问,并且需要恢复重新提交检测才能恢复原状,因此需要花费时间和经历并且等待。

参考

  • 网络层—NAT:https://www.cnblogs.com/linfangnan/p/13247043.html
  • 《计算机网络-自顶向下方法》笔记:https://github.com/moranzcw/Computer-Networking-A-Top-Down-Approach-NOTES

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/552322.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

win安装Nodejs

文章目录 1、安装环境2、安装步骤3、更换npm源为淘宝镜像4、更多node版本下载 1、安装环境 node.js下载官网: nodejs官网 点击选中图标下载即可: 2、安装步骤 1、双击安装包,一直点击next 2、点击change按钮,更换到自己的指定安装位置&…

基于fpga的图像处理之3x3_5x5算子模板中值排序

本文的思路框架: ①本文介绍3x3算子模块和5x5算子模块中,矩阵转化成串行数据后,对其排序,并获取矩阵中值数据; ②本例程中采用的FPGA设计技巧,可用于借鉴,一是采用for循环实现串行数据转化并行数…

vite创建vue2项目

使用vite首先需要注意官方给出的兼容性注意 Vite 需要 Node.js 版本 14.18,16。然而,有些模板需要依赖更高的 Node 版本才能正常运行,当你的包管理器发出警告时,请注意升级你的 Node 版本。 1.初始化vite项目 输入以下命令&#…

Spring MVC 是什么?与 Struts 的区别是什么?

Spring MVC是Spring框架中的一个模块,它提供了一种基于MVC(Model-View-Controller)架构的Web开发方式。与传统的JSP/Servlet开发方式相比,Spring MVC更加灵活、高效,可以帮助开发人员快速构建高质量的Web应用程序。本文…

vue diff算法与虚拟dom知识整理(10) 梳理patch处理相同节点比较的基本逻辑

这次 我们来讲 diff算法处理到 当新旧节点 是同一个节点时的处理 我们之前也说过 如果不是同一个节点 他就会暴力拆旧 把新的插上去 但当他们是同一个节点 需要精细化比较 最做小化更新 这块我们还没有处理 打开我们的案例 打开 patch.js 对应其实就还是这一块还没有写 我们…

PostgreSQL查询引擎——transform expressions之AEXPR_OP

static Node *transformAExprOp(ParseState *pstate, A_Expr *a){Node *lexpr a->lexpr; Node *rexpr a->rexpr; // 操作符左右表达式Node *result;/* Special-case "foo NULL" and "NULL foo" for compatibility with standards-broke…

Bug——后端返回LocalDateTime类型数据中间出现一个T

错误如下图所示: 返回的JSON格式数据里面会有一个多出来的T. 解决方案: 在后端的POJO层的实体类的LocalDateTime属性上面加上一个注解 JsonFormat(pattern"yyyy-MM-dd HH:mm:ss") 如下所示,然后在返回JSON格式数据时就不会出现那个多余的T了…

C++之模板初阶

目录 前言 1.泛型编程 2.模板 2.1 函数模板 2.1.1 函数模板概念 2.1.2 函数模板格式 2.1.3 函数模板的原理 2.1.4 函数模板的实例化 2.1.5 模板参数的匹配原则 2.2 类模板 2.2.1 类模板定义模式 2.2.2 类模板的实例化 前言 我们会不会有疑惑为什么C语言中&#xf…

Python学习笔记——cmeans模糊聚类例程

文章目录 模糊聚类应用简介安装环境demo:运行结果 模糊聚类应用简介 模糊聚类即通过模糊数学(处理模糊或不确定性信息的数学方法)的相关算法进行聚类分析任务。 常用的模糊聚类算法包括模糊C均值聚类(FCM,Fuzzy-c mea…

TryHackMe-Red Team Capstone Challenge (红队挑战)【真实红队模拟】

Red Team Capstone Challenge 注意:我不会在这里提及相关的flag,只专心打;flag可以自己用各个hostname尝试一遍 挑战作者的一句话 这个房间被评为坚硬,但因为它是你前面的一座山,它可能被评为疯狂。但是,…

【Vue3】滑动验证组件 | 滑动验证

前言 滑块验证不只判断是否滑动到尾部,真正的目的是检测用户行为,检测行为是人为、脚本、还是其它。 防止使用脚本大量注册、请求等 。比如发送请求时,判断用户在某个页面停留了多长时间。登录、注册时是否点击了登录、注册按钮,…

Lesson1——数据结构前言

前言: 今天我们正式开始一个新的专栏——初阶数据结构(C语言实现),本专栏后续持续更新时间复杂度空间复杂度、顺序表、链表、栈和队列、二叉树、排序等算法的相关知识,欢迎大家互相学习,可以私信互相讨论哦…

一次oracle环境 enq: TX - allocate ITL entry锁问题分析

enq: TX - allocate ITL entry锁问题分析 通过分析问题时间段两个节点的AWR报告,TOP1等待为锁竞争enq: TX - allocate ITL entry,该等待事件是由于缺省情况下创建的表的INITRANS参数为1,索引的INITRANS参数值为2.当有太多的并发DML操作的数据行处于相同的…

日志模块封封装:单例模式+策略模式+构建者模式+bugly

日志模块封封装:单例模式策略模式构建者模式bugly 一.单例模式策略模式构建者模式二.日志模块封装1.日志等级:LoggerLevel枚举类2.日志输出类型:LoggerType枚举类3.ILogger接口4.LogCatLogger/FileLogger/NetWorkLogger/EmailLogger5.使用构建者模式创建…

相同格式相同分辨率图片不同大小分析

1、问题 有三张图片,如下: 这三张图片均为jpg格式,分辨率均为1851*580,肉眼看不出区别。但是大小不同。 2号为217KB,4号为1.15MB,5号为1.06MB。 我们看下常规信息,先看2号: 可以…

初识Linux:第五篇

初识Linux:第五篇 初识Linux:第五篇1.Linux下的用户2.Linux权限管理2.1文件权限管理2.2文件权限的更改2.21改变文件访问权限属性2.22改变文件的身份 3.三个问题 总结 初识Linux:第五篇 😁本篇主要介绍Linux权限的相关知识&#x1…

vue+elementui+nodejs高校校园在线打印预约系统

在线提交文档进行打印 首页简单介绍系统 语言 node.js 框架:Express 前端:Vue.js 数据库:mysql 数据库工具:Navicat 开发软件:VScode 顶部或主页按钮转到打印 用户可以登录 查看历史打印记录 用户分学生和非学生 学生可以享有优惠…

基于.NetCore开源的Windows的GIF录屏工具

推荐一个Github上Start超过20K的超火、好用的屏幕截图转换为 GIF 动图开源项目。 项目简介 这是基于.Net Core WPF 开发的、开源项目,可将屏幕截图转为 GIF 动画。它的核心功能是能够简单、快速地截取整个屏幕或者选定区域,并将其转为 GIF动画&#x…

编写 ROS 消息发布订阅器(五)

执行命令,指定目录添加cpp文件 cd ~/catkin_ws/src/beginner_tutorials如果没有src目录, 就自己创建一个目录叫src cd src/ vim talker.cpp 复制代码粘贴: #include "ros/ros.h" #include "std_msgs/String.h" int m…

C++/R 期末冲刺3h

C 1. 基础程序 #include "iostream" // C头文件 #include "stdio.h" // C 头文件 //using namespace std; // 命名空间// main() 是程序开始执行的地方int main() {std::cout << "Hello, World!" << "\n";return 0; …