概念介绍
-
DNS的分类
- 主DNS:配置管理,不提供服务,只用来编辑配置信息,给从DNS提供同步数据
- 从DNS:从主DNS上同步数据信息,对外提供服务
- 缓存DNS:在主DNS和从DNS之间,用来递归解析
- 转发器:forwarder,本地不存储任何解析信息,转发给其他DNS来做解析
-
记录类型
- SOA:备注信息
- NS:域名解析服务器,也就是某一个域的名称服务器,存储了该域的所有解析信息
- MX:邮件交换记录,优先值越小,优先级越高
- A:Address,域名和地址的映射关系记录,IPv4,输入域名,解析得到地址
- AAAA:IPv6的A记录
- PTR:反向解析记录,地址和域名的映射关系,输入地址,解析得到域名
- CNAME:别名记录
-
解析原理
DNS的解析是一个树形结构,根节点是.,在根节点以下,全世界有13个节点服务器,所有其他的域名都是直接或间接归属到.域,比如.com、.cn等域名,世界上后面还有一个.。
DNS的查找原理是递归,当客户端去请求某一个域名的地址时,显示查看本地的缓存(可以是本地hosts),如果本地缓存中有记录,则直接返回IP地址开始请求,如果本地缓存中没有,则会向本地DNS服务器去请求该域名,如果DNS服务器上有,则返回本地,本地进行缓存,然后开始请求;如果DNS服务器上没有,则会通过转发器,向上一级DNS服务器去请求,层层递归,直到解析到,或者超出范围。
DNS的服务递归,最大64层。
-
常用的工具
dig nslookup host
安装过程
-
安装dns
DNS在linux上安装的名称为bind,如果是要搭建DNS服务器,需要在服务器上,安装bind应用。
yum install -y bind-utils bind bind-devel bind-chroot
-
编辑主配置文件/etc/named.conf
在安装过程的时候为bind,而实际的配置文件则成为named,其中主配置文件为/etc/named.conf文件,默认情况下,是将该配置文件备份后,重新编写该配置文件。下面是本机安装时的配置文件示例。
[root@master ~]# cat /etc/named.conf options { version "1.1.1"; listen-on port 53 {any;}; directory "/var/named/chroot/etc/"; #pid-file "/var/named/chroot/var/run/named/named.pid"; pid-file "/run/named/named.pid"; allow-query { any; }; Dump-file "/var/named/chroot/var/log/binddump.db"; Statistics-file "/var/named/chroot/var/log/named_stats"; zone-statistics yes; memstatistics-file "log/mem_stats"; empty-zones-enable no; forwarders {192.168.64.2; }; }; key "rndc-key" { algorithm hmac-md5; secret "Eqw4hClGExUWeDkKBX/pBg=="; }; controls { inet 127.0.0.1 port 953 allow { 127.0.0.1; } keys { "rndc-key"; }; }; logging { channel warning { file "/var/named/chroot/var/log/dns_warning" versions 10 size 10m; severity warning; print-category yes; print-severity yes; print-time yes; }; channel general_dns { file "/var/named/chroot/var/log/dns_log" versions 10 size 100m; severity info; print-category yes; print-severity yes; print-time yes; }; category default { warning; }; category queries { general_dns; }; }; include "/var/named/chroot/etc/view.conf";
其中主要的配置点为:
- 端口:53,默认是TCP和UDP都会监听,通常使用UDP,当出现穿越的时候,使用TCP
- zone 配置文件目录:directory,默认放在/var/named/chroot/etc/下
- pid文件:pid文件,在CentOS 7中,默认的pid文件应该是在/run/named/named.pid,如果不在这个地方,named进程会等到超时,而导致启动失败,原因是该文件不可读。这个问题曾经困扰了我好久,最后还是通过看系统日志,才知道的。
- forwarders:转发器,当本地DNS无法解析到是,上级DNS的地址
- rndc-key:动态加载DNS解析信息,通过rndc进行操作,rndc和named之间的交互,是通过rndc-key来进行认证的
- rndc controls:默认监听本地的953端口
- 日志文件定义和使用
-
rndc配置
主要是配置rndc.key文件和rndc.conf文件,这两个文件默认是不存在的,直接编辑创建就可以了。
[root@master ~]# cat /etc/rndc.key key "rndc-key" { algorithm hmac-md5; secret "Eqw4hClGExUWeDkKBX/pBg=="; }; [root@master ~]# cat /etc/rndc.conf key "rndc-key" { algorithm hmac-md5; secret "Eqw4hClGExUWeDkKBX/pBg=="; }; options { default-key "rndc-key"; default-server 127.0.0.1; default-port 953; };
在这里配置的key和options,必须要和主配置文件中的一致。
-
配置view文件
view文件,就好比是zone配置文件,一个概要文件,在该文件中可以定义zone的文件、主从配置关系等等。这里我们以abc.com为例,配置一个view文件。该文件的位置,就是named.conf的include文件位置。
[root@master ~]# cat /var/named/chroot/etc/view.conf view "View" { zone "abc.com" { type master; file "abc.com.zone"; allow-transfer { 192.168.64.132; }; notify yes; also-notify { 192.168.64.132; }; }; };
-
配置zone文件
配置好view文件之后,就可以根据view中的zone信息,创建配置zone文件。
[root@master ~]# cat /var/named/chroot/etc/cnpc.com.zone $ORIGIN . $TTL 3600 ; 1 hour abc.com IN SOA op.abc.com. dns.abc.com. ( 2000 ; serial 900 ; refresh (15 minutes) 600 ; retry (10 minutes) 86400 ; expire (1 day) 3600 ; minimum (1 hour) ) NS op.abc.com. $ORIGIN abc.com. op A 192.168.64.131 salt A 192.168.64.131
在这个配置文件中,实际上就是配置zone里面的各种解析的信息,比如SOA、NS、A记录等。
-
启动服务
上面所有文件配置完成之后,就需要可以启动服务了,默认启动服务是使用named用户,所以需要将/var/下的named目录的归属,改为named.named。然后就可以启动服务了。
cd /var chown -R named.named named systemctl start named
-
解析测试
使用dig命令,可以去解析之前定义的A记录
dig @127.0.0.1 salt.abc.com
@是指定DNS服务器。
解析的时候,可以通过查看访问日志,知道dns的使用情况,/var/named/chroot/var/log/dns_log
主从配置
-
概述
刚才安装了一个DNS服务器,作为某一个zone 的master服务器,现在要为该zone配置一个slave服务器,实现在master上增加DNS记录信息,主动同步给slave节点。主要需要配置的就是master上指定slave,也就是notify,而在slave上,则必须要制定master,一个slave可以同时拥有多个masters。
-
安装过程
salve的安装过程,和master类似,前面的/etc/named.conf /etc/rndc.key /etc/rndc.conf都是可以完全一样的,唯一不同的是,salve上的view.conf文件需要注意,而zone file文件可以不用写,直接从master服务器上进行同步即可。
salt-cp '192.168.64.132' /etc/named.conf /etc/named.conf salt-cp '192.168.64.132' /etc/rndc.key /etc/rndc.key salt-cp '192.168.64.132' /etc/rndc.conf /etc/rndc.conf salt-cp '192.168.64.132' /var/named/chroot/etc/view.conf /var/named/chroot/etc/view.conf [root@localhost etc]# cat view.conf view "View" { zone "abc.com" { type slave; file "abc.com.zone"; masters { 192.168.64.131; }; }; };
在slave的view配置文件中,与master不同的是,type为slave,而其他都不用写,指定一个masters就可以了。
-
启动服务
当配置好salve节点之后,就可以直接启动了,在启动之后,会自动生成zone file文件,然后通过dig命令,使用本地进行解析,如果能得到正确的返回,就证明这个时候已经同步了。
[root@localhost etc]# dig @127.0.0.1 salt.abc.com ; <<>> DiG 9.9.4-RedHat-9.9.4-50.el7 <<>> @127.0.0.1 salt.abc.com ; (1 server found) ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 56444 ;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 2 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 4096 ;; QUESTION SECTION: ;salt.abc.com. IN A ;; ANSWER SECTION: salt.abc.com. 3600 IN A 192.168.64.131 ;; AUTHORITY SECTION: abc.com. 3600 IN NS op.abc.com. ;; ADDITIONAL SECTION: op.abc.com. 3600 IN A 192.168.64.131 ;; Query time: 0 msec ;; SERVER: 127.0.0.1#53(127.0.0.1) ;; WHEN: Sat Apr 20 14:56:41 CST 2019 ;; MSG SIZE rcvd: 91
-
同步设置
在master主机上,增加一条A记录,是要修改master的zone配置文件,除了要添加一条A记录之外,还要修改该zone的serial值,如果不修改,是无法同步给slave的。修改完成之后,需要执行rndc reload,动态加载DNS的解析。然后分别在master和slave上进行解析测试,如果都能正常范围,则表示主从同步是生效的。
-
增加DNS记录
默认修改DNS配置文件时,要修改zone的serial值,在执行rndc reload之后,能够同步给slave节点。
-
A记录
在zone文件中添加,直接编辑配置文件,比如在abc.com.zone配置文件中增加一条A记录,格式为 域名 A IP,修改完成后,同步给slave,通过dig host都能进行解析
-
CNAME记录
CNMAE记录是个别名记录,就是将域名A映射到域名B上,实际上解析到的地址是域名B的地址。格式为:
域名A CNAME 域名B a A 1.2.3.4 b CNAME a c A 2.3.4.5 mx mx 5 a mx mx 10 c [root@master etc]# host b.abc.com 127.0.0.1 Using domain server: Name: 127.0.0.1 Address: 127.0.0.1#53 Aliases: b.abc.com is an alias for a.abc.com. a.abc.com has address 1.2.3.4
-
MX记录
也是在zone文件中增加,格式为:
域名 MX PRIORITY 域名 mx MX 5 mail
实际上MX记录,对应的是一个A记录,然后通过A记录,递归查找到最后MX对应的IP地址。
[root@master etc]# host mx.abc.com 127.0.0.1 Using domain server: Name: 127.0.0.1 Address: 127.0.0.1#53 Aliases: mx.abc.com mail is handled by 5 a.abc.com. mx.abc.com mail is handled by 10 c.abc.com.
同一个MX域名可以对应多条记录,结果按照优先级排列,优先级值越低,优先级越高,解析出来的排序就越高。
-
PTR记录
PTR记录不仅仅是需要配置zone文件,是需要在zone配置文件view中,重新创建一个zone,然后创建该zone的目录文件,然后才能进行解析,将IP解析成对应的域名。
zone "168.192.in-addr.arpa" { type master; file "192.168.zone"; allow-transfer { 192.168.64.132; }; notify yes; also-notify { 192.168.64.132; }; };
然后创建一个192.168.zone的配置文件,编辑解析记录。
[root@master etc]# cat 192.168.zone $TTL 3600 ; 1 hour @ IN SOA op.abc.com. dns.abc.com. ( 2000 ; serial 900 ; refresh (15 minutes) 600 ; retry (10 minutes) 86400 ; expire (1 day) 3600 ; minimum (1 hour) ) NS op.abc.com. 131.64 IN PTR master.abc.com
实际上的这条解析记录意思是192.168.64.131 对应解析到的域名是master.abc.com
[root@master etc]# host 192.168.64.131 127.0.0.1 Using domain server: Name: 127.0.0.1 Address: 127.0.0.1#53 Aliases: 131.64.168.192.in-addr.arpa domain name pointer master.abc.com.168.192.in-addr.arpa.
解析的结果131.64.168.192.in-addr.arpa master.abc.com.168.192.in-addr.arpa. 实际上要看的就是zone之前的内容,后面的都是zone的名称
增加了PTR记录之后,slave默认是不会自动同步的,因为修改了view文件,这个时候就需要在slave上手动创建zone,和之前的zone一样,从master上进行同步。
-
TIPS
- DNS可以做简单的LB,因为DNS对应关系是一个多对多的对应关系,在对同一个域名进行解析的时候,会采用轮询的方式,向客户端返回请求的域名对应的地址,也就是说,在一定程度上,能够实现LB负载。
- 智能DNS:根据客户端的地址,来解析到对应的地址,这个方式和CDN缓存差不多,都是基于客户端来进行判断的,保证解析到的地址,是客户端最快能访问到的。