//
Linux中的DNS客户端配置
//
最近在搞MGR Consul的MySQL高可用,在使用Consul域名服务的时候,会用到Linux操作系统中的DNS客户端配置,这块儿的知识之前只是在用,今天简单整理一下,希望能有一点点用。
我们知道,DNS服务器是将域名解析成IP的地方,例如我们输入www.baidu.com,它会给我们解析出来一个地址。Linux中,DNS进行解析的过程大概是下面这样的:
首先,我们拿到一个域名aaa.mysql.consul.cn,然后在Linux系统中先去找/etc/nsswitch.conf文件去确定这个域名的解析顺序,该文件决定的是域名解析到底从/etc/hosts文件中开始解析还是从/etc/resolv.conf文件中开始解析,一般情况下是先从/etc/hosts中解析域名,当然,我们可以自己设置解析顺序。来看一个例子:
代码语言:javascript复制[root@]#cat /etc/nsswitch.conf |grep hosts
#hosts: db files nisplus nis dns
hosts: files dns
我们可以看到,files就是使用/etc/hosts,而dns则是使用/etc/resolv.conf的dns服务器来进行搜寻的。当然,如果我们调换files和dns的位置,就可以先使用/etc/resolv.conf来解析域名,然后再使用/etc/hosts来解析域名。
这里主要说明两个重要的文件,其中一个是/etc/resolv.conf文件,另外一个是/etc/dnsmasq.conf文件,先来看第一个文件/etc/resolv.conf.
/etc/resolv.conf文件是linux系统的dns配置文件,它的配置格式比较简单,其中只有四种情况:
nameserver //定义DNS服务器的IP地址 domain //定义本地域名 search //定义域名的搜索列表 sortlist //对返回的域名进行排序
其中,nameserver是最重要的,其他的都是可选的,nameserver可以设置多个,当第一个nameserver无法解析域名的时候,才会用到第二个nameserver,例如我们进行如下配置:
nameserver 1.1.1.1
nameserver 2.2.2.2
那么当我们拿到一个域名的时候,DNS解析的顺序将会是先将域名发送到1.1.1.1上进行解析,如果解析不出来,那么再发送到2.2.2.2上进行解析,一般情况,nameserver的指定不要超过3个。
为什么nameserver的设置最好不要超过3个?
因为如果超过3个,那么如果是我们所在的网络区域发生问题,导致无法练级到DNS服务器,那么我们的主机还是会向每一个DNS服务器发出联机的要求,每次联机都有timeout时间的等待,这会导致非常多的时间浪费。
第二个文件是/etc/dnsmasq.conf,要想了解这个文件的内容,首先需要知道DNSmasq的作用。DNSmasq是一个轻量级的网络基础服务,它可以用来配置Linux服务器的DNS和DHCP。关于DNSmasq的配置,一般都存在于两个地方:
/etc/dnsmasq.d/ 文件夹(自定义配置)
/etc/dnsmasq.conf 文件
当我们应用程序传入一个域名的时候,这两个文件加载顺序为先加载/etc/dnsmasq.d/*.conf来获取相关IP地址,如果没有相关文件,则使用/etc/dnsmasq.conf文件来获取相关的IP地址。
DNSmasq的原理如下:
当我们的本机应用访问主机的/etc/resolv.conf中的nameserver来获取DNSServer,该文件会将该请求指向DNSmasq中配置的server,前提是配置了dnsmasq的监听规则。这句话很难理解,我们先来看一下例子:
代码语言:javascript复制[root@ ~]# cat /etc/resolv.conf
# file get from config server
nameserver 127.0.0.1
nameserver 1.1.1.1
[root@ ~]# cat /etc/dnsmasq.conf
#resolve-file=/etc/resolv.dnsmasq.conf
listen-address=127.0.0.1
strict-order
cache-size=2048
server=10.10.10.10
我们先解释下dnsmasq.conf文件中的内容:
resolve-file
定义dnsmasq从哪里获取上游DNS服务器的地址, 默认是从/etc/resolv.conf获取,上面配置的文件是/etc/resolv.dnsmasq.conf
listen-address
定义dnsmasq监听的地址,默认是监控本机的所有网卡上,可以配置为127.0.0.1,默认端口是53
strict-order
表示严格按照resolv-file文件中的顺序从上到下进行DNS解析
server
指定dnsmasq程序使用哪个DNS服务器进行解析,我们设置的是10.10.10.10
对于这些参数,有个概念即可,可以看到,/etc/resolv.conf中配置了nameserver为127.0.0.1,则在收到域名的时候,会先从本地地址127.0.0.1尝试解析域名,而我们的dnsmasq监听的就是本地地址127.0.0.1的53这个默认端口,所以,发给/etc/resolv.conf的域名解析请求,会从dnsmasq中去解析,如果dnsmasq解析不了,但是配置了resolve-file参数,则会使用上面的配置参数中的文件/etc/resolv.dnsmasq.conf去尝试解析,我们把该文件中配置的DNS称之为上游DNS。
本机情况下DNS的解析规则图如下:
局域网内的DNS解析规则图如下:
可以看到,本地和局域网内的DNS解析规则唯一的不同是局域网内的DNS解析可以绕过/etc/resolv.conf文件而直接从DNSmasq中进行解析。
跟consul有什么关系?
因为我们在做基于MGR consul的高可用改造的时候,会用到consul的域名服务,consul的域名服务是在MySQL服务器上的,我们的应用服务器一般和MySQL服务器是处于同一个机房的,所以可以直接配置DNSmasq配置文件中的server来实现对consul域名的解析,这样就免去了查找上游服务的过程。