摘要:改了 /etc/hosts 不生效?resolv.conf 重启被覆盖?dnsmasq 配置了却没走?本文彻底理清 Linux DNS 解析链路.我们知道在Linux设备DNS解析有三个文件控制:1、etc/host;2、etc/resolv.conf;3、dnsmasq。这三个文件之间有一定的关联性并不是简单的“谁先谁后”,而是一条复杂的调用链。尤其linux中引入了systemd-resolved、NetworkManager 和 dnsmasq 之后,很多默认行为都变了。我也常常搞不清楚这三个的关系,通过几天的摸索和学习,终于理清了Linux DNS解析流程.01 核心误区:优先级到底谁说了算?
很多人认为优先级是写死的,如:/etc/hosts > /etc/resolv.conf > dnsmasq,后面发现优先级是由/etc/nsswitch.conf决定,它决定了系统是先去查本地文件,还是先去问 DNS 服务器。nsswitch.conf 文件中到底有啥信息呢?主要有如下内容(不同Linux版本可能有差异):
| | | |
|---|
passwd | | files systemd | 决定 whoami、id 等命令从哪里获取用户信息。通常先查 /etc/passwd (files)。 |
group | | files systemd | |
shadow | | files systemd | 涉及登录验证,优先级极高,通常只允许 files。 |
hosts | 主机名解析 (关键) | files dns | 决定域名解析优先级。files 指 /etc/hosts,dns 指 /etc/resolv.conf。 |
networks | | files | 将网络地址(如 192.168.1.0)映射为名称。 |
protocols | | files | 如将 tcp 映射为协议号 6。来源通常是 /etc/protocols。 |
services | | files | 如将 http 映射为端口 80。来源通常是 /etc/services。 |
ethers | | files | |
netgroup | | nis | |
automount | | files | |
aliases | | files | 用于 sendmail/postfix 等邮件系统。 |
01.DNS解析首先需要查看的文件是nsswitch.conf查看命令:cat /etc/nsswitch.conf |grep hosts典型配置:hosts: files dnsfiles(1).files dns:代表/etc/hosts文件;(2).dns file:代表/etc/resolv.conf指向的 DNS 服务器。(1).files dns:先查 hosts,没有再查 DNS(默认推荐);(2).dns files 先查 DNS,超时或失败才查 hosts(内网环境慎用)。备注:如果你发现/etc/hosts不生效,90% 是因为这里被改成了dns files,或者被某些安全软件锁定了。02.其次需要看出的是/etc/resolv.conf 与 本地服务当nsswitch.conf决定走dns通道后,系统会读取/etc/resolv.conf,但这个里面也有需要注意的地方,它的使用通常有两种模式:nameserver直接指向8.8.8.8或自己配置的DNSnameserver指向127.0.0.1(环回地址)且运行了dnsmasq,dns请求会优先到dnsmasq,dnsmasq会默认读etc/hosts,这个里面可配置的信息比较多。备注:如果dnsmasq.conf里配置了address=/example.com/1.2.3.4,它的优先级高于/etc/hosts。通过上面大致知道了Linux 设备DNS解析的优先级,下面是结合网上信息总结的DNS优先级排序表。如下: | | | |
|---|
| NO.1 | 应用程序内置 | | |
| NO.2 | /etc/nsswitch.conf | | 总开关 |
| NO.3 | /etc/hosts | | |
| NO.4 | dnsmasq.conf | | |
| NO.5 | /etc/resolv.conf | | |
| NO.6 | DHCP 下发 | | |