Linux网络DNS、ICMP、NPT(19)
DNS(Domain Name System,域名系统)协议,是一个用来将 域名 转化为 IP地址 的应用层协议结束喽!!!
文章目录
前言
一、DNS协议
DNS(Domain Name System,域名系统)协议,是一个用来将 域名 转化为 IP地址 的应用层协议
DNS背景
归根到底还是因为人类擅长记忆有规律有意义的(域名),而不是一长串数字(IP)
TCP / IP中通过 IP地址 和 端口号 的方式,来确定网络中一个主机上的一个程序。但 IP地址 是一长串数字,并不便于人们记忆,于是人们发明了一种叫做 主机名 的东西,并用 hosts文件夹 来描述主机名和IP地址之间的对应关系
最初,这个 hosts文件 是由互联网信息中心(SRI-NIC)来管理的
- 如果一个新计算机要接入网络,或者某个 计算机IP 变更,都需要到信息中心申请变更 hosts文件
- 其他计算机也需要定期下载更新新版本的 hosts文件 才能正确上网
- 当用户通过域名访问互联网服务时,会先通过域名在本地的 hosts 文件中找到其对应的 IP地址 ,然后再用这个IP地址去访问对应的服务
但这样太麻烦了,于是产生了 DNS系统
- 由一个组织的系统管理机构,维护系统内的每个主机的 IP 和 主机名 的对应关系
- 如果新计算机要接入网络,或者某个计算机IP变更,就需要将对应信息注册到数据库中
- 当用户通过域名访问互联网服务时,会自动查询DNS服务器,由DNS服务器检索数据库,得到对应的 IP地址
至今,我们的计算机上仍然保留了 hosts 文件,这个 hosts 文件当中一般存储的是 主机名与IP地址之间的映射 ,用户也可以在 hosts文件 中自主添加 域名 和 IP 映射关系,在域名解析的过程中会优先查找 hosts 文件的内容
通过 cat /etc/hosts 可以查看 hosts 文件当中的内容
DNS工作机制
有了之前的铺垫之后,我们现在就来看看这个 DNS 到底是怎么从 域名 得到 IP地址 的
域名简介
域名是用来识别主机名称和主机所属的组织机构的一种分层结构的名称,例如www.baidu.com。
- com:一级域名,表示这是一个工商企业域名。同级的还有.net(网络提供商)和.org(开源组织或非盈利组织)等
- baidu:二级域名,一般对应的就是公司名
- www:只是一种习惯用法,之前人们在使用域名时,往往命名成类似于ftp.xxx.xxx/www.xxx.xxx这样的格式,来表示主机支持的协议

域名解析过程
在浏览器中输入 url 后,如果 url 当中包含域名,则需要进行域名解析。
- 首先会在浏览器的 DNS缓存 中去查询是否有对应的记录,如果查询到记录就可以直接得到对应的 IP地址 ,完成解析
- 如果在浏览器的 DNS缓存 中没有找到,就会去查询操作系统中的 DNS缓存 ,如果查询到对应的 IP地址 则完成解析
- 如果在操作系统的 DNS缓存 中没有找到,就会去查找本地的 hosts文件 ,如果查询到对应的 IP地址 则完成解析
- 如果在本地的 hosts文件 中也没有找到,就会去 本地DNS服务器 中查找。 本地DNS服务器 IP地址一般由本地网络服务商提供,如电信、移动等公司,一般通过 DHCP 自动分配 。目前使用的比较多的是谷歌提供的 公用DNS8.8.8.8 和国内公用 DNS114.114.114.114 。如果在 本地DNS服务器 中有对应域名的缓存,则直接返回对应的 IP地址 ,完成解析
- 如果 本地DNS 服务器中仍然没有找到,那么 本地DNS 服务器就会拿着域名去 根DNS服务器 中询问,根 DNS服务器 会告诉 本地DNS 顶级域名服务器的 IP地址
- 本地DNS 拿到顶级域名服务器的 IP地址 后,就会拿着域名去找 顶级DNS服务器,顶级域名服务器会告诉 本地DNS 权威域名服务器的 IP地址
- 本地DNS 服务器拿着域名去权威域名服务器中,查询域名对应的 IP地址 ,最终将该域名对应的 IP地址 返回给浏览器,此时整个域名解析过程就完成了


用dig工具来分析DNS过程

- 开头位置是 dig工具 的版本号。
- 第二部分是服务器返回的详情,其中 status参数 为 NOERROR 表示查询成功。
- QUESTION SECTION 表示待查询的域名。
- ANSWER SECTION 表示查询的结果,首先 www.baidu.com 被查询成了 www.a.shifen.com ,而最终 www.a.shifen.com 被查询成了两个具体的 IP 地址。
- 最下面是一些结果统计,包含查询时间和 DNS服务器 的地址等。

