阅读 1421

前端渣渣对DNS的正确理解,卧槽无情

DNS

📢 感兴趣的可以去看看阿宽的博客

为什么会有这篇文章?

要解释这个原因,得从我刚入部门那天,在每日的工作总结里,跟部门经理提了,想有技术分享,然后提高组里的技术氛围,于是呢,组里每周五,都会轮流进行分享,从项目架构,到 flutter,微前端,网络,(小声 bb: 其实我大部分都没听懂...)

于是,上周五就是我分享了...分享啥呢?前端?算了...于是就定了个题,分享网络吧,但是网络也很大啊,后边想了想,就分享 DNS 吧,因为我对 DNS 了解不深,刚好通过这次,去对 DNS 了解一下~所以就有了这篇文章 ~

看到没,这就是典型的自己挖坑给自己跳

先打个预防针

我不能保证你能学到啥,只是围绕 DNS,然后一起聊一下前端对 DNS 的一个理解,如果我哪里写错了,可以提出来哈,当然,大佬就请绕路 ~

这也不是一个标题文,"干货"这词被我用双引号标识起来了嘛~

此文章仅代表笔者对 DNS 的一个理解 ~ 此文章的书写顺序是一个"时间线",希望你,能仔细读读哈~ 下面进入正文 👇

介绍

(其实不想介绍,因为这个也是我百度百科查的...)

DNS 全称 :Domain Name System,域名服务系统,它作为将域名和 IP 地址相互映射的一个分布式数据库,能够使人更方便地访问互联网。

既然说是域名服务系统,我们得先知道,什么是域名? 比如下边这些,都可以说是域名 👇

www.pengdaokuan.cn
www.pdk.com
www.seewo.com
www.class.seewo.com
www.cvte.com
复制代码

那么,我们从一个简单的问题入手,域名是如何注册的?

域名注册流程

  • 域名注册人向转销商进行购买域名服务
  • 转销商代表注册人进行注册,但没有与 ICANN 签订合同的关系
  • 经过 ICANN 认证的组织(经销商)来处理域名注册,将需要请求的域名及域名的联系方式和技术信息发送给注册管理机构
  • 注册管理机构会在注册表上记录 Whois 的联系方式,还会将此域名文件添加到主服务器。
  • 更新所有信息,此域名即被视为已注册且可以使用。

👉 你可以通过这里了解: WHOIS

DNS 为什么要通过 IP 确认通信对象

ok,按照上边的流程,我们注册了一个域名 www.pengdaokuan.cn (没钱维护,已经die了),然后呢,我们知道,在浏览器中,输入 IP 或者 域名,都可以访问我们的目的网站,既然如此,为什么不通过域名去确认通信对象,而是通过 IP 呢?

不要跟我说,因为 TCP/IP 协议规定要知道目的 IP 地址,所以就选择 IP 确认通信 ~ 当然,这应该也是一方面的原因,但是具体的原因如下 👇

📢 从运行效率上来讲,IP 地址是 32 比特,也就是 4 字节,而域名,最短也要十几个字节,最长的时候,可能达到 255 字节,换句话讲,使用 IP 地址只需要处理 4 字节的数字,现在用域名,就要处理十几甚至 255 个字节的字符,这严重影响效率。同时添加了路由器的负担,传送数据也会花费更长的时间。

比如我发送一个 2KB 的字符串,中间有可能通过光纤传递传递,也有可能其他的方式,如早期的铜缆。不同的连接材料带宽不同。有可能一个包的 maxSize 只能 1KB。应用层的数据在通讯过程中会根据通讯设备的带宽分成很多个包。一个 http 请求并不是只发了一个包,可能一次请求被拆成了很多个包。所以如果用域名,网络请求的数据量会增加很多。

这时,有键盘侠出来发言了 : “那使用高性能路由器不就能解决这个问题了吗”

ok,但是要知道,路由器的速度是有极限的,互联网内部流动的数据量已经让路由器疲于应付了。虽然随着技术发展,路由器性能会不断提升,但是与此同时,数据量也以更快的速度在增长。所以说,用域名确认通信对象不是一个明智的选择 ~

DNS 可否使用 TCP

我们常说,DNS 使用 UDP 进行传输,那么 DNS 可不可以使用 TCP 呢?

通过百度百科,我们知道,DNS 使用的是 53 端口,是可以通过 TCP 和 UDP 进行传输,只是说,大部分时候都用的 UDP 协议,但在以下两种情况,会以 TCP 协议进行传输 :

  • 返回的响应超过 512 字节(不知道为啥超过 512 就要用 TCP 的,拖出去砍了)
  • 区域传送

区域传送

可能此时此刻,你在想,我特么知道区域传送是啥有什么用,我一个前端仔,只要知道 DNS 解析 url 的流程就完事了嘛,ok,如果是这样想的,可以直接滚动到下边啦 ~

