DNS协议、ICMP协议、NAT技术
- 一、DNS协议
- 1、产生背景
- 2、域名简介
- 3、域名解析的工作流程
- 4、使用dig工具分析DNS过程
- 二、ICMP协议
- 1、ICMP介绍
- 2、ICMP协议格式
- 3、ping命令
- 4、traceroute命令
- 三、NAT技术
- 1、NAT技术背景
- 2、NAT IP转换过程
- 3、地址转换表
- 4、NAPT技术
- 5、重新理解路由器
- 6、NAT技术的缺陷
- 四、NAT和代理服务器
- 1、正向代理
- 2、反向代理
一、DNS协议
DNS(Domain Name System,域名系统)协议,是一个的应用层协议,其传输依赖于UDP。
1、产生背景
TCP/IP中通过IP地址和端口号的方式,来确定网络中一个主机上的一个程序。但IP地址是一长串数字,并不便于人们记忆,于是人们发明了一种叫做主机名的东西,并用hosts
文件夹来描述主机名和IP地址之间的对应关系。
最初,通过互连网信息中心(SRI-NIC)来管理这个hosts文件的。
- 如果一个新计算机要接入网络,或者某个计算机IP变更,都需要到信息中心申请变更hosts文件。
- 其他计算机也需要定期下载更新新版本的hosts文件才能正确上网。
这样就太麻烦了,于是产生了DNS系统。
-
一个组织的系统管理机构,维护系统内的每个主机的IP和主机名的对应关系。
-
如果新计算机接入网络,将这个信息注册到数据库中。
-
用户输入域名的时候,会自动查询DNS服务器,由DNS服务器检索数据库,得到对应的IP地址。
至今,我们的计算机上仍然保留了hosts文件。在域名解析的过程中仍然会优先查找hosts文件的内容。
cat /etc/hosts
2、域名简介
DNS 中的域名都是用句点来分隔的,比如 www.baidu.com
,这里的句点代表了不同层次之间的界限。
在域名中,越靠右的位置表示其层级越高。
- com:一级域名,表示这是一个工商企业域名。同级的还有.net(网络提供商)和.org(开源组织或非盈利组织)等。
- baidu:二级域名,一般对应的就是公司名。
- www:只是一种习惯用法,之前人们在使用域名时,往往命名成类似于ftp.xxx.xxx/www.xxx.xxx这样的格式,来表示主机支持的协议。
根域是在最顶层,它的下一层就是顶级域,再下面是二级域名,所以域名的层级关系类似一个树状结构:
- 根 DNS 服务器
- 顶级域 DNS 服务器(类似com)
- 权威 DNS 服务器(类似server.com)
根域的 DNS 服务器信息保存在互联网中所有的 DNS 服务器中。这样一来,任何 DNS 服务器就都可以找到并访问根域 DNS 服务器了。
因此,客户端只要能够找到任意一台 DNS 服务器,就可以通过它找到根域 DNS 服务器,然后再一路顺藤摸瓜找到位于下层的某台目标 DNS 服务器。
3、域名解析的工作流程
浏览器首先看一下自己的缓存里有没有,如果没有就向操作系统的缓存要,还没有就检查本机域名解析文件hosts
,如果还是没有,就会向本地DNS 服务器进行查询,查询的过程如下:
-
本地DNS服务器IP地址一般由本地网络服务商提供,如电信、移动等公司,一般通过DHCP自动分配。目前使用的比较多的是谷歌提供的公用NDS 8.8.8.8和国内公用DNS 114.114.114.114。如果在本地DNS服务器中有对应域名的缓存,则直接返回对应的IP地址,完成解析。
-
如果本地DNS服务器中仍然没有找到,那么本地DNS服务器就会拿着域名去根DNS服务器中询问,根 DNS 收到来自本地 DNS 的请求后,会检查请求的一级域名,然后根DNS服务器会告诉本地DNS服务器其对应一级域名的的顶级域 DNS 服务器的地址。
-
本地DNS服务器拿到顶级域 DNS 服务器的地址后,就会拿着域名去找顶级DNS服务器,顶级域名服务器会告诉本地DNS服务器其对应的权威DNS服务器的IP地址。
-
本地DNS服务器拿着域名去权威DNS服务器中,查询域名对应的IP地址,最终将该域名对应的IP地址返回给浏览器,此时整个域名解析过程就完成了。
总结一下其过程:
4、使用dig工具分析DNS过程
安装 dig
工具
yum install bind-utils
之后就可以使用 dig 指令查看域名解析过程了。
结果说明:
- 开头位置是dig工具的版本号。
- 第二部分是服务器返回的详情,其中status参数为NOERROR表示查询成功。
- QUESTION SECTION表示待查询的域名。
- ANSWER SECTION表示查询的结果,首先www.baidu.com被查询成了www.a.shifen.com,而最终www.a.shifen.com被查询成了两个具体的IP地址。
- 最下面是一些结果统计,包含查询时间和DNS服务器的地址等。
二、ICMP协议
1、ICMP介绍
ICMP(Internet Control Message Protoco)Internet控制报文协议,是一个网络层协议,用于在IP主机、路由器之间传递控制信息。
一个新搭建好的网络, 往往需要先进行一个简单的测试, 来验证网络是否畅通,但是IP协议并不提供可靠传输, 如果丢包了, IP协议并不能通知传输层是否丢包以及丢包的原因,因此这种情况下就要使用ICMP协议来保证进行能够进行网络相关功能的测试。
ICMP和IP协议虽然都属于网络层的协议,但ICMP协议属于IP的上层协议。
ICMP 主要的功能包括:确认 IP 包是否成功送达目标地址、报告发送过程中 IP 包被废弃的原因和改善网络设置等。
在 IP 通信中如果某个 IP 包因为某种原因未能达到目标地址,那么这个具体的原因将由 ICMP 负责通知。
ICMP可以让应用层绕过传输层,直接使用ICMP进行通信,利用这个特性就可以在应用层编写一些网络测试工具来调试网络的相关问题,ping
命令就是基于ICMP的。
需要注意的一点是:ICMP只能搭配IPv4使用,如果是IPv6的情况下,需要使用ICMPv6。
进行网络连通性测试时,当发送的数据包到达主机B所在局域网的入口路由器时,入口路由器为了获得主机B的MAC地址,于是会向主机B发送ARP请求包,但由于主机B已经离线了,因此路由器在多次发送ARP请求包而得不到响应后,就会返回一个ICMP Destination Unreachable的包给主机A,此时主机A就知道自己发送的数据无法到达主机B。
2、ICMP协议格式
ICMP协议格式如下:
ICMP大概分为两类报文:
- 一类是通知出错原因
- 一类是用于诊断查询
ICMP包常见类型如下:
类型 | 内容 |
---|---|
0 | 回送应答(Echo Reply) |
3 | 目标不可达(Destination Unreachable) |
4 | 原点抑制(Source Quench) |
5 | 重定向或改变路由(Redirect) |
8 | 回送请求(Echo Request) |
9 | 路由器公告(Router Advertisement) |
10 | 路由器请求(Router Solicitation) |
11 | 超时(Time Exceeded) |
17 | 地址子网请求(Address Mask Request) |
18 | 地址子网应答(Address Mask Reply) |
3、ping命令
ping
命令的功能是用于测试主机间网络连通性,发送出基于ICMP传输协议的数据包,要求对方主机予以回复,若对方主机的网络功能没有问题且防火墙放行流量,则就会回复该信息,我们也就可得知对方主机系统在线并运行正常了。
- 注意, 此处
ping
的是域名, 而不是url, 一个域名可以通过DNS解析成IP地址。 ping
命令不光能验证网络的连通性, 同时也会统计响应时间和TTL(IP包中的Time To Live, 生存周期)。ping
命令会先发送一个 ICMP Echo Request给对端;- 对端接收到之后, 会返回一个ICMP Echo Reply;
一个值得注意的坑
telnet
对应的端口号是23,ssh
对应的端口号是22,那ping
对应的端口号是多少?
相信你一定回答不上啦,因为ping
命令基于ICMP, 是在网络层, 而端口号是传输层的内容, 在ICMP中根本就不关注端口号这样的信息,所以ping
命令没有的端口号!
4、traceroute命令
traceroute
命令也是基于ICMP协议实现的,traceroute
命令可以打印出数据包传送到目标主机所经过的所有路由器。
原理简述:
traceroute
命令底层实际是通过增加存活时间(TTL)值来实现的。- 因为每当数据包经过一个路由器,其TTL值就会减1,当TTL值减为0时对应路由设备就会将该数据包丢弃,并传送一个ICMP TTL数据包给发送主机。
- 因此
traceroute
命令底层可以发出多个数据包,并给这些数据包设置不同的TTL值,最后该主机就能够得到一连串的数据包路径。
三、NAT技术
NAT(Network Address Translation,网络地址转换)技术,是解决IP地址不足的主要手段,并且能够有效地避免来自网络外部的攻击,隐藏并保护网络内部的计算机。
1、NAT技术背景
在IPv4协议中,IP地址数量不足是一个大问题,而NAT技术就是当前解决IP地址不够用的主要手段,是路由器的一个重要功能。
- 在进行对外通信时,NAT能够将私有IP经过一系列替换操作最终转为全局IP,也就是说,NAT是一种将私有IP和全局IP相互转化的技术方法。
- 装有NAT软件的路由器叫做NAT路由器,所有使用私有IP的主机在和外界通信时,都要在NAT路由器上将其私有IP转换成全局IP。
很多学校、家庭、公司内部每个终端设置的IP都是私有IP,而只在路由器或必要的服务器上设置全局IP。
全局IP要求唯一,但是私有IP不需要,在不同的局域网中出现相同的私有IP是完全不影响的。
2、NAT IP转换过程
-
首先路由器是是至少有两个IP的,一个LAN口IP对内网进行连接,是私有IP,另外一个是WAN口IP,也可以是内网IP,但这里我们先假设是公网IP。
-
当内网的主机经过路由器向外发送数据时,会由路由器将其源IP替换为WAN口IP。
假设某个局域网当中有A、B、C三台主机,在公网当中有一台服务器,以主机A访问公网中的这台服务器为例,我们来看看数据包在传输过程中IP地址的转换过程。
-
NAT路由器将报文的源地址从
10.0.0.10
替换成公网的IP202.244.174.37
,然后就可以以公网IP的形式对外访问公网当中的服务器了,相当于是该路由器代替主机A向服务器发起了数据请求。 -
当服务器进行响应时,由于请求报文中是路由器的公网IP,自然是响应给路由器,当路由器收到外部的数据时, 又会把响应报文的目标IP从
202.244.174.37
替换回10.0.0.10
,然后发送给内网中对应的主机。
可以看出我们只需要在WAN口处配置一个公网IP,就能够让一个大的局域网内的所有内网IP的主机都能够进行访问公网,这极大的解决了IP地址不足的问题。
3、地址转换表
- 当局域网当中的主机要访问外网时,NAT路由器会将这些数据包的源IP地址替换成自己的WAN口IP地址。
- 当外网发来响应数据时,NAT路由器又会将响应数据包的目的IP地址替换成局域网中对应主机的IP地址。
为了维护好上面的关系,路由器内部自动维护了一个地址转换表。
- 局域网中的主机第一次向外网发起数据请求时,就会生成表中的映射关系。
- 比如在TCP建立连接时,会建立对应的映射关系,在TCP断开连接后,就会删除对应的映射关系。
在刚才的例子中,主机A第一次向服务器发起数据请求时,路由器中就会建立以下映射关系。
但如果转换表中维护的只是局域网中主机的私有IP,与其对应访问的外网当中的某个公网IP之间的映射关系,那么就会出现某些问题。
比如:局域网中的主机A和主机B同时都在访问该服务器,那么此时转换表中就会建立如下两对映射关系:
此时这张转换表只能保证从左到右的唯一性,而不能保证从右到左的唯一性,当服务器发来响应数据时,该数据包中的目的IP地址都是路由器的WAN口IP,此时NAT路由器就无法判断该数据包应该转发给主机A还是主机B,此时就需要用到NAPT技术。
4、NAPT技术
NAPT(Network Address Port Translation,网络地址端口转换),可以将多个内部地址映射为一个合法公网地址。
因为如果局域网中的多台主机同时访问同一个外网服务,当路由器收到外网发来的响应数据时,路由器无法判断该响应数据应该转发给局域网中的哪台主机,因为该局域网中所有主机的数据包都由路由器代替发送了,因此发来的响应数据包的目的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地址和目的端口号进行替换,然后转发给局域网内对应的主机。
问:对于NAPT的转换表维护目的IP和端口是否是多余的?
对与NAPT转换表,如果我们将目的IP+port去掉,我们发现从内网到外网,从外网到内网也是可以正常转换的,但是我们的路由器还是维护了目的IP+port,这是因为维护目标IP+port字段能够保证我们内网的安全性!
例如我们的主机A向服务器B发起了一个请求,构建了上图中的10.0.0.10:1025
与202.244.174.37.1025
映射关系,以后主机A与服务器就可以通过路由器进行通信了。
但是此时有一个黑客知道了NATP转换表中的信息,于是就可以用任意一台主机向主机A所在的内网的路由器的1025号端口发送数据,于是路由器就会无脑的将数据转给主机A,于是主机A就会收到奇怪的数据,而有了目的IP + port,路由器就能够判断这个主机是不是已经正常建立通信的主机。
5、重新理解路由器
路由器是工作在网络层的一个设备,负载将数据包从一个网络转发到另一个网络,但不能狭义的认为路由器只能工作在网络层。
-
NAT路由器在进行数据转发时,不仅有能力替换数据包的源IP和目的IP地址,而且在必要的情况下还可能会替换数据包的源端口和目的端口号,而端口号实际是传输层的概念。
-
为了对IP地址进行动态管理,大部分路由器都带有DHCP功能,而DHCP实际是应用层的一个协议。
因此现在的路由器其实并不仅仅提供网络层相关的服务,网络协议栈中的各层路由器可能都有涉及。
6、NAT技术的缺陷
NAT技术进行私有IP和公网之间的替换,主要就是依赖NAT路由器当中维护的网络地址转换表,但这张转换表也体现出了NAT的一些缺陷:
-
无法从NAT外部向内部服务器建立连接,因为 NAPT 转换表没有转换记录。
-
转换表的生成和销毁都需要额外开销。
-
通信过程中一旦NAT设备异常,即使存在热备,所有的TCP连接也都会断开。
NAT 穿透技术(了解)
NAT 穿越技术拥有这样的功能,它能够让网络应用程序主动发现自己位于 NAT 设备之后,并且会主动获得 NAT 设备的公有 IP,并为自己建立端口映射条目,注意这些都是 NAT设备后的应用程序自动完成的。
也就是说,在 NAT 穿透技术中,NAT设备后的应用程序处于主动地位,它已经明确地知道 NAT 设备要修改它外发的数据包,于是它主动配合 NAT 设备的操作,主动地建立好映射,这样就不像以前由 NAT 设备来建立映射了。
说人话,就是客户端主动从 NAT 设备获取公有 IP 地址,然后自己建立端口映射条目,然后用这个条目对外通信,就不需要 NAT 设备来进行转换了。
四、NAT和代理服务器
路由器往往都具备NAT设备的功能, 通过NAT设备进行中转, 完成子网设备和其他子网设备的通信过程。
代理服务器看起来和NAT设备有一点像. 客户端像代理服务器发送请求, 代理服务器将请求转发给真正要请求的服务器; 服务器返回结果后, 代理服务器又把结果回传给客户端。
那么NAT和代理服务器的区别有哪些呢?
-
从应用上讲, NAT设备是网络基础设备之一, 解决的是IP不足的问题. 代理服务器则是更贴近具体应用, 比如通过代理服务器进行翻墙, 另外像迅游这样的加速器, 也是使用代理服务器。
-
从底层实现上讲, NAT是工作在网络层, 直接对IP地址进行替换,代理服务器往往工作在应用层。
-
从使用范围上讲, NAT一般在局域网的出口部署, 代理服务器可以在局域网做, 也可以在广域网做, 也可以跨网。
-
从部署位置上看, NAT一般集成在防火墙, 路由器等硬件设备上, 代理服务器则是一个软件程序, 需要部署在服务器上.
代理服务器是一种应用比较广的技术:
- 翻墙: 广域网中的代理.
- 负载均衡: 局域网中的代理.
代理服务器又分为正向代理和反向代理:
- 正向代理用于隐藏真实客户端。
- 反向代理用于隐藏真实服务端。
- 两者的区别在于代理的对象不一样:正向代理代理的对象是客户端,反向代理代理的对象是服务端。
1、正向代理
正向代理,是一个位于客户端和目标服务器之间的服务器,客户端并不直接访问目标服务器,而是先访问代理服务器,由代理服务器代替客户端去访问对应的目标服务器,并将目标服务器的响应结果返回给客户端。
比如公司内部一般都会有自己的服务器,当我们使用公司内网上网时:
- 我们对外网发起的数据请求,首先会转发到公司的这台服务器上,然后由公司的这台服务器代替你对外网进行访问。
- 当公司的服务器收到对应外网的响应数据后,再由公司的这台服务器将数据转发给你。
正向代理的好处:
- 正向代理最大的一个好处就是可以加速资源访问,比如公司中大量员工都要访问外网的同一个资源,那么正向代理服务器就可以将对应的资源缓存到本地,此时当其他人要访问该资源时,直接在正向代理服务器就可以获取,而不需要再次进行外网访问。
2、反向代理
反向代理,也是一个位于客户端和目标服务器之间的服务器,客户端直接向反向代理服务器发起数据请求,然后再由反向代理服务器将客户端的数据请求转发给真正的目标服务器进行处理,数据处理完毕后反向代理服务器再将数据结果返回给客户端,对于用户而言反向代理服务器就相当于目标服务器。
比如域名www.baidu.com
对应的服务器实际就是一个反向代理服务器。
百度内部实际并不是只有一台服务器,但不同地区的人们都可以通过访问www.baidu.com
享受到百度提供的服务,实际我们访问的就是百度的反向代理服务器。
当这台反向代理服务器收到客户端的数据请求后,就会将我们的数据请求转发给百度内部的某台服务器进行数据处理,然后再将数据处理的结果返回给客户端。
反向代理的好处:
-
反向代理可以起到负载均衡的作用。
比如不设置反向代理服务器,只使用一台服务器,那么当用户量很大时,单个百度服务器的扛不住这么大的流量的,有了反向代理以后,那么用户在访问百度时,我们就能够通过某些方法让用户的数据请求较为平均的落到每台服务器上,缓解服务器的压力。 -
反向代理还能起到安全防护的作用。有了反向代理服务器后,我们不需要直接将提供服务的服务器对应的信息暴露出去,此外当由非法请求发送到反向代理服务器时,反向代理服务器就相当于一层软件屏障,可以在反向代理服务器当中部署一些防护措施,让这些非法请求在反向代理服务器这里就被过滤掉,而不会影响内部实际提供服务的服务器。
需要注意的是,代理服务器的主要工作只是对数据进行转发,因此代理服务器处理数据的压力不会特别大,并且代理服务器也可以有多个,因此不必担心代理服务器过载的情况。
关于负载均衡的一个现象:
不知你是否注意过:当我们我们每次使用ping
命令访问百度时可能会得到不同的IP,这是为什么?
答案就是负载均衡,我们的请求被分配到了同一个服务的不同的服务器上面。