哎,可惜了,现在都禁止访问了~~
二、ICMP协议
ICMP协议是一个 网络层协议
一个新搭建好的网络, 往往需要先进行一个简单的测试, 来验证网络是否畅通;
但是 IP协议 并不提供可靠传输. 如果丢包了, IP协议 并不能通知 传输层 是否丢包以及丢包的原因.
我们一直谈的是网络通信功能,但如果网络出问题了是不是也要支持我们进行故障排查的功能。
所以IP协议不仅仅有通信能力,还要帮我们进行故障排查。
其主要功能有:
- 确认IP包是否成功到达目标地址。
- 通知在发送过程中IP包丢弃的原因。
- ICMP只能搭配IPv4使用,如果是IPv6的情况下,需要使用ICMPv6
比如说我们现在来个具体一点的例子
比如当 主机A 在向 主机B 发送数据的过程中, 主机B 因为某些原因已经离线了
当发送的数据包到达 主机B 所在局域网的入口路由器时,入口路由器为了获得 主机B 的 MAC地址 ,于是会向 主机B 发送 ARP请求包 ,但由于 主机B 已经离线了,因此路由器在多次发送 ARP请求包 而得不到响应后,就会返回一个 ICMP Destination Unreachable 的包给 主机A ,此时 主机A 就知道自己发送的数据无法到达 主机B
协议格式

大概分为两种:
- 一类是通知出错原因的。
- 一类是用于诊断查询的。

ping命令
ping命令是基于 ICMP协议 实现的,通常用于测试本地主机与另一台主机之间的通信信道是否正常
比如我们现在来 ping 一下百度

- ping命令会先发送一个 ICMP Echo Request 给对端。
- 对端接收到之后,会返回一个 ICMP Echo Reply 。

假如有人问你 telnet 对应的端口号是 23 , ssh 对应的端口号是 22 ,那 ping 对应的端口号是多少?
别绕晕了,端口号是属于传输层的内容,因此 ICMP协议 根本就不关心端口号这样的信息

因此, ping 命令实际是绕过了传输层的,在 Linux 当中实际也有绕过传输层的一套网络编程接口,叫做原生套接字
traceroute命令
traceroute命令 也是基于 ICMP 协议实现的, traceroute命令 可以遍历数据包传送到目标主机所经过的所有路由器
例如,使用 traceroute www.baidu.com 命令,遍历数据包传送到百度服务器所经过的所有路由器
traceroute命令 底层实际是通过增加存活时间(TTL)值来实现的。
因为每当数据包经过一个路由器,其 TTL值 就会 减1 ,当 TTL值 减为 0 时对应路由设备就会将该数据包丢弃,并传送一个 ICMP TTL数据 包给发送主机。
因此 traceroute命令 底层可以发出多个数据包,并给这些数据包设置不同的 TTL值 ,最后该主机就能够得到一连串的数据包路径
有点像剥洋葱的感觉,你认为呢
三、NAT技术
这个其实我们在前面有讲过了,只不过这里再提一嘴
NAT(Network Address Translation,网络地址转换)技术,是解决 IP地址 不足的主要手段,并且能够有效地避免来自网络外部的攻击,隐藏并保护网络内部的计算机
- 在进行对外通信时,NAT能够将私有IP经过一系列替换操作最终转为全局IP,也就是说,NAT是一种将私有IP和全局IP相互转化的技术方法。
- 装有NAT软件的路由器叫做NAT路由器,所有使用 私有IP 的主机在和外界通信时,都要在NAT路由器上将其私有IP转换成全局IP。
- 很多学校、家庭、公司内部每个终端设置的IP都是 私有IP ,而只在路由器或必要的服务器上设置 全局IP 。
全局IP 要求唯一,但是 私有IP 不需要,在不同的局域网中出现相同的 私有IP 是完全不影响的。
NAT IP转换过程
假设某个局域网当中有 A、B、C 三台主机,在公网当中有一台服务器,以 主机A 访问公网中的这台服务器为例,我们来看看数据包在传输过程中 IP地址 的转换过程

主机A向服务器发起数据请求的过程中,数据包中 IP地址 的转换过程如下:
- 刚开始,该数据包当中的源IP地址就是主机A的私有IP地址,目的IP地址就是服务器的公网IP地址
- 当数据包经过NAT路由器时,路由器会将该数据包的源IP地址替换成自己的WAN口IP地址,此时该数据包的源和目的IP地址就都是公网IP了
- 该数据包在互联网中经过各种路由转发,最终到达服务器主机
服务器收到主机A的数据请求并处理后,就会对主机A发来的请求进行响应。
数据包从公网到局域网的过程

