📢 感兴趣的能够去看看阿宽的博客html
要解释这个缘由,得从我刚入部门那天,在每日的工做总结里,跟部门经理提了,想有技术分享,而后提升组里的技术氛围,因而呢,组里每周五,都会轮流进行分享,从项目架构,到 flutter,微前端,网络,(小声 bb: 其实我大部分都没听懂...)前端
因而,上周五就是我分享了...分享啥呢?前端?算了...因而就定了个题,分享网络吧,可是网络也很大啊,后边想了想,就分享 DNS 吧,由于我对 DNS 了解不深,恰好经过此次,去对 DNS 了解一下~因此就有了这篇文章 ~linux
看到没,这就是典型的本身挖坑给本身跳git
我不能保证你能学到啥,只是围绕 DNS,而后一块儿聊一下前端对 DNS 的一个理解,若是我哪里写错了,能够提出来哈,固然,大佬就请绕路 ~github
这也不是一个标题文,"干货"这词被我用双引号标识起来了嘛~算法
此文章仅表明笔者对 DNS 的一个理解 ~ 此文章的书写顺序是一个"时间线",但愿你,能仔细读读哈~ 下面进入正文 👇数据库
(其实不想介绍,由于这个也是我百度百科查的...)浏览器
DNS 全称 :Domain Name System,域名服务系统,它做为将域名和 IP 地址相互映射的一个分布式数据库,可以令人更方便地访问互联网。缓存
既然说是域名服务系统,咱们得先知道,什么是域名? 好比下边这些,均可以说是域名 👇bash
www.pengdaokuan.cn
www.pdk.com
www.seewo.com
www.class.seewo.com
www.cvte.com
复制代码
那么,咱们从一个简单的问题入手,域名是如何注册的?
👉 你能够经过这里了解: WHOIS
ok,按照上边的流程,咱们注册了一个域名 www.pengdaokuan.cn (没钱维护,已经die了)
,而后呢,咱们知道,在浏览器中,输入 IP
或者 域名
,均可以访问咱们的目的网站,既然如此,为何不经过域名去确认通讯对象,而是经过 IP 呢?
不要跟我说,由于 TCP/IP 协议规定要知道目的 IP 地址,因此就选择 IP 确认通讯 ~ 固然,这应该也是一方面的缘由,可是具体的缘由以下 👇
📢 从运行效率上来说,IP 地址是 32 比特,也就是 4 字节,而域名,最短也要十几个字节,最长的时候,可能达到 255 字节,换句话讲,使用 IP 地址只须要处理 4 字节的数字,如今用域名,就要处理十几甚至 255 个字节的字符,这严重影响效率。同时添加了路由器的负担,传送数据也会花费更长的时间。
好比我发送一个 2KB 的字符串,中间有可能经过光纤传递传递,也有可能其余的方式,如早期的铜缆。不一样的链接材料带宽不一样。有可能一个包的 maxSize 只能 1KB。应用层的数据在通信过程当中会根据通信设备的带宽分红不少个包。一个 http 请求并非只发了一个包,可能一次请求被拆成了不少个包。因此若是用域名,网络请求的数据量会增长不少。
这时,有键盘侠
出来发言了 : “那使用高性能路由器不就能解决这个问题了吗”
ok,可是要知道,路由器的速度是有极限的,互联网内部流动的数据量已经让路由器疲于应付了。虽然随着技术发展,路由器性能会不断提高,可是与此同时,数据量也以更快的速度在增加。因此说,用域名确认通讯对象不是一个明智的选择 ~
咱们常说,DNS 使用 UDP 进行传输,那么 DNS 可不可使用 TCP 呢?
经过百度百科,咱们知道,DNS 使用的是 53 端口,是能够经过 TCP 和 UDP 进行传输,只是说,大部分时候都用的 UDP 协议,但在如下两种状况,会以 TCP 协议进行传输 :
可能此时此刻,你在想,我特么知道区域传送是啥有什么用,我一个前端仔,只要知道 DNS 解析 url 的流程就完事了嘛,ok,若是是这样想的,能够直接滚动到下边啦 ~
DNS 区域传送
(DNS zone transfer)指的是一台备用服务器使用来自主服务器的数据刷新本身的域(zone)数据库,目的是为了作冗余备份,防止主服务器出现故障时 dns 解析不可用。
📌 区域传送是主域名服务器向辅助域名服务器传送变化的那部分数据,辅域名服务器会定时向主域名服务器进行查询,以便了解数据是否有变更。若有变更,会执行一次区域传送,进行数据同步。
既然说到了传送变更的那部分数据,那么不得不提区域文件了...科普一下概念
DNS区域(ZONE):DNS域名空间中连续的树,将域名空间按照须要划分为若干较小的管理单位。
DNS服务器中,必须先创建区域,在区域中创建子域,在区域或者子域中添加主机记录。
存储区域数据的文件,称为区域文件。一台DNS服务器上能够存放多个区域文件,同一个区域文件也能够存放在多台DNS服务器上。
区域文件包含主机名和对应IP地址、刷新间隔和过时时间等信息。
复制代码
区域文件一般只配置一个域名,区域名字即为域名。它能够包含多个记录。它的表达形式为 :一条记录就是一条从资源到名字的单一映射。
咱们能够来看一下 SOA 起始受权记录,注意,上边说到,辅助域名服务器会定时向主域名服务器进行查询,那么定时的时间是多久,如何知道是否数据改变?
pengdaokuan.cn. IN SOA pdk.com. pdk.qq.com. (
12083 ; serial number
3h ; refresh interval
30m ; retry interval
3w ; expiry period
1h ; negative TTL
)
复制代码
来简单讲一下 👇
pengdaokuan.cn.
: 这是区域的根。这里指定这个 zone 文件是给 pengdaokuan.cn. 这个域名的
IN SOA
: "IN"这个部分的意思是 internet(在不少记录中会出现)。SOA 是指示符用来表示这是一个 SOA 记录。
pdk.com.
: 这里定义了这个域名的主名字服务器。名字服务器能够是主服务器或者从服务器。若是动态 DNS 被配置,这里就须要一台主服务器。若是没有配置动态 DNS,这里就只是你的一个主名字服务器。
pdk.qq.com.
: zone 区域管理员的 email 地址。email 地址中的@被替代为一个点。若是邮箱地址中有点那么须要使用一个""反斜杠来替代,好比 xx.xxx@qq.com(须要写成 xx\xxx.qq.com)。
12083
: 这个是 zone 文件的序列号。每次编辑 zone 文件,必需要增长一次这个文件的这个数字让它正确传播。从服务器会检查主服务器的 zone 文件的序列号是否比他们系统里现有的序列号大。若是是,它就会请求一个新的 zone 文件,不然就继续使用老的文件。(这就是为何会知道数据发生改变了)
3h
: 这个是 zone 文件的刷新间隔周期。从机会等待这个时间周期而后轮询主机,检查 zone 文件变化。(这就是定时发送查询,看是否有数据变更)
30m
: 这是重试 zone 文件的间隔时间。若是从机在刷新时间到达后没法链接主机,他会等待一段时间并从新尝试轮询主机。
3w
: 过时时间。若是一个名字服务器从机在这个时间段里没法链接服务器,它就不能做为这个区域的权威来发挥响应
1h
: 这个时间段是名字服务器缓存一个名字错误的时间量,若是它不能在文件中找到请求的名字。
www.pengdaokuan.cn IN A 174.15.41.94
www.pdk.handsome.cn IN A 168.168.168.168 (开个玩笑)
复制代码
www.pengdaokuan.cn IN AAAA IPv6_address
www.pdk.handsome.cn IN AAAA IPv6_address
复制代码
www.cname1.pdk.cn IN CNAME www.cname2.pdk.cn
www.cname2.pdk.cn IN CNAME www.pengdaokuan.cn
www.pengdaokuan.cn IN A 174.15.41.94
复制代码
IN NS pdk1.root.com.
IN NS pdk2.root.com.
pdk1 IN A 174.15.41.94
pdk2 IN A 168.168.168.168
复制代码
上边也说了,会进行区域传送,那么问题又来了,区域传送有那种方式?
当一个新的 DNS 服务器添加到区域中,并配置为备份服务器时,它会执行彻底区域传送
,在主服务器上获取完整的资源记录副本;同时,为了保证数据同步,主 DNS 服务器有更新时也会及时经过备份服务器查询从而更新(增量区域传送
)
那么请问,DNS 域传送会不会存在漏洞呢?
答案是 : 会!!!
✨ 若是 DNS 服务器配置不当,可能致使匿名用户获取某个域的全部记录。形成整个网络的拓扑结构泄露给潜在的攻击者。一般采用的一个重要的手段是使用 Private DNS。将内部网络与外部互联网隔离开。
在 window 上,经过 nslookup
来测试 DNS 传送
nslookup
查询百度的 IP 信息都被拒绝或者是超时,这......好的,这没得办法继续演示了,固然对于 nslookup 的更多使用,你们能够去查一下,这边就很少说了,正常状况下,若是存在域传送漏洞,那么就会暴露了一些重要信息,好比 👇 :
攻击者可以获取到 :
1. 网络的拓扑结构,服务器集中的地址段(好比经过type=CNAME记录得知)
2. 数据库服务器的IP地址(可经过type=A记录查出)
3. 其余敏感服务器的相关信息
4. ....
复制代码
DNS 域名系统,主要实现的功能是将域名转换成ip地址的一个服务
。它是由一个分层的 DNS 服务器实现的分布式服务器
,同时。它也是一个使得主机可以查询分布式数据库的应用层协议。
下面这个图应该会更加清晰一些,画的太累了 😥
(画图真的累了,我太难了...)
上边的流程很明显了,我就不文字说明了,为此,我还特地的下了个抓包软件进行验证
感兴趣的能够下这个 : Wireshark
在这里边,能够经过 host 文件,进行一个检验,若是 host 有映射,不会发 DNS 查询包,若是没有 host 映射,会去查本地 DNS 缓存,若是有缓存,也不会发 DNS 查询包。
上边说了,若是本地 host 没有映射,同时本地 DNS 没有缓存,那么就要发起 DNS 查询了~
咱们都知道,DNS 解析域名成 IP,那么它到底如何作的?
解析器就是一段程序,它是存在于操做系统的 Socket 库中,Socket 库用于调用网络功能的程序组件集合。当根据域名查询IP地址时,浏览器会调用Soket库中的解析器。
通常来说,应用程序编写的操做内容都是从上到下的,当执行到须要调用解析器的部分时,对应的那一行程序就会被执行,应用程序就会暂停。Socket 库的解析器开始运行。
这里就是经过 gethostbyname()
作的骚处理,直接看图,就能看得懂了,若是你想看更加详细的,能够看这里
不想看的,能够看这里,这是 gethostbyname 的函数原型以及 hostent
struct hostent {
char *h_name; /* official name of host,主机的规范名 */
char **h_aliases; /* alias list,主机的别名 */
int h_addrtype; /* host address type,ip地址类型 */
int h_length; /* length of address,ip地址长度 */
char **h_addr_list; /* list of addresses,主机的ip地址 */
#define h_addr h_addr_list[0]
}
struct hostent *gethostbyname(const char *name);
struct hostent *myhost = gethostbyname(argv[1]);
printf("%s\n", inet_ntoa(*(struct in_addr *)myhost->h_addr));
复制代码
看懂了吗,看不懂的小伙伴能够移步百度或者 google,进行更详细的资料查询 ~
调用解析器以后,解析器会向 DNS 服务器发送查询请求,而后 DNS 服务器会返回响应信息。响应信息中包含查询到的 IP 地址,解析器会取出 IP 地址,并将其写入浏览器指定的内存地址中。完成对 IP 地址的查询,接下来,浏览器会向 Web 服务器发送消息时,从内存地址取出 IP 地址,并将它与 HTTP 请求消息一块儿交给操做系统就能够了。 ---------来自书籍《网络是怎样链接的》
看流程图,咱们知道,DNS 查询有两种方式,一种是迭代查询
,另外一种是递归查询
,至于在讲这两种查询以前,咱们先来了解一下,什么是 权威 DNS 和递归 DNS
权威 DNS 是特定域名记录(例如“pdk.com”)在域名注册商处所设置的 DNS 服务器,用于特定域名自己的管理(增长、删除、修改等)。
权威 DNS 服务器只对本身所拥有的域名进行域名解析,对于不是本身的域名则拒绝访问。好比,向“pdk.com”的权威 DNS 服务器查询“baidu.com”的域名确定会查询失败。
递归 DNS(也称本地 DNS 或者缓存 DNS)用于域名查询。递归 DNS 会迭代权威服务器返回的应答,直至最终查询到的 IP 地址,将其返回给客户端,并将请求结果缓存到本地。
对用户发出的域名解析请求,递归 DNS 必须给出一个最终的 IP 地址结果
。完整的递归 DNS 查询流程须要 DNS 服务器从根域名 “.” 服务器,顶级域名服务器(例如“.com”),一级域名服务器(例如“pdk.com”)等一级一级递归查询,直到最终找到权威服务器取得结果,并返回给客户。同时,递归服务器根据域名 TTL (time to live),缓存查询结果,便于相同域名重复查询。
针对这两种查询,我就很少说,我画了两个图,同时对于流程步骤均在图中,直接看图吧 👇
递归查询
迭代查询
经过递归查询或迭代查询后,查询的结果会在本地 DNS 作缓存,这样能够减小查询的次数,加快域名解析过程。
在配置 DNS 解析的时候,须要指定 DNS 解析的 TTL(Time To Live)参数,这个参数告诉本地 DNS 服务器,域名缓存的最长时间。缓存时间过了以后,本地 DNS 服务器就会删除这条记录,删除以后,若是有用户访问这个域名,就要重复一遍上述复杂的流程。
🔔 tips: 若是不会常常修改 IP 地址的话,能够将 TTL 设置到协议最大值,即 24 小时。带来的好处是,让域名解析记录可以更长时间的存放在本地 DNS 服务器中,以加快全部用户的访问。
其实真的不想讲这几个玩意,可是 DNS 真的涉及的太广了,固然我也没有很了解,只是说去查询过这方面的资料(没办法,不查我分享就 gg 了)
在讲这些以前,咱们一块儿回顾一下什么是内网,什么是外网,公网 ip 地址,私网 ip 地址...
内、外网是相对于防火墙而言的,在防火墙内部叫作内网,反之就是外网。在必定程度上外网等同于公网,内网等同于私网。
咱们目前广泛使用的,仍然仍是 IPv4 地址,分为 A、B、C、D、E 五类(具体的自行百度一下,谢谢合做),其中 A、B、C 类是咱们常见的 IP 地址段。在这三类地址中,大多数为公有地址,须要向国际互联网信息中心注册。在 IPv4 地址中预留了 3 个 IP 地址段,做为私有地址,供家庭、企业、学校等内部组网使用。
好比
IP 地址区段 | IP 数量 | 分类网络说明 |
---|---|---|
10.0.0.0 - 10.255.255.255 | 16777216 | 单个 A 类网络 |
172.16.0.0 - 172.31.255.255 | 1048576 | 16 个连续 B 类网络 |
19.168.0.0 - 192.168.255.255 | 65536 | 256 个连续 C 类网络 |
除了这三个 ip 地址段为私有 ip 地址外,其它的都为公网 ip。一般状况下,按照须要容纳的主机数选择私有地址段。家庭网络规模比较小
,一个 C 类地址,192.168.1.x 能够容纳 254 个终端,足够使用。
好比个人手机链接的 wifi,ip 地址为 :
或者我电脑的 IP 地址为 :
这里就有人以为,你贴这两个图出来干哈用的,举个例子,以家中接入外网的路由为中心,家中全部使用路由器的设备,他们大多数以19二、17二、10
开头的 IP,通过路由器以后才连到外网。
内网 IP 和外网 IP 什么关系呢?在如今的网络中,公网 IP 又称外网 IP,是在 Internet 使用的 IP 地址,而内网 IP 地址则是在局域网中使用的 IP 地址。 因为公网 IP 是比较紧张的,全世界那么多网络设备根本没法知足,内网的产生就是为了解决这个难题的!
你们都去过网吧吧(反正我初中时候每天逃课去打 CF),其实呢,一个网吧有 N 台电脑,可是它其实只须要一个公网 IP 就能够给下边的电脑提供上网了,而那么多台机子,各自拥有不一样的内网 IP。若是其中的某台机子,想要访问公网(Internet),那么得须要NAT技术
,就能够了。
NAT 地址网络转换,经过在路由器上安装 NAT 软件,它至少有一个有效的公网 IP 地址,经过 NAT 路由器将内部私有 IP 转换成公网 IP。它的问题在于 NAT 设备自动屏蔽了非内网主机主动发起的链接,也就是说,从外网发往内网的数据包将被 NAT 设备丢弃,这使得位于不一样 NAT 设备以后的主机之间没法直接交换信息.
咱们最多见的一种方式是 : 端口映射,原理为将外网主机的 IP 地址的一个端口,映射到内网中一台机器,提供相应的服务。当用户访问该 IP 的这个端口时,服务器自动将请求映射到对应局域网内部的机器上。
👇 下边是一个 NAT 技术的原理图
PPP0 是经以太网接口 PPP 拨号时建立的链路接口,用以创建 PPP 拨号链接。PPP 拨号是虚拟拨号,虚拟拨号是宽带链接的拨号方式,需支持 PPPOE 协议,会分配一个 IP。
我知道,直接讲这种原理,你们都不想听,下面经过一个图来说解,(画图是真的累啊...)
我相信,你们应该都看得懂这个图吧,此时咱们的主机 IP 为内网 IP,而上一层的路由器 IP 是运营商经过 DHCP 分配的 IP,它不是一个公网 IP,而是内网 IP,也能够说是大局域网 IP。若是,咱们想要外部主机访问家里服务器,要获得一个公网 IP 地址,而不是大局域网 IP 地址。
理所固然的,你可能就会想说,经过 NAT 技术,也就是端口映射获得一个外网的 IP 嘛,but !!! 咱们作端口映射以后,获得的 IP,不是公网的 IP,而是一个大局域网的 IP,由于咱们只作了一次 NAT 技术转发,这也就是为啥端口映射失败的缘由。
由于在路由器上作端口映射,但在运营商服务器这边没有作端口映射,你告诉我,这能正确嘛?
固然,若是你很牛逼,能穿透到运营商这边去操做,那是很棒的,but !!! 运营商服务器是已经被彻底控制了,你还想在人家上边作一层端口映射?作个锤子...
那么,在大内网状况下,作端口映射,明显这条路是不会通的,那咋办,难不成坐吃等死吗?不,还有其余办法,想要正确的映射,就须要一个穿透的东西。这就是内网穿透
。
内网穿透,也叫作 NAT 穿透。它的目的就是进行 NAT 穿透,使得具备某一个特定源 IP 地址和源端口号的数据包不被 NAT 设备屏蔽而正确路由到内网主机。
也就是说,外部主机想要和局域网内的主机进行通讯,能够经过内网穿透这条路。
内网穿透必须涉及到一个东西,叫作域名。好比 www.pdk.com
,申请了域名以后,咱们是须要域名绑定 IP 的,由于没有公网 IP,那么咱们须要在本身的终端或者是主路由器存在一个内网穿透的服务软件。经过这个服务,将域名绑定的服务器和本身终端的服务器联系起来。
有了联系,就会将本身电脑上的端口直接映射到域名上,咱们申请的这个域名是在服务商那边的,它有本身的服务器,也有本身的公网 IP。咱们把这个域名投射出去,投射到外网,至关于域名就是个人公网 IP 了,经过访问域名,就与电脑本地的软件联系起来,这样直接访问到被大内网层层阻隔的内部服务器。(须要购买域名和安装穿透软件)
💢 注意: 这里均是我的的理解和认知,若是有大佬了解更加详细或者是我讲的不正确,请指出,谢谢 ~
那么 DDNS 又是个什么状况呢? 首先,DDNS 针对的不是一个内网用户,而是一个公网 IP,若是你直接 PPPOE 拨号,你家里就有一个公网 IP,有了公网 IP,你不须要内网穿透(你都是公网 IP 了,穿个毛啊)
那么问题来了,我都有公网 IP 了,我为啥还须要 DDNS 勒?由于运营商给的不是一个稳定的 IP 地址,而是会变的,好比说今天拨号获得的是这个地址,那么过两天,它重置了一下,它把你的 PPPOE 重拨了一下,那么获得的是另外一个 IP 地址。若是咱们作了端口映射,正常状况下,是 ojbk 的,可是若是 IP 地址改变了,对不起,端口映射就失效了。
那么,咱们若是在 IP 地址变更状况下,端口映射有效勒?那就须要一个域名。要知道,DDNS 和内网穿透本质是相同的,利用域名技术达到稳定内网穿透,域名是不变的,软件与服务器的联系也是一种稳定的方式,DDNS 针对的是 公网 IP,好比运营商直接分配动态 IP,自身就有固定 IP,PPPOE 拨号获得的一个不稳定 IP(今天拨号和明天拨号不是一个相同 IP),正常端口映射就会变化,若是 IP 地址改变,可是端口映射就会失效。
当 IP 发生改变,好比今天的是 xxx.xxx.x.1
,明天的变成了 xxx.xxx.x.2
, 那么咱们在路由器作了 DNS 设置以后,会作不断的扫描,好比 10 分钟扫描一次,而后会把 IP 改变的信息,上传到购买的服务器,此时会对域名映射的 IP 进行一个修改,而后域名会获得一个正确的公网 IP,从而实现端口映射。
可能有点懵逼...总之就是,若是你获得了公网 IP,你须要 DDNS,若是你是在大局域网下,是内网 IP,你须要内网穿透。
可能这时候你有又有疑问了,MD,不是在讲 DNS 吗,怎么跑到 CDN 了,由于我喜欢 ~
CDN,内容分发网络,和 DNS 结合,让用户访问延迟最小的节点,当用户请求资源时,就近返回节点上缓存的资源,而不须要每一个用户的请求都到源站获取,避免网络拥塞、缓解源站压力,保证用户访问资源的速度和体验。
咱们先来看个图,你们都买过东西吧,在京东买和在淘宝买,快递哪一个到的快?
这部废话吗?确定是京东啊,为啥,由于京东在边缘节点有一个储货仓啊,经过网购看 CDN 原理,一图胜千言,直接看图吧,亲 ~
CDN 有啥优点??(百度能够查获得)
一个域名解析到多个 IP 地址,当用户向咱们的域名发起请求时,DNS 服务器会自动根据咱们设置好的调度策略(好比: 轮询等),选择一个合适的 IP 返回给用户,用户再向该 IP 发起请求。
好比如今咱们配置了多条A记录
www.pdk.com IN A 175.12.84.47
www.pdk.com IN A 175.12.84.48
www.pdk.com IN A 175.12.84.49
....
复制代码
将 DNS 做为第一级负载均衡,A 记录对应着服务器的 IP 地址
可是,其实更优良的方案应该是 : 将 DNS 做为第一级负载均衡,A记录对应着内部负载均衡的IP地址
,经过内部负载均衡将请求分发到真实的 Web 服务器上。
大部分网站老是部分使用 DNS 域名解析,利用域名解析做为第一级负载均衡手段,即域名解析获得的一组服务器并非实际提供服务的物理服务器,而是一样提供负载均衡服务器的内部服务器,这组内部负载均衡服务器再进行负载均衡,将请求发到真实的服务器上,最终完成请求。
优势 :
缺点 :
我不骗大家,这个优缺点我百度查的,若是你想了解更多 DNS 负载均衡,能够自行去查哈,(而后你就会发现,还有不少知识须要去了解的 ~)
互联网的攻击手段,经过攻击 DNS,或伪造 DNS 的方法,把目标网站域名解析到错误的地址从而实现用户没法访问目标网站的目的。
常见的现象是什么呢 ?
你输入的 url = http://www.pdk.com
,而后出来的是某不良网址(性感荷官,在线发牌的那种)
那么域名劫持的原理是怎样的呢?
那如何才能防止域名劫持?
答案就是 : 报警吧!!!
(开个玩笑,如何防止域名劫持,百度也可以知道了 ~)
做为一名前端,其实 DNS 真的了解的不是很深,可是经过此次的一个分享(分享前的了解和资料查询),最起码我知道了内网穿透、DDNS 这些玩意,虽然不能说这篇文章的含金量多高,可是最起码,知道了关于 DNS 的一些基础知识~
若是你以为这篇文章哪一个地方写错了,请在评论区留言,我会及时修改 ~
这是一篇记录文,你们看看就好哈 ~
💢 容许我爆个粗口,画图真 ji 儿的累,为了防止被偷图,我还在每一个图加了 "小彭" 关键词,啊哈哈哈,对不起,我太狗了
文章首发地址 : 📢 阿宽的博客