DNS 区域传送(DNS zone transfer)指的是一台备用服务器使用来自主服务器的数据刷新自己的域(zone)数据库,目的是为了做冗余备份,防止主服务器出现故障时 dns 解析不可用。

📌 区域传送是主域名服务器向辅助域名服务器传送变化的那部分数据,辅域名服务器会定时向主域名服务器进行查询,以便了解数据是否有变动。如有变动,会执行一次区域传送,进行数据同步。

既然说到了传送变动的那部分数据,那么不得不提区域文件了...科普一下概念

DNS区域(ZONE):DNS域名空间中连续的树,将域名空间按照需要划分为若干较小的管理单位。

DNS服务器中,必须先建立区域,在区域中建立子域,在区域或者子域中添加主机记录。

存储区域数据的文件,称为区域文件。一台DNS服务器上可以存放多个区域文件,同一个区域文件也可以存放在多台DNS服务器上。

区域文件包含主机名和对应IP地址、刷新间隔和过期时间等信息。
复制代码

区域文件通常只配置一个域名,区域名字即为域名。它可以包含多个记录。它的表达形式为 :一条记录就是一条从资源到名字的单一映射。

Zone File SOA 起始授权记录

我们可以来看一下 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 : 这个时间段是名字服务器缓存一个名字错误的时间量,如果它不能在文件中找到请求的名字。

其他记录

A 记录

  • 记录类型 type=A
  • 记录值为 IPv4 地址
  • TTL 记录了生存时间,即缓存中资源记录的过期时间, 默认 600 秒
www.pengdaokuan.cn IN A 174.15.41.94
www.pdk.handsome.cn IN A 168.168.168.168 (开个玩笑)
复制代码

AAAA 记录

  • 记录类型 type=AAAA
  • 记录值为 IPv6 地址
  • TTL 记录了生存时间,即缓存中资源记录的过期时间,默认 600 秒
www.pengdaokuan.cn IN AAAA IPv6_address
www.pdk.handsome.cn IN AAAA IPv6_address
复制代码

CNAME 记录(这个很重要的哟,后边 CDN 讲到)

  • 记录类型 CNAME
  • 记录值为 CNAME 指向的域名,只可以填写域名
  • TTL 记录了生存时间,即缓存中资源记录的过期时间,默认 600 秒
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
复制代码

NS 记录

  • 记录类型 type=NS
  • 不支持泛解析
  • 记录值为要授权的 DNS 服务器域名,为了保证服务可靠性,至少添加 2 组 DNS 服务
  • TTL 记录了生存时间,即缓存中资源记录的过期时间,默认 600 秒
        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 域传送会不会存在漏洞呢?

答案是 : 会!!!

✨ 如果 DNS 服务器配置不当,可能导致匿名用户获取某个域的所有记录。造成整个网络的拓扑结构泄露给潜在的攻击者。通常采用的一个重要的手段是使用 Private DNS。将内部网络与外部互联网隔离开。

在 window 上,通过 nslookup 来测试 DNS 传送

  1. 这是用nslookup查询百度的 IP 信息
  1. 我想列出百度的一些相关记录等,然后被拒绝了
  1. 想查一些 A 记录或者 ns 记录,均被拒绝

都被拒绝或者是超时,这......好的,这没得办法继续演示了,当然对于 nslookup 的更多使用,大家可以去查一下,这边就不多说了,正常情况下,如果存在域传送漏洞,那么就会暴露了一些重要信息,比如 👇 :

攻击者能够获取到 :
1. 网络的拓扑结构,服务器集中的地址段(比如通过type=CNAME记录得知)
2. 数据库服务器的IP地址(可通过type=A记录查出)
3. 其他敏感服务器的相关信息
4. ....
复制代码

DNS 分层结构

DNS 域名系统,主要实现的功能是将域名转换成ip地址的一个服务。它是由一个分层的 DNS 服务器实现的分布式服务器,同时。它也是一个使得主机能够查询分布式数据库的应用层协议。

下面这个图应该会更加清晰一些,画的太累了 😥

DNS 解析流程(划重点)

(画图真的累了,我太难了...)

上边的流程很明显了,我就不文字说明了,为此,我还特意的下了个抓包软件进行验证

感兴趣的可以下这个 : Wireshark

在这里边,可以通过 host 文件,进行一个检验,如果 host 有映射,不会发 DNS 查询包,如果没有 host 映射,会去查本地 DNS 缓存,如果有缓存,也不会发 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

调用解析器之后,解析器会向 DNS 服务器发送查询请求,然后 DNS 服务器会返回响应信息。响应信息中包含查询到的 IP 地址,解析器会取出 IP 地址,并将其写入浏览器指定的内存地址中。完成对 IP 地址的查询,接下来,浏览器会向 Web 服务器发送消息时,从内存地址取出 IP 地址,并将它与 HTTP 请求消息一起交给操作系统就可以了。 ---------来自书籍《网络是怎样连接的》

