Linux DNS解析原理与配置

1、DNS缓存

作用:

程序客户端、下游的 DNS 服务器每次查询 DNS 成功之后,通常会将该 DNS 记录缓存一段时间,避免频繁发出查询请求的耗时。

Linux下的DNS缓存:

Linux 系统默认不会在本地建立 DNS 缓存,可以安装 nscd、dnsmasq 等工具提供 DNS 缓存。

2、配置DNS的三种方式

  • 2-1、本地hosts
    修改本地hosts文件,利用hosts自动解析域名到ip
    vim /etc/hosts
    123.123.123.123 www.baidu.com
    124.123.123.123 www.qq.com
  • 2-2、修改网卡配置文件
    假设我们的网卡名为eth0,那我们可以修改配置文件/etc/sysconfig/network-scripts/ifcfg-eth0的内容,增加dns规则:
    vim /etc/sysconfig/network-scripts/ifcfg-eth0,从而添加规则 例如:
    DSN1=114.114.114.114
    DNS2=xxx.xxx.xxx.xxx
    DNS3=xxx.xxx.xxx.xxx
    重启网络服务:service network restart
    重启服务后会在/etc/resolv.conf自动生成一样的DNS
  • 2-3、修改系统默认DNS配置
  • linux上没有安装systemd-resolved这类DNS解析代理服务时:
    修改配置文件/etc/resolv.conf,添加多条规则 例如:
    vim /etc/resolv.conf
    nameserver 114.114.114.114
    nameserver 123.123.123.123
  • linux上安装了systemd-resolved这类DNS解析代理服务时:
    修改/etc/systemd/resolved.conf,添加多条规则 例如:
    [Resolve]
    DNS=114.114.114.114
    DNS=8.8.8.8
    重启DNS代理服务:systemctl restart systemd-resolved.service
    查看是否生效:systemd-resolve --status
    $ systemd-resolve --status
    Global
    DNS Servers: 114.114.114.114
    8.8.8.8
    DNSSEC NTA: 10.in-addr.arpa
    16.172.in-addr.arpa
    168.192.in-addr.arpa
    17.172.in-addr.arpa
    18.172.in-addr.arpa
    19.172.in-addr.arpa

3、DNS解析优先级

  • 本地/etc/hosts > 网卡配置文件DNS服务地址 > 系统DNS配置文件/etc/resolv.conf

4、DNS多个nameserver的情况

example:

nameserver 192.168.0.2
nameserver 127.0.0.1

nameserver优先级:

  • 按照定义顺序从上至下(默认情况)

DNS解析流程:

  • 1、查询192.168.0.2,如果服务器可以连接,则响应对应ip或者响应无记录。
  • 2、如果192.168.0.2服务器不可达,则查询127.0.0.1

注意:

  • 192.168.0.2网络可达,但没有查询出对应dns记录,不会继续查询下面的dns服务器了。

解析过程debug: host -v debug-domain

# host -v www.baidu.com
Trying "www.baidu.com"
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 30232
;; flags: qr rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 0
 
;; QUESTION SECTION:
;www.baidu.com.			IN	A
 
;; ANSWER SECTION:
www.baidu.com.		134	IN	CNAME	www.a.shifen.com.
www.a.shifen.com.	134	IN	A	14.215.177.39
www.a.shifen.com.	134	IN	A	14.215.177.38
 
Received 90 bytes from 223.5.5.5#53 in 22 ms
Trying "www.a.shifen.com"
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 45392
;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 0
 
;; QUESTION SECTION:
;www.a.shifen.com.		IN	AAAA
 
;; AUTHORITY SECTION:
a.shifen.com.		600	IN	SOA	ns1.a.shifen.com. baidu_dns_master.baidu.com. 2109090004 5 5 2592000 3600
 
Received 97 bytes from 127.0.0.1#53 in 581 ms
Trying "www.a.shifen.com"
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 24903
;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 0
 
;; QUESTION SECTION:
;www.a.shifen.com.		IN	MX
 
;; AUTHORITY SECTION:
a.shifen.com.		600	IN	SOA	ns1.a.shifen.com. baidu_dns_master.baidu.com. 2109090004 5 5 2592000 3600
 
Received 97 bytes from 127.0.0.1#53 in 25 ms

5、DNS配置优化

example:

options timeout:1 attempts:1 rotate
nameserver 10.0.0.1
nameserver 10.0.0.2
nameserver 10.0.0.3
  • timeout:
    查询一个nameserver的超时时间,单位是秒。系统缺省是5,最大可以设为30。一般改为较小的值比较合适一些,网络正常情况下缺省的5秒粒度太大
  • attempts:
    这个是查询的整个都尝试一遍的次数。缺省是2。根据需要来决定失败前的循环重试次数
  • rotate:
    这个参数的含义是随机选取一个作为首选查询的dns server,系统缺省是从上到下的。如果彼此没有优先级,是负载均衡的关系,那么应该设置轮询,有优先级关系的话就不用设置这个,按照优先级从高到低,依次定时nameserver即可