服务器向 主机A 进行响应的过程中,数据包中 IP地址 的转换过程如下:
- 刚开始,该数据包当中的源IP地址就是服务器的 公网IP 地址, 目的IP地址 就是路由器的 WAN口IP地址
- 数据包在互联网中经过各种路由转发,到达主机A所在局域网的NAT路由器,此时路由器会将该数据包的目的 IP地址 替换成 主机A 的 私有IP地址
- 最终路由器就会将该数据包转发给局域网中的 主机A
需要注意的是,因为 主机A 向服务器发起数据请求时,该数据包当中的源IP地址被替换成了 NAT路由器 的 WAN口IP地址 ,相当于是该路由器代替 主机A 向服务器发起了数据请求,因此服务器发出的响应数据包的目的IP地址应该是 NAT路由器 的 WAN口IP地址 。
NAPT
当局域网当中的主机要访问外网时, NAT路由器 会将这些数据包的 源IP地址 替换成自己的 WAN口IP地址 。
当外网发来响应数据时, NAT路由器 又会将响应数据包的 目的IP地址 替换成局域网中对应主机的 IP地址 。
那 NAT路由器 是如何判断,应该将从 外网 收到的响应数据包转发给局域网中的哪一台主机呢?
- 实际在NAT路由器内部,有一张自动生成的,用于地址转换的表。
- 该转换表中维护的就是局域网中主机的私有IP,与其对应访问的外网当中的某个公网IP之间的映射关系。
- 局域网中的主机第一次向外网发起数据请求时,就会生成表中的映射关系。
- 比如在TCP建立连接时,会建立对应的映射关系,在TCP断开连接后,就会删除对应的映射关系。
在刚才的例子中,主机A第一次向服务器发起数据请求时,路由器中就会建立以下映射关系。

当 NAT路由器 收到 服务器 向 主机A 发来的响应数据时,就可以通过查表得知该响应数据是发送给局域网当中的 主机A 的。
但如果转换表中维护的只是局域网中主机的 私有IP ,与其对应访问的外网当中的某个 公网IP 之间的映射关系,那么就会出现某些问题。
如果局域网中的 主机A 和 主机B 同时都在访问该服务器,那么此时转换表中就会建立如下两对映射关系:
此时这张转换表只能保证从 左到右 的唯一性,而不能保证从右到左的唯一性,当服务器发来响应数据时,该数据包中的 的IP地址都 是路由器的 WAN口IP ,此时 NAT路由器 就无法判断该数据包应该转发给 主机A 还是 主机B ,此时就需要用到 NAPT技术
NAPT(Network Address Port Translation,网络地址端口转换),可以将多个内部地址映射为一个合法公网地址。
- 当局域网中的主机向外网发送数据时,路由器会将该数据包的 源IP地址 替换为自己的 WAN口IP地址 ,并建立该主机 私有IP 与其对应访问的 公网IP 之间的映射关系。
- 但如果局域网中的多台主机同时访问同一个外网服务,当路由器收到外网发来的响应数据时,路由器无法判断该响应数据应该转发给局域网中的哪台主机,因为该局域网中所有主机的数据包都由路由器代替发送了,因此发来的响应数据包的目的IP地址都是路由器的 WAN口IP地址 。
- 于是 NAPT 在建立转换表的映射关系时,除了建立局域网中 私有IP 与其对应访问的 公网IP 之间的映射关系外,还会加上一个由 NAT路由器 选定的端口号。
- 此时当局域网中的多台主机同时访问同一个外网服务时,虽然外网发来的响应数据的目的IP地址都是路由器的 WAN口IP ,但发给局域网中不同主机的响应数据对应的目的端口号是不同的,此时路由器就能通过 IP + Port 的方式来区分发给不同主机的数据包。
比如局域网中的 主机A 和 主机B 都在访问同一个服务器,并且它们访问服务器时采用的端口号都是 1025 。
- 假设主机A发送的数据包先到达路由器,此时路由器将数据包的源IP地址替换成自己的 WAN口IP地址 ,由于路由器用于访问该服务器的 1025号端口 没有被使用,因此该数据包的源端口号可以不变。
- 当主机B发来的数据包到达路由器时,路由器同样将数据包的源IP地址替换成自己的 WAN口IP地址 ,但此时路由器用于访问该服务器的 1025号端口 已经被 主机A 使用了,因此路由器会重新选定一个端口号对数据包的源端口号进行替换。
此时就变成了下面这样,成功实现了从右向左的唯一性

