image.png
学习很多次DNS, 还是搞不清楚,干脆今天就再次来学习一下。

DNS是什么?

DNS(Domain Name System的缩写)的作用非常简单,就是根据域名查出IP地址,你可以把它想象成一本巨大的电话本。

举例来说,如果你要访问域名math.stackexchange.com, 首先要通过DNS查出他的IP是151.101.129.69。

查询过程

虽然只需要返回一个IP地址,但是DNS的查询过程非常复杂,分为多个步骤。
工具软件dig可以显示整个查询过程(md, 一直没有搞不清楚这个指令到底是干嘛的。。。。,今天终于恍然大悟):
image.png
第一段是查询参数和统计
image.png
第二段是查询内容
image.png
上面的结果表示,查询域名math,stackexchange.com的A记录,A是addresss的缩写

第二段是DNS服务器的答复
image.png
上面结果显示,math.stackexchange.com有4个A记录,即4个IP地址,600是TTL值(Time to live的缩写)表示缓存时间,即600ss之内不用重新查询。

第四段显示stackexchange.com的NS记录(Name Server的缩写),即哪些服务器负责管理stackexchange的DNS记录。
image.png

上面结果显示stackexchange.com共有四次NS记录,即4个域名服务器,向其中一台查询就能知道math.stackexchange.com的IP地址是什么。

第五段是上面四个域名服务器的IP的地址,这是随着前一段一起返回的
image.png
第六段是DNS服务器的一些传输信息
image.png
上面结果显示,本机的DNS服务器是192.168.1.253, 查询端口是53(DNS服务器的默认端口),以及回应长度是305字节。
如果不想看到这么多的内容,可以使用+short参数

  1. $ dig +short math.stackexchange.com
  2. 151.101.129.69
  3. 151.101.65.69
  4. 151.101.193.69
  5. 151.101.1.69

DNS服务器

下面我们根据前面的例子,一步步还原,看看本机到底怎么得到域名math.stackexchange.com的IP地址。

首先,本机一定知道DNS服务器的IP地址,否则一定上不了网。通过DNS服务器,才能知道某个域名的IP地址到底是什么?

  1. ![image.png](https://cdn.nlark.com/yuque/0/2021/png/2332713/1616722855506-757a254b-6ea6-4c79-bcec-d8fcd4a3fee8.png#align=left&display=inline&height=445&margin=%5Bobject%20Object%5D&name=image.png&originHeight=461&originWidth=414&size=139391&status=done&style=none&width=400)

DNS服务器的IP地址,有可能是动态的,每次上网时由网关分配,这叫做DHCP机制;也有可能是事先指定的固定地址,LInux系统里面,DNS服务器的IP地址保存在/etc/resolv.conf文件。

上例的DNS服务器是192.168.1.253, 这是一个内网地址,有一些公网DNS服务器,也可以使用,其中最有名的就是Google的8.8.8.8 和level 3 4.2.2.2。

本机只向自己的DNS服务器查询,dig命令有个@参数, 显示向其他DNS服务器查询结果。

  1. $ dig @4.2.2.2 math.stackexchange.com

上面命令指定向DNS服务器4.2.2.2查询

DNS的记录类型

域名与IP的对应关系,成为“记录(record)”, 根据使用场景,“记录”可以分为不同的类型(type), 前面我们已经看到了有A记录和NS记录。
我们再来总结一下常见的DNS类型:

  • A: 地址记录(Address),返回域名指向的IP地址
  • NS: 域名服务器记录(Name Server), 返回保存下一级域名信息的服务器地址,该记录只能设置为域名,,不能设置为IP地址
  • MX: 邮件记录(Mail exchange), 返回接收电子邮件的服务器地址(还不知道有啥用)
  • CNAME: 规范名称记录(Canonical Name), 返回另一个域名,即当前查询的域名是另一个域名的跳转
  • PTR: 返回查询记录(Pointer Record), 只用于从IP地址查询域名

一般来说,为了服务器的安全可靠,至少应该有两条NS记录,而A记录和MX记录也可以有多条。这样就提供看服务的冗余性,防止出现单点失败。

CNAME记录主要用于域名的内部跳转,为服务器配置提供灵活性,用户感知不到。举例来说,facebook.github.io这个域名就是一个CNAME记录。

  1. dig facebook.github.io
  2. ;; ANSWER SECTION:
  3. facebook.github.io. 3370 IN CNAME github.map.fastly.net.
  4. github.map.fastly.net. 600 IN A 103.245.222.133

上面的结果显示,facebook.github.io的CNAME记录指向github.map.fastly.net, 实际上返回的是github.map.fastly.net的IP地址。这样的好处是,变更服务器IP地址的时候,只要github.map.fastly.net。这个域名就可以了,用户的facebook.github.io不能修改。

由于CNAME记录就是一个替换,所以域名一旦这是CNAME记录以后,就不能再设置其他记录了(比如说A激励和MX记录),这是为了防止产生冲突。举例来说,foo.com指向bar.com, 而两个域名各有自己的MX记录。如果两者不一致,就会产生问题。由于顶级域名通常要设置MX记录,所以一般不允许用户对顶级域名设置CNAME记录。

PTR记录用于从IP地址反查域名,dig命令的-x参数用于查询PTR记录。

  1. $ dig -x 192.30.252.153
  2. ...
  3. ;; ANSWER SECTION:
  4. 153.252.30.192.in-addr.arpa. 3600 IN PTR pages.github.com.

上面结果显示,192.30.252.153,这台服务器的域名上pages.github.com

其他DNS工具

host 命令

host命令可以看作dig命令的简化版本,返回当前请求域名的各种记录

  1. $ host github.com
  2. github.com has address 192.30.252.121
  3. github.com mail is handled by 5 ALT2.ASPMX.L.GOOGLE.COM.
  4. github.com mail is handled by 10 ALT4.ASPMX.L.GOOGLE.COM.
  5. github.com mail is handled by 10 ALT3.ASPMX.L.GOOGLE.COM.
  6. github.com mail is handled by 5 ALT1.ASPMX.L.GOOGLE.COM.
  7. github.com mail is handled by 1 ASPMX.L.GOOGLE.COM.
  8. $ host facebook.github.com
  9. facebook.github.com is an alias for github.map.fastly.net.
  10. github.map.fastly.net has address 103.245.222.133

host 命令也可以用于逆向查询,即从IP地址查询域名,等同于dig -x ip

  1. $ host 192.30.252.153
  2. 153.252.30.192.in-addr.arpa domain name pointer pages.github.com.

nslookup命令

nslookup命令用于互动式地查询域名记录

  1. nslookup facebook.github.io
  2. Server: 192.168.1.253
  3. Address: 192.168.1.253#53
  4. Non-authoritative answer:
  5. facebook.github.io canonical name = github.map.fastly.net.
  6. Name: github.map.fastly.net
  7. Address: 103.245.222.133

参考

DNS 原理入门