
学习很多次DNS, 还是搞不清楚,干脆今天就再次来学习一下。
DNS是什么?
DNS(Domain Name System的缩写)的作用非常简单,就是根据域名查出IP地址,你可以把它想象成一本巨大的电话本。
举例来说,如果你要访问域名math.stackexchange.com, 首先要通过DNS查出他的IP是151.101.129.69。
查询过程
虽然只需要返回一个IP地址,但是DNS的查询过程非常复杂,分为多个步骤。
工具软件dig可以显示整个查询过程(md, 一直没有搞不清楚这个指令到底是干嘛的。。。。,今天终于恍然大悟):

第一段是查询参数和统计

第二段是查询内容

上面的结果表示,查询域名math,stackexchange.com的A记录,A是addresss的缩写
第二段是DNS服务器的答复

上面结果显示,math.stackexchange.com有4个A记录,即4个IP地址,600是TTL值(Time to live的缩写)表示缓存时间,即600ss之内不用重新查询。
第四段显示stackexchange.com的NS记录(Name Server的缩写),即哪些服务器负责管理stackexchange的DNS记录。

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

第六段是DNS服务器的一些传输信息

上面结果显示,本机的DNS服务器是192.168.1.253, 查询端口是53(DNS服务器的默认端口),以及回应长度是305字节。
如果不想看到这么多的内容,可以使用+short参数
$ dig +short math.stackexchange.com151.101.129.69151.101.65.69151.101.193.69151.101.1.69
DNS服务器
下面我们根据前面的例子,一步步还原,看看本机到底怎么得到域名math.stackexchange.com的IP地址。
首先,本机一定知道DNS服务器的IP地址,否则一定上不了网。通过DNS服务器,才能知道某个域名的IP地址到底是什么?

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服务器查询结果。
$ 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记录。
dig facebook.github.io;; ANSWER SECTION:facebook.github.io. 3370 IN CNAME github.map.fastly.net.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记录。
$ dig -x 192.30.252.153...;; ANSWER SECTION:153.252.30.192.in-addr.arpa. 3600 IN PTR pages.github.com.
上面结果显示,192.30.252.153,这台服务器的域名上pages.github.com
其他DNS工具
host 命令
host命令可以看作dig命令的简化版本,返回当前请求域名的各种记录
$ host github.comgithub.com has address 192.30.252.121github.com mail is handled by 5 ALT2.ASPMX.L.GOOGLE.COM.github.com mail is handled by 10 ALT4.ASPMX.L.GOOGLE.COM.github.com mail is handled by 10 ALT3.ASPMX.L.GOOGLE.COM.github.com mail is handled by 5 ALT1.ASPMX.L.GOOGLE.COM.github.com mail is handled by 1 ASPMX.L.GOOGLE.COM.$ host facebook.github.comfacebook.github.com is an alias for github.map.fastly.net.github.map.fastly.net has address 103.245.222.133
host 命令也可以用于逆向查询,即从IP地址查询域名,等同于dig -x ip
$ host 192.30.252.153153.252.30.192.in-addr.arpa domain name pointer pages.github.com.
nslookup命令
nslookup命令用于互动式地查询域名记录
nslookup facebook.github.ioServer: 192.168.1.253Address: 192.168.1.253#53Non-authoritative answer:facebook.github.io canonical name = github.map.fastly.net.Name: github.map.fastly.netAddress: 103.245.222.133
