Linux DNS 解析与配置
序
当我接收到一批新的服务器时,尝试连接外网,比如访问百度的首页:
curl www.baidu.com
发现报错,不能解析正确的主机名。这个其实就是主机在解析主机名时没能正确发现对应的主机的 ip。当我们使用类似于域名等去访问时,最后都是由 DNS 解析并返回具体的 ip 地址,最终访问到具体的 ip 也就是某服务器。
当报错如上时,多半是 /etc/resolv.cof
文件未能正确配置导致,可以更改为:
# Generated by NetworkManager
search huangyichun.com
nameserver 8.8.8.8
nameserver 114.114.114.114
resolv.conf
这个文件是 DNS 的 client 端使用的文件,用于设置 DNS 服务器的 ip 地址以及 DNS 域名,还可以配置域名搜索顺序等等。主要包含如下关键字:
- nameserver
- domain
- search
- sortlist
- options
他们设置的格式都是 关键字
+空格
+ 参数
。他们之间是有顺序的,从上往下的顺序进行加载。
nameserver
标示 DNS 服务器的 IP 地址,可以有多行的 nameserver,优先查找上面的 DNS 服务器,是尝试通过 DNS 服务器来解析主机名的主要方法。当第一个 DNS 超时时,会转向第二个 DNS 继续请求,除非配置了 options
。
domain
主机的域名。不与 search
共存,只存在最后一条。表示该主机的域名是多少。比如 www.huangyichun.com
的域名就是 huangyichun.com
。详细看 search
。
search
可以有多个参数,当要查询没有域名的主机,那么将会在申明的域中进行查找。大体上来说 search
和 domain
并没有什么区别,他们都是在如果没有输入完整的网址时进行补全域名的功能。比如,我们直接 ping www
都不知道究竟是哪一个 www
,如果配置了 domain
或者 search
那么直接帮助补全:
cat /etc/resolv.conf
# Generated by NetworkManager
#domain huangyichun.com
#nameserver 8.8.8.8
#nameserver 114.114.114.114
nslookup www
sortlist
允许将得到域名结果进行特定的排序。
options
可选的参数。
rotate
,当配置rotate后,进行DNS解析时,对配置的多个search进行轮循查询,这样可以减轻第一个DNS的解析工作。debug
,开启debug模式。ndots:n
,设置在初始查询之前,必须出现的点数阈值。n默认为1,意味着如果名称中只要有点,就会在任何搜索列表元素附加到该名称之前,将首先尝试将名称作为绝对名称。timeout:n
,设置等待nameserver
的秒数,如果超时则会开始访问下一个nameserver
,默认为5。attempts:n
,设置对于nameserver
重试次数,默认为2。
这里只展示了部分参数,其余参数请参照:
resolv.conf(5) - Linux manual page
举个例子
我们之前配置的 search
与 nameserver
将设定域名在 huangyichun.com
下进行补全,DNS 解析时优先 8.8.8.8
,其次为 114.114.114.114
。
怎么解析百度
百度是我们的好朋友,我们直接想一下怎么解析的百度的网址 www.baidu.com
。
使用 nslookup www.baidu.com
可以直接解析完毕,并返回器结果:
nslookup www.baidu.comcd
可以看到解析的结果为 39.156.66.14
,在浏览器上直接访问该地址,可以访问百度页面:
现在我们使用 nslookup
查看一下域名的解析流程。
注意是域名的解析流程,在 linux 中,并不止是域名的解析,还有主机的解析,也就是 /etc/hosts 等等
流程
ping www.baidu.com
,然后会根据resolv.conf
文件发送 DNS 解析请求。DNS客户端
解析器会将解析请求发送到本地DNS服务器
。- 本地 DNS 服务器会向
.根服务器
发送com.服务器
的解析请求。 .根服务器
返回com.服务器
地址,本地 DNS 继续请求com.服务器
获取baidu.com.服务器
地址。- 根据返回的地址信息,本地 DNS 继续请求
www.baidu.com.服务器
地址,获取后返回给DNS客户端
。 - 客户端拿到 DNS 后进行 ip 访问。
这里可能有几个疑惑的地方:
- 域名的完整格式其实应该是
xxxx.root
,也就是后缀名都是.root
,.root
服务器我们称之为根服务器
。但是根服务器
每次都是.root
没有必要显示,所以可以简化去除。
- 查找域名地址,其实都是从后往前进行查找,也就是先
root
,后domain
。 - 本地 DNS 服务器进行查找的时候,是迭代查找;而 DNS 客户端在请求本地 DNS 服务器时,是递归查找。如果超时,会更换 DNS 服务器。(迭代其实很慢,但是一个服务器没办法进行所有的域名 +ip 的存储,当该服务器不知道时,会将请求应答为
xxxx服务器
可能知道。) - 并不是每次查询都会到
根服务器
,当本地DNS服务器
有缓存时,就会直接返回,并且标注Non-authoritative
,如果是查询到根服务器
,那么就会标注authoritative
。
nslookup
我们使用 nslookup
来模拟整个域名解析的流程:
nslookup
> set type=ns
> .
type=ns 代表查询 nameserver,查询 根服务器
地址,返回了 a 到 m 的共计 13 个 nameserver,并且都是 Non-authoritative
。#53
标示 53 端口,也是默认的 DNS 端口(一般 UDP 传输)。
继续查询 nameserver 对应的 ip 地址:
查询地址的ipv4
set type=a
a.root-servers.net.
获取 跟服务器
的地址后,我们与 根服务器
进行沟通,获取 com.
地址。
server 198.41.0.4
set type=ns
com.
获取到了能够解析 com.
的 nameserver 列表,继续获取对应的 ip:
set type=a
a.gtld-servers.net.
# 这里的gtld 代表:通用顶级域名,generic top level domain
这样我们可以跟 com.
进行通话,获取 baidu.com
地址:
server 192.5.6.30
set type=ns
baidu.com
可以看到 baidu.com
有几个可以进行解析,我们继续获取 ip,然后进行 www.baidu.com
的解析:
set type=a
dns.baidu.com.
server 110.242.68.134
www.baidu.com
最后我们得到了 www.baidu.com
的 dns 解析结果为 39.156.66.14
。
www.huangyichun.com
如果我们要解析 www.huangyichun.com
也是一样的,找到 .com
地址,然后看 huangyichun.com
哪里能解析,与对应的 nameserver
对话,解析即可。
gravel.dnspod.net.
mantis.dnspod.net.
这两个就是腾讯云的 DNS 解析,说明该服务器大概率部署在腾讯云上。
问题
- 为什么我们解析
google.com
这类服务器无法解析呢?那当然是 IPS 提供商的内容。 - 谁来管理
.服务器
,Root Servers 当前有 13 个不同的域名,也就是之前的[a-m].root-servers.net
,当前公狗大概 1500 个服务器,在 12 个管理机构中运行。