看流程图,我们知道,DNS 查询有两种方式,一种是迭代查询,另一种是递归查询,至于在讲这两种查询之前,我们先来了解一下,什么是 权威 DNS 和递归 DNS

权威 DNS

权威 DNS 是特定域名记录(例如“pdk.com”)在域名注册商处所设置的 DNS 服务器,用于特定域名本身的管理(增加、删除、修改等)。

权威 DNS 服务器只对自己所拥有的域名进行域名解析,对于不是自己的域名则拒绝访问。比如,向“pdk.com”的权威 DNS 服务器查询“baidu.com”的域名肯定会查询失败。

递归 DNS

递归 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 服务器中,以加快所有用户的访问。

DDNS、NAT 技术、内网穿透

其实真的不想讲这几个玩意,但是 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 地址为 :

这里就有人觉得,你贴这两个图出来干哈用的,举个例子,以家中接入外网的路由为中心,家中所有使用路由器的设备,他们大多数以192、172、10开头的 IP,经过路由器之后才连到外网。

内网 IP 和外网 IP 什么关系呢?在现在的网络中,公网 IP 又称外网 IP,是在 Internet 使用的 IP 地址,而内网 IP 地址则是在局域网中使用的 IP 地址。 由于公网 IP 是比较紧张的,全世界那么多网络设备根本无法满足,内网的产生就是为了解决这个难题的!

大家都去过网吧吧(反正我初中时候天天逃课去打 CF),其实呢,一个网吧有 N 台电脑,但是它其实只需要一个公网 IP 就可以给下边的电脑提供上网了,而那么多台机子,各自拥有不同的内网 IP。如果其中的某台机子,想要访问公网(Internet),那么得需要NAT技术,就可以了。

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 又是个什么情况呢? 首先,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,你需要内网穿透。

CDN

可能这时候你有又有疑问了,MD,不是在讲 DNS 吗,怎么跑到 CDN 了,因为我喜欢 ~

CDN,内容分发网络,和 DNS 结合,让用户访问延迟最小的节点,当用户请求资源时,就近返回节点上缓存的资源,而不需要每个用户的请求都到源站获取,避免网络拥塞、缓解源站压力,保证用户访问资源的速度和体验。

我们先来看个图,大家都买过东西吧,在京东买和在淘宝买,快递哪个到的快?

这部废话吗?肯定是京东啊,为啥,因为京东在边缘节点有一个储货仓啊,通过网购看 CDN 原理,一图胜千言,直接看图吧,亲 ~

CDN 有啥优势??(百度可以查得到)

  • 提高页面加载速度
  • 本地 Cache 加速,加快访问速度
  • 远程加速,自动选择 cache 服务器
  • 带宽优化,分担网络流量,减轻压力
  • 节约成本

DNS 负载均衡

一个域名解析到多个 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 都可能缓存 A 记录,当某台服务器下线之后,修改了 A 记录,要使其生效也需要一段时间,这段时间,DNS 任然会将域名解析到已下线的服务器上,最终导致用户访问失败。
  • 不能够按服务器的处理能力来分配负载。DNS 负载均衡采用的是简单的轮询算法,不能区分服务器之间的差异

我不骗你们,这个优缺点我百度查的,如果你想了解更多 DNS 负载均衡,可以自行去查哈,(然后你就会发现,还有很多知识需要去了解的 ~)

DNS 劫持(域名劫持)

互联网的攻击手段,通过攻击 DNS,或伪造 DNS 的方法,把目标网站域名解析到错误的地址从而实现用户无法访问目标网站的目的。

常见的现象是什么呢 ?

你输入的 url = http://www.pdk.com,然后出来的是某不良网址(性感荷官,在线发牌的那种)

那么域名劫持的原理是怎样的呢?

那如何才能防止域名劫持?

答案就是 : 报警吧!!!

(开个玩笑,如何防止域名劫持,百度也能够知道了 ~)

最后再说两句话

作为一名前端,其实 DNS 真的了解的不是很深,但是通过这次的一个分享(分享前的了解和资料查询),最起码我知道了内网穿透、DDNS 这些玩意,虽然不能说这篇文章的含金量多高,但是最起码,知道了关于 DNS 的一些基础知识~

如果你觉得这篇文章哪个地方写错了,请在评论区留言,我会及时修改 ~

这是一篇记录文,大家看看就好哈 ~

💢 允许我爆个粗口,画图真 ji 儿的累,为了防止被偷图,我还在每个图加了 "小彭" 关键词,啊哈哈哈,对不起,我太狗了

文章首发地址 : 📢 阿宽的博客

关注下面的标签,发现更多相似文章
评论