bind适合公网DNS,局域网的DNS建议使用pdns-recursor软件。
安装bind软件
rpm -qa | grep '^bind' #查询bind主程序是否安装过
yum -y install bind bind-chroot #安装bind软件主程序
部署DNS前的准备知识
DNS客户端知识
- /etc/hosts :这个是最早的 hostname 对应 IP 的档案;
- /etc/resolv.conf :这个重要!就是 ISP 的 DNS 服务器 IP 记录处;
- /etc/nsswitch.conf:这个档案则是在『决定』先要使用 /etc/hosts 还是 /etc/resolv.conf 的设定!
[root@www ~]# host [-a] FQDN [server]
[root@www ~]# host -l domain [server]
选项与参数:
-a :代表列出该主机所有的相关信息,包括 IP、TTL 与除错讯息等等
-l :若后面接的那个 domain 设定允许 allow-transfer 时,则列出该 domain 所管理的所有主机名对应数据!
server:这个参数可有可无,当想要利用非 /etc/resolv.conf 内的 DNS 主机来查询主机名与 IP 的对应时,就可以利用这个参数了!
[root@www ~]# nslookup [FQDN] [server]
[root@www ~]# nslookup
选项与参数:
1. 可以直接在 nslookup 加上待查询的主机名或者是 IP ,[server] 可有可无;
2. 如果在 nslookup 后面没有加上任何主机名或 IP ,那将进入 nslookup 的查询功能
在 nslookup 的查询功能当中,可以输入其他参数来进行特殊查询,例如:
set type=any :列出所有的信息『正解方面配置文件』
set type=mx :列出与 mx 相关的信息!
[root@www ~]# dig [options] FQDN [@server]
选项与参数:
@server :如果不以 /etc/resolv.conf 的设定来作为 DNS 查询,可在此填入其他的 IP
options:相关的参数很多,主要有 +trace, -t type 以及 -x 三者最常用
+trace :就是从 . 开始追踪,在 19.1.2 里面谈过了!回头瞧瞧去!
-t type:查询的数据主要有 mx, ns, soa 等类型.
-x :查询反解信息,非常重要的项目!
DNS数据类型
#dig查询结果解析
[domain] [ttl] IN [[RR type] [RR data]]
[待查数据] [暂存时间(秒)] IN [[资源类型] [资源内容]]
# 常见的正解文件 RR 相关信息
[domain] IN [[RR type] [RR data]]
主机名. IN A IPv4 的 IP 地址
主机名. IN AAAA IPv6 的 IP 地址
领域名. IN NS 管理这个领域名的服务器主机名字.
领域名. IN SOA 管理这个领域名的七个重要参数(容后说明)
领域名. IN MX 顺序数字 接收邮件的服务器主机名字
主机别名. IN CNAME 实际代表这个主机别名的主机名字
# 反解文件记录的RR数据
[root@www ~]# dig -x 120.114.100.101
;; ANSWER SECTION:
101.100.114.120.in-addr.arpa. 3600 IN PTR www.ksu.edu.tw.
SOA七字段的含义
- Master DNS 服务器主机名:这个领域主要是哪部 DNS 作为 master 的意思。在本例中, dns1.ksu.edu.tw 为 ksu.edu.tw 这个领域的主要 DNS 服务器啰;
- 管理员的 email:那么管理员的 email 为何?发生问题可以联络这个管理员。要注意的是, 由于 @ 在数据库档案中是有特别意义的,因此这里就将 abuse@mail.ksu.edu.tw 改写成abuse.mail.ksu.edu.tw 。
- 序号 (Serial):这个序号代表的是这个数据库档案的新旧,序号越大代表越新。 当 slave 要判断是否主动下载新的数据库时,就以序号是否比 slave 上的还要新来判断,若是则下载,若不是则不下载。 所以当你修订了数据库内容时,记得要将这个数值放大才行! 为了方便用户记忆,通常序号都会使用日期格式『YYYYMMDDNU』来记忆,例如昆山科大的 2010080369 序号代表 2010/08/03 当天的第 69 次更新的感觉。不过,序号不可大于 2 的 32 次方,亦即必须小于 4294967296 才行喔。
- 更新频率 (Refresh):那么啥时 slave 会去向 master 要求数据更新的判断? 就是这个数值定义的。昆山科大的 DNS 设定每 1800 秒进行一次 slave 向 master 要求数据更新。那每次 slave 去更新时, 如果发现序号没有比较大,那就不会下载数据库档案。
- 失败重新尝试时间 (Retry):如果因为某些因素,导致 slave 无法对 master 达成联机, 那么在多久的时间内,slave 会尝试重新联机到 master。在昆山科大的设定中,900 秒会重新尝试一次。意思是说,每 1800 秒 slave 会主动向 master 联机,但如果该次联机没有成功,那接下来尝试联机的时间会变成 900 秒。若后来有成功,则又会恢复到 1800 秒才再一次联机。
- 失效时间 (Expire):如果一直失败尝试时间,持续联机到达这个设定值时限, 那么 slave 将不再继续尝试联机,并且尝试删除这份下载的 zone file 信息。昆山科大设定为 604800 秒。意思是说,当联机一直失败,每 900 秒尝试到达 604800 秒后,昆山科大的 slave 将不再更新,只能等待系统管理员的处理。
- 快取时间 (Minumum TTL):如果这个数据库 zone file 中,每笔 RR 记录都没有写到 TTL 快取时间的话,那么就以这个 SOA 的设定值为主。
部署cache-only DNS的配置
[root@www ~]# vim /etc/named.conf
// 在预设的情况下,这个档案会去读取 /etc/named.rfc1912.zones 这个领域定义档
// 所以请记得要修改成底下的样式啊!
options {
listen-on port 53 { any; }; //可不设定,代表全部接受
directory "/var/named"; //数据库默认放置的目录所在
dump-file "/var/named/data/cache_dump.db"; //一些统计信息
statistics-file "/var/named/data/named_stats.txt";
memstatistics-file "/var/named/data/named_mem_stats.txt";
allow-query { any; }; //可不设定,代表全部接受
recursion yes; //将自己视为客户端的一种查询模式
forward only; //可暂时不设定
forwarders { //是重点!
114.114.114.114; //先用电信的114当上层
114.114.115.115; //第二台DNS转发上层地址
};
}; //最终记得要结尾符号!
/etc/init.d/named restart
部署可查询根域以及有自己正反域的DNS服务器
Master DNS部署
[root@www ~]# vim /etc/named.conf
//在此文件中”//“是注释的意思
options {
directory "/var/named";
dump-file "/var/named/data/cache_dump.db";
statistics-file "/var/named/data/named_stats.txt";
memstatistics-file "/var/named/data/named_mem_stats.txt";
allow-query { any; };
recursion yes;
//allow-transfer { none; }; // 不许别的salve进行数据同步,没有slave则开启这行,否则注释;
};
zone "." IN {
type hint;
file "named.ca";
};
zone "centos.jet" IN { // 这个 zone 的名称
type master; // 是什么类型
file "named.centos.jet"; // 档案放在哪里
allow-transfer { 192.168.31.15; }; // 在这里新增 slave 的 IP
};
zone "31.168.192.in-addr.arpa" IN {
type master;
file "named.192.168.31";
allow-transfer { 192.168.31.15; }; // 在这里新增 slave 的 IP
};
# 这个文件为根据的查询区域,保持默认即可。
vim /var/named/named.ca
[root@www ~]# vim /var/named/named.centos.jet
; 与整个领域相关性较高的设定包括 NS, A, MX, SOA 等标志的设定处!
$TTL 600
@ IN SOA master.centos.jet. jet.www.centos.jet. (2020032101 3H 15M 1W 1D ) ;
@ IN NS master.centos.jet. ; Master DNS 服务器名称
@ IN NS slave.centos.jet. ; Slave DNS 服务器名称
master.centos.jet. IN A 192.168.31.16 ; Master DNS 服务器 IP
slave.centos.jet. IN A 192.168.31.15 ; slave DNS服务器IP
@ IN MX 10 www.centos.jet. ; 领域名的邮件服务器
www.centos.jet. IN A 192.168.31.16
linux.centos.jet. IN CNAME www.centos.jet.
ftp.centos.jet. IN CNAME www.centos.jet.
forum.centos.jet. IN CNAME www.centos.jet.
slave.centos.jet. IN A 192.168.31.16
clientlinux.centos.jet. IN A 192.168.31.15
[root@www ~]# vim /var/named/named.192.168.31
$TTL 600
@ IN SOA master.centos.jet. jet.www.centos.jet. (2020032101 3H 15M 1W 1D )
@ IN NS master.centos.jet.
@ IN NS slave.centos.jet.
16 IN PTR master.centos.jet. ; 将原本的 A 改成 PTR 的标志而已
15 IN PTR slave.centos.jet.
16 IN PTR www.centos.jet. ; 这些是特定的 IP 对应
10 IN PTR slave.centos.jet.
20 IN PTR winxp.centos.jet.
30 IN PTR win7.centos.jet.
101 IN PTR dhcp101.centos.jet.
102 IN PTR dhcp102.centos.jet.
/etc/init.d/named restart
Slave DNS部署
[root@www ~]# vim /etc/named.conf
//在此文件中”//“是注释的意思
options {
directory "/var/named";
dump-file "/var/named/data/cache_dump.db";
statistics-file "/var/named/data/named_stats.txt";
memstatistics-file "/var/named/data/named_mem_stats.txt";
allow-query { any; };
recursion yes;
//allow-transfer { none; }; // 不许别的salve进行数据同步,没有slave则开启这行,否则注释;
};
zone "." IN {
type hint;
file "named.ca";
};
zone "centos.jet" IN { // 这个 zone 的名称
type slave; // 是什么类型
file "slaves/named.centos.jet"; // 档案放在哪里
masters { 192.168.31.16; }; // 在这里新增 slave 的 IP
};
zone "31.168.192.in-addr.arpa" IN {
type slave;
file "slaves/named.192.168.31";
masters { 192.168.31.16; }; // 在这里新增 slave 的 IP
};
name.ca 需要原来就存在,其他正反区域解析文件不需要存在,只需要目录权限和属主属组正确即可,如下:
[root@study05 named]# ls -ld /var/named/slaves/
drwxrwx---. 2 named named 4096 6月 19 2019 /var/named/slaves/
[root@study05 named]#
[root@study05 named]# /etc/init.d/named start
Generating /etc/rndc.key: [确定]
启动 named: [确定]
[root@study05 named]# tail -f /var/log/messages
Mar 21 21:36:10 study05 named[2298]: zone centos.jet/IN: Transfer started.
Mar 21 21:36:10 study05 named[2298]: transfer of 'centos.jet/IN' from 192.168.31.16#53: connected using 192.168.31.15#45781
Mar 21 21:36:10 study05 named[2298]: zone centos.jet/IN: transferred serial 2020032102
Mar 21 21:36:10 study05 named[2298]: transfer of 'centos.jet/IN' from 192.168.31.16#53: Transfer completed: 1 messages, 13 records, 315 bytes, 0.007 secs (45000 bytes/sec)
Mar 21 21:36:10 study05 named[2298]: zone centos.jet/IN: sending notifies (serial 2020032102)
Mar 21 21:36:11 study05 named[2298]: zone 31.168.192.in-addr.arpa/IN: Transfer started.
Mar 21 21:36:11 study05 named[2298]: transfer of '31.168.192.in-addr.arpa/IN' from 192.168.31.16#53: connected using 192.168.31.15#35925
Mar 21 21:36:11 study05 named[2298]: zone 31.168.192.in-addr.arpa/IN: transferred serial 2020032102
Mar 21 21:36:11 study05 named[2298]: transfer of '31.168.192.in-addr.arpa/IN' from 192.168.31.16#53: Transfer completed: 1 messages, 12 records, 334 bytes, 0.001 secs (334000 bytes/sec)
Mar 21 21:36:11 study05 named[2298]: zone 31.168.192.in-addr.arpa/IN: sending notifies (serial 2020032102)
^C
[root@study05 named]# cd /var/named/slaves/
[root@study05 slaves]# ll
总用量 8
-rw-r--r--. 1 named named 571 3月 21 21:36 named.192.168.31
-rw-r--r--. 1 named named 524 3月 21 21:36 named.centos.jet
[root@study05 slaves]#
部署如上DNS的子域DNS
# 上层DNS服务器的改动很简单,只需新增Master服务器 zone file 的 NS 与 A 即可。
[root@www ~]# vim /var/named/named.centos.jet
@ IN SOA master.centos.jet. jet.www.centos.jet. (
2020032103 3H 15M 1W 1D )
# 上面的 SOA 部分序号加大,底下新增这两行即可 (原本的数据都保留不动)!
niki.centos.jet. IN NS dns.niki.centos.jet.
dns.niki.centos.jet. IN A 192.168.31.14
[root@www ~]# /etc/init.d/named restart
[root@www ~]# tail -n 30 /var/log/messages | grep named
Mar 21 14:22:36 www named[9564]: zone centos.jet/IN: loaded serial 2020032103
# 登录档的关键是上面的序号部分~必须是我们填写的新的序号才对!
[root@www ~]# dig dns.niki.centos.vbird @127.0.0.1
# 你会发现是错误的!找不到 A 很正常,因为子域服务器还未建立。
#下层 DNS 服务器:需要有完整的 zone 相关设定.
# 1. 修改 named.conf ,增加 zone 的参数,假设档名为 named.niki.centos.jet
[root@niki ~]# vim /etc/named.conf
....(前面省略)....
zone "niki.centos.jet" IN {
type master;
file "named.niki.centos.jet";
};
# 2. 建立 named.niki.centos.jet
[root@niki ~]# vim /var/named/named.niki.centos.jet
$TTL 600
@ IN SOA dns.niki.centos.jet. root.niki.centos.jet. (2020032101 3H 15M 1W 1D )
@ IN NS dns.niki.centos.jet.
dns IN A 192.168.31.14
www IN A 192.168.31.14
@ IN MX 10 www.niki.centos.jet.
@ IN A 192.168.31.14
# 为了简化整个版面,所以都使用 hostname 而非 FQDN!请见谅!
# 3. 启动并观察相关登录信息
[root@niki ~]# /etc/init.d/named restart
[root@niki ~]# tail -n 30 /var/log/messages | grep named
....(前面省略)....
zone niki.centos.jet/IN: loaded serial 2020032103
....(底下省略)....
# 同时,记得处理一下防火墙的放行问题!否则测试会失败!!
[root@niki ~]# dig www.niki.centos.jet @192.168.31.16
# 上述的动作必须要有响应才行!否则就会出问题~
依不同接口给予不同的 DNS 解析地址: view 功能的应用
想象一个环境,以我们目前的局域网络服务器来说,我的 master.centos.jet 有两个接口,分别是 192.168.31.16/24 (对内) 及 100.3.2.3/24 (对外),那当我外边的用户想要了解到 master.centos.jet 这部服务器的 IP 时,取得的竟然是 192.168.31.16,因此还得要透过 NAT 才能联机到该接口,但明明 192.168.31.16 与外部的 100.3.2.3 是同一台服务器主机嘛!干嘛还得要经过 NAT 转到内部接口呢?有没有办法让外部的查询找到 master.centos.jet 是 100.3.2.3 而内部的找到则回应 192.168.31.16 呢?可以的!那就透过 view 的功能!
那么 view 要怎么处理呢?其实就是让不同来源的用户,能够取得他们自己的 zone 响应就是了。举例来说,当用户来自 130.0.0.1 时,这个来源不可能是内部 (192.168.31.16/24) ,因此这个来源就会使用外部的 zone file 内容来响应。 因此,我们就得要准备同一个 zone 需要两个不同的设定,再将个别的设定带入自己的客户端查询当中。
现在我们针对这个概念,对于上边部署的DNS,设定 view 的原则是这样的:
- 建立一个名为 intranet 的名字,这个名字代表客户端为 192.168.31.0/24 的来源;
- 建立一个名为 internet 的名字,这个名字代表客户端为非 192.168.31.0/24 的其他来源
- intranet 使用的 zone file 为本章前面各小节所建立的 zone filename,internet 使用的 zone filename 则在原本的档名后面累加 inter 的扩展名,并修订各标志的结果。
[root@www ~]# vim /etc/named.conf
options {
directory "/var/named";
dump-file "/var/named/data/cache_dump.db";
statistics-file "/var/named/data/named_stats.txt";
memstatistics-file "/var/named/data/named_mem_stats.txt";
allow-query { any; };
recursion yes;
//allow-transfer { none; };
};
acl intranet { 192.168.31.0/24; }; <==针对 intranet 给予的来源 IP 指定
acl internet { ! 192.168.31.0/24; any; }; <==加上惊叹号 (!) 代表反向选择的意思
view "lan" { <==只是一个名字,代表的是内网
match-clients { "intranet"; }; <==吻合这个来源的才使用底下的 zone
zone "." IN {
type hint;
file "named.ca";
};
zone "centos.jet" IN {
type master;
file "named.centos.jet";
allow-transfer { 192.168.31.15; };
};
zone "31.168.192.in-addr.arpa" IN {
type master;
file "named.192.168.31";
allow-transfer { 192.168.31.15; };
};
};
view "wan" { <==同样,只是个名字而已!
match-clients { "internet"; }; <==代表的则是外网的 internet 来源
zone "." IN {
type hint;
file "named.ca";
};
zone "centos.jet" IN {
type master;
file "named.centos.jet.inter"; <==档名必须与原有的不同!
};
// 外网因为没有使用到内网的 IP,所以 IP 反解部分可以不写于此
};
[root@www ~]# cd /var/named
[root@www named]# cp -a named.centos.jet named.centos.jet.inter
[root@www named]# vim named.centos.jet.inter
$TTL 600
@ IN SOA master.centos.vbird. vbird.www.centos.vbird. (2020032103 3H 15M 1W 1D )
@ IN NS master.centos.jet.
master.centos.jet. IN A 100.3.2.3
@ IN MX 10 www.centos.jet.
www.centos.jet. IN A 100.3.2.3
linux.centos.jet. IN CNAME www.centos.jet.
ftp.centos.jet. IN CNAME www.centos.jet.
forum.centos.jet. IN CNAME www.centos.jet.
workstation.centos.jet. IN A 100.3.2.3
[root@www named]# /etc/init.d/named restart