- 当服务器发来的响应数据到达路由器时,虽然服务器发给 主机A 和 主机B 的数据包对应的 目的IP地址 是一样的。
- 但路由器是用自己的 1025号 端口代替 主机A 进行数据请求的,而用的是 1026号端口 代替 主机B进 行数据请求的。
- 因此现在路由器可以继续根据数据包的源端口号,来判断应该将该数据包转发给 主机A 还是 主机B ,进行对数据包中的 目的IP地址 和 目的端口号 进行替换,然后转发给局域网内对应的主机。
- NAT路由器在进行数据转发时,不仅有能力替换数据包的源和目的IP地址,而且在必要的情况下还可能会替换数据包的源和目的端口号,而端口号实际是传输层的概念(所以路由器也有传输层工作的概念)
- 当然了这个时候你也会发现这个 NAP技 术的一些缺点,比如无法从外部到内部,因为无法知道内部的私网IP地址
NAT和代理服务器
正向代理
正向代理,是一个位于客户端和目标服务器之间的服务器,客户端并不直接访问目标服务器,而是先访问代理服务器,由代理服务器代替客户端去访问对应的目标服务器,并将目标服务器的响应结果返回给客户端

比如公司内部一般都会有自己的服务器,当我们使用公司内网上网时。
- 我们对外网发起的数据请求,首先会转发到公司的这台服务器上,然后由公司的这台服务器代替你对外网进行访问。
- 当公司的服务器收到对应外网的响应数据后,再由公司的这台服务器将数据转发给你。
正向代理的好处:
- 正向代理最大的一个好处就是可以加速资源访问。
- 比如公司中大量员工都要访问外网的同一个资源,那么正向代理服务器就可以将对应的资源缓存到本地,此时当其他人要访问该资源时,直接在正向代理服务器就可以获取,而不需要再次进行外网访问
反向代理
反向代理,也是一个位于客户端和目标服务器之间的服务器,对于客户端而言,反向代理服务器就相当于目标服务器,用户不需要知道目标服务器的地址,用户只需要访问反向代理服务器就可以获得目标服务器提供的服务。
反向代理,也是一个位于客户端和目标服务器之间的服务器,客户端直接向反向代理服务器发起数据请求,然后再由反向代理服务器将客户端的数据请求转发给真正的目标服务器进行处理,数据处理完毕后反向代理服务器再将数据结果返回给客户端。
比如域名www.baidu.com对应的服务器实际就是一个反向代理服务器。
百度内部实际并不是只有一台服务器,但不同地区的人们都可以通过访问 www.baidu.com 享受到百度提供的服务,实际我们访问的就是百度的反向代理服务器。
当这台反向代理服务器收到客户端的数据请求后,就会将我们的数据请求转发给百度内部的某台服务器进行数据处理,然后再将数据处理的结果返回给客户端。
反向代理的好处:
反向代理可以起到负载均衡的作用。比如不设置反向代理服务器,那么用户在访问百度时,就会随机访问到百度内部的某台服务器,此时就可能导致某些服务器压力太大,而某些服务器却处于闲置状态。而设置了反向代理服务器后,我们就能够通过某些方法让用户的数据请求较为平均的落到每台服务器上。
反向代理还能起到安全防护的作用。有了方向代理服务器后,我们不需要直接将提供服务的服务器对应的信息暴露出去,此外,当由非法请求发送到反向代理服务器时,反向代理服务器就相当于一层软件屏障,可以在反向代理服务器当中部署一些防护措施,让这些非法请求在反向代理服务器这里就被过滤掉,而不会影响内部实际提供服务的服务器。
- 正向代理是客户端的代理,帮助客户端访问其无法访问的服务器资源的,而反向代理则是服务器的代理,帮助服务器做负载均衡、安全防护等工作的。
- 正向代理一般是客户端架设的,比如公司的正向代理服务器是公司作为客户端架设的,而反向代理一般是服务端架设的,比如百度的反向代理服务器是百度作为服务端架设的
另外需要注意的是,NAP技术看似和代理服务器有点像,但是它们之间还是有不小的区别的:
- 从应用上讲,NAT设备是网络基础设备之一,解决的是IP不足的问题,而代理服务器则是更贴近具体应用,比如通过代理服务器进行翻墙,另外像迅游这样的加速器,也是使用的代理服务器。
- 从底层实现上讲, NAT工作 在网络层,直接对 IP地址 进行替换,而代理服务器往往工作在应用层。
总结
结束喽!!!
更多推荐

所有评论(0)