什么是DNS
域名系统(英文:Domain Name System,缩写:DNS)是互联网的一项服务。它作为将域名和IP地址相互映射的一个分布式数据库,能够使人更方便地访问互联网。DNS使用UDP端口53。当前,对于每一级域名长度的限制是63个字符,域名总长度则不能超过253个字符。
域名系统在现在的互联网中非常重要,因为服务器的 IP 地址可能会经常变动,如果没有了 DNS,那么可能 IP 地址一旦发生了更改,当前服务器的客户端就没有办法连接到目标的服务器了,如果我们为 IP 地址提供一个『别名』并在其发生变动时修改别名和 IP 地址的关系,那么我们就可以保证集群对外提供的服务能够相对稳定地被其他客户端访问。
域名层级
域名层级是一个层级的树形结构,树的最顶层是根域名,一般使用 .
来表示,这篇文章所在的域名一般写作 draveness.me
,但是这里的写法其实省略了最后的 .
,也就是全称域名(FQDN)dravenss.me.
。
根域名下面的就是 com
、net
和 me
等顶级域名以及次级域名 draveness.me
,我们一般在各个域名网站中购买和使用的都是次级域名、子域名和主机名了。
域名服务器
既然域名的命名空间是树形的,那么用于处理域名解析的 DNS 服务器也是树形的,只是在树的组织和每一层的职责上有一些不同。DNS 解析器从根域名服务器查找到顶级域名服务器的 IP 地址,又从顶级域名服务器查找到权威域名服务器的 IP 地址,最终从权威域名服务器查出了对应服务的 IP 地址。
$ dig -t A draveness.me +trace
- 1
我们可以使用 dig 命令追踪 draveness.me
域名对应 IP 地址是如何被解析出来的,首先会向预置的 13 组根域名服务器发出请求获取顶级域名的地址:
工作原理
在我们对 DNS 有了简单的了解之后,接下来我们就可以进入 DNS 工作原理的部分了,作为用户访问互联网的第一站,当一台主机想要通过域名访问某个服务的内容时,需要先通过当前域名获取对应的 IP 地址。这时就需要通过一个 DNS 解析器负责域名的解析,下面的图片展示了 DNS 查询的执行过程:
- 本地的 DNS 客户端向 DNS 解析器发出解析 draveness.me 域名的请求;
- DNS 解析器首先会向就近的根 DNS 服务器
.
请求顶级域名 DNS 服务的地址; - 拿到顶级域名 DNS 服务
me.
的地址之后会向顶级域名服务请求负责dravenss.me.
域名解析的命名服务; - 得到授权的 DNS 命名服务时,就可以根据请求的具体的主机记录直接向该服务请求域名对应的 IP 地址;
DNS 客户端接受到 IP 地址之后,整个 DNS 解析的过程就结束了,客户端接下来就会通过当前的 IP 地址直接向服务器发送请求。
对于 DNS 解析器,这里使用的 DNS 查询方式是迭代查询,每个 DNS 服务并不会直接返回 DNS 信息,而是会返回另一台 DNS 服务器的位置,由客户端依次询问不同级别的 DNS 服务直到查询得到了预期的结果;另一种查询方式叫做递归查询,也就是 DNS 服务器收到客户端的请求之后会直接返回准确的结果,如果当前服务器没有存储 DNS 信息,就会访问其他的服务器并将结果返回给客户端。
反向代理水平扩展
具体做法是:在dns-server对于同一个域名可以配置多个nginx的外网ip,每次dns解析请求,轮询返回不同的ip,这样就能实现nginx的水平扩展,这个方法叫“dns轮询”。
集群中的 DNS
使用 DNS 在集群中做服务发现其实是一件比较容易的事情,这主要是因为绝大多数的计算机上都会安装 DNS 服务,所以这其实就是一种内置的、默认的服务发现方式,不过使用 DNS 做服务发现也会有一些问题,因为在默认情况下 DNS 记录的失效时间是 600s,这对于集群来讲其实并不是一个可以接受的时间,在实践中我们往往会启动单独的 DNS 服务满足服务发现的需求。
CoreDNS 其实就是一个 DNS 服务,而 DNS 作为一种常见的服务发现手段,所以很多开源项目以及工程师都会使用 CoreDNS 为集群提供服务发现的功能,Kubernetes 就在集群中使用 CoreDNS 解决服务发现的问题。
…
DNS劫持
插一嘴咯
保护域名/尽量避免攻击
备份策略。一般至少会使用两个域名,一旦其中一个被攻击,用户可以通过另一个访问
随时留意域名注册中的电子邮件
保存好所有权信息(比如账单记录,注册信息等)
随时关注安全补丁
- 1
- 2
- 3
- 4
- 5
- 6
- 7