DNS服务器的类型
- 主DNS服务器
- 从DNS服务器
- 缓存DNS服务器
- 转发器
主从简介
- 主DNS服务器:
- 维护所负责解析的域内解析库的服务器;解析库由管理维护
- 从DNS服务器:
- 从主DNS服务器或其它的从DNS服务器那里“复制”(区域传递)一份解析库
DNS安装配置
在Linux系统上安装能提供DNS服务的程序包,其程序包名为 bind,程序名为 named
安装如下程序包
- bind
- 实现提供DNS服务的主程序包
- bind-libs
- bind程序包所需要的库文件
- bind-utils
- 包含一系列用于测试和查询DNS的命令
- 如:dig, host, nslookup
yum install -y bind bind-libs bind-utils
主要配置文件位置
安装完成后,主要配置文件位置如下
- bind 服务脚本: /etc/rc.d/init.d/named
- 主要配置文件
- /etc/named.conf
- /etc/named.rfc1912.zones
- /etc/rndc.key
编辑主配置文件
/etc/named.conf,默认配置和字段意义解释如下
# options 为全局配置
options {
# 监听端口 53 在 127.0.0.1 上
listen-on port 53 { 127.0.0.1; };
# 监听端口 53 在 ipv6 回环接口上
listen-on-v6 port 53 { ::1; };
# 区域配置文件目录
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";
# 允许进行DNS查询客户机的地址
allow-query { localhost; };
# 是否允许客户机进行递归查询
recursion yes;
# 是否开启 dnssec,建议测试时关闭
dnssec-enable yes;
# 是否开启 dnssec 验证
dnssec-validation yes;
/* Path to ISC DLV key */
bindkeys-file "/etc/named.iscdlv.key";
# 管理密钥文件的位置
managed-keys-directory "/var/named/dynamic";
};
# logging 为日志
logging {
# channel 定义通道名
channel default_debug {
# 日志文件 位于 /var/named/data/named.run
file "data/named.run";
# 控制日志级别
severity dynamic;
};
};
# 定义 区域名为"."
zone "." IN {
# 类型为 根
type hint;
# 区域解析库文件名,此处为默认根服务器地址
file "named.ca";
};
# 扩展区域配置文件
include "/etc/named.rfc1912.zones";
# 根区域的 key
include "/etc/named.root.key";
进行编辑,结果如下,此时一个最基本的DNS服务器就已搭建完成。(缓存DNS服务器)
options {
// listen-on port 53 { 127.0.0.1; };
// listen-on-v6 port 53 { ::1; };
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;
dnssec-enable no;
dnssec-validation no;
/* Path to ISC DLV key */
bindkeys-file "/etc/named.iscdlv.key";
managed-keys-directory "/var/named/dynamic";
};
logging {
channel default_debug {
file "data/named.run";
severity dynamic;
};
};
zone "." IN {
type hint;
file "named.ca";
};
include "/etc/named.rfc1912.zones";
include "/etc/named.root.key";
注意
1. 一台物理服务器可同时为多个区域提供解析
2. 必须要有根区域文件 named.ca
3. 应该有两个(如果包括IPv6,应该更多)实现 localhost 和 本地回环地址的解析库
扩展区域配置文件简介
在 /etc/named.rfc1912.zones,中实现 IPv4 和 IPv6 的本地回环地址 的 正反解析区域
zone "localhost.localdomain" IN {
type master;
file "named.localhost";
allow-update { none; };
};
zone "localhost" IN {
type master;
file "named.localhost";
allow-update { none; };
};
zone "1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa" IN {
type master;
file "named.loopback";
allow-update { none; };
};
zone "1.0.0.127.in-addr.arpa" IN {
type master;
file "named.loopback";
allow-update { none; };
};
zone "0.in-addr.arpa" IN {
type master;
file "named.empty";
allow-update { none; };
};
这里对区域定义,进行简单解释
# ZONE_NMAE 为定义的区域名
zone "ZONE_NAME" IN {
# type 定义区域类型
# master 为主
# slave 为从
# hint 为根
# forward 为转发
type {master|slave|hint|forward};
# file 定义区域解析库文件名
# 存放位置 绝对路径为 /var/named/[ZONE_NAME.zone]
file "ZONE_NANE.zone";
}
开启DNS服务
开启DNS服务时,运行如下命令
named-checkconf
命令检查 主配置文件 配置是否无误
- 运行没有提示(结果)就是 最好的提示(结果)
service named start
开启DNS服务rndc status
查看DNS服务状态,确定DNS服务已经开启ss -tlunp | grep ':53'
查看DNS服务 53端口 是否绑定在合适的IP地址上
进行测试
使用 dig 命令,测试命令如下
dig -t A www.bing.com @127.0.0.1
结果如下,表示成功解析 www.bing.com 域名 并获取其 IP地址
; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.47.rc1.el6_8.3 <<>> -t A www.bing.com @127.0.0.1
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 42652
;; flags: qr rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 2, ADDITIONAL: 2
;; QUESTION SECTION:
;www.bing.com. IN A
;; ANSWER SECTION:
www.bing.com. 300 IN CNAME cn.a-0001.a-msedge.net.
cn.a-0001.a-msedge.net. 240 IN A 202.89.233.103
cn.a-0001.a-msedge.net. 240 IN A 202.89.233.104
;; AUTHORITY SECTION:
a-msedge.net. 172793 IN NS ns2.a-msedge.net.
a-msedge.net. 172793 IN NS ns1.a-msedge.net.
;; ADDITIONAL SECTION:
ns1.a-msedge.net. 172793 IN A 204.79.197.1
ns2.a-msedge.net. 172793 IN A 131.253.21.1
;; Query time: 837 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Fri Jan 13 06:54:07 2017
;; MSG SIZE rcvd: 166
注意
- 关闭 iptables ,以免DNS协议报文被过滤,以至于无法为客户机提供DNS服务
DNS正反向解析
- 正向区域
- 提供 FQDN 到 IP 地址的解析
- 反向区域
- 提供 IP 地址 到 FQDN 的解析
FQDN:FULL Qualified Domain Name (完全合格域名)
区域解析库
- 无论正反向解析都各需要一个解析库分别负责本地域名的正向和反向解析
- 区域解析库由众多 RR(Resource Recodr) 组成
- 有如下记录类型:A,AAAA,PTR,SOA,NS,CNAME,MX
- SOA:起始授权记录
- A:Internet Address,作用,FQDN 到 IP
- AAAA:FQDN 到 IPv6
- PTR:PoinTeR,IP 到 FQDN
- NS:Name Server,专用于表明当前区域的DNS服务器
- CNAME:Canonical Name,别名记录
- MX:Mail eXchanger,邮件交换器
- 有如下记录类型:A,AAAA,PTR,SOA,NS,CNAME,MX
资源记录定义的格式
语法
name [TTL] IN rr+type value
注意
1. TTL可从全局继承
2. @可用于引用当前区域的名字
3. 同一个名字可以通过多条记录定义多个不同的值;此时DNS服务器会以轮询方式响应
4. 同一个值也可能有多个不同的定义名字;通过多个不同的名字指向同一值进行定义;此仅表示通过多个不同的名字可以找到同一个主机
创建正向解析区域
在主配置文件中定义区域
vim /etc/named.conf
中 添加如下内容
zone "test.com" IN {
type master;
file "test.com.zone";
};
定义区域解析库文件
在 /var/named/ 目录下,创建 test.com.zone,解析库文件
/var/named/test.com.zone
中添加如下内容
$TTL 86400
$ORIGIN test.com.
@ IN SOA ns1.test.com. admin.test.com. (
2017011301
1H
5M
7D
1D
)
IN NS ns1
ns1 IN A 192.168.80.130
www IN A 192.168.80.130
IN A 192.168.80.130
* IN A 192.168.80.130
需要注意的是,在 /var/named 目录下创建文件的默认所属组属于root,named用户将无法读取,这里我们将属组改为named
chown :named /var/named/test.com.zone
对添加的内容解释如下
- $TTL 86400
宏定义 TTL 值为 86400 秒,记录省略未填写的 TTL值的记录,将自动代入该TTL值
- $ORIGIN test.com.
宏定义 ORIGIN(当前区域的名字),以便于 @ 引用,或 自动代入
;@ 引用当前区域名
;SOA 指明 ns1.test.com. 为当前区域权威服务器(主DNS服务器)
;admin.test.com 当前区域管理员的邮箱地址,但地址中不能使用@符号,一般用 . 替换
@ IN SOA ns1.test.com. admin.test.com (
2017011301 ;序列号
1H ;刷新时间
5M ;重试时间
7D ;过期时间
1D ;否定答案的TTL值
)
注意
1. 区域解析库文件中 第一条必须为 SOA,一个区域解析库有且仅能有一个SOA记录,而必须为解析库的第一条记录
2. 在资源记录定义的 代表为 根的 . (点号)必不可少
创建反向解析区域
在主配置文件中定义区域
vim /etc/named.conf
中 添加如下内容。通常反向解析区域名,约定俗成的规则为该 网络地址反写 拼接 “.in-addr.arpa”,如下
zone "80.168.192.in-addr.arpa" IN {
type master;
file "192.168.80.zone";
};
定义区域解析库文件
在 /var/named/ 目录下,创建 192.168.80.zone,解析库文件
/var/named/192.168.80.zone
中添加如下内容
$TTL 86400
$ORIGIN 80.168.192.in-addr.arpa.
@ IN SOA ns1.test.com. admin.test.com. (
2017011301
1H
5M
7D
1D
)
IN NS ns1.test.com.
130 IN PTR ns1.test.com.
130 IN PTR www.test.com.
同上,这里我们也要将属组改为named
chown :named /var/named/192.168.80.zone
正反向解析测试
- 首先检查主配置文件
named-checkconf
- 没有提示就是最好的提示
- 检查正反向区域解析库文件配置
named-checkzone "test.com" /var/named/test.com.zone
named-checkzone "80.168.192.in.addr.arpa" /var/named/192.168.80.zone
- 配置无误后 启动DNS服务
service named start
- 检查端口及IP地址
ss -tlunp | grep ":53"
- 测试正向解析结果是否正确
dig -t A www.test.com @127.0.0.1
- 测试反向解析结果是否正确
dig -x 192.168.80.130 @127.0.0.1
DNS主从同步配置
实验目标
- 负责 test.com 正反区域的解析
- 和 test.com 正反区域的主从同步
实验环境
- DNS主服务器为 CentOS6.8
- DNS从服务器为 CentOS7.2
- 主服务器的IP地址为 192.168.80.130
- 从服务器的IP地址为 192.168.80.131
安装服务
首先分别为主和从服务器安装提供DNS服务的bind程序包
yum install -y bind bind-libs bind-utils
编辑主服务器 配置文件
编辑 /etc/named.conf,结果如下
options {
listen-on port 53 { 192.168.80.130; };
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;
dnssec-enable no;
dnssec-validation no;
/* Path to ISC DLV key */
bindkeys-file "/etc/named.iscdlv.key";
managed-keys-directory "/var/named/dynamic";
};
logging {
channel default_debug {
file "data/named.run";
severity dynamic;
};
};
zone "." IN {
type hint;
file "named.ca";
};
zone "test.com" IN {
type master;
file "test.com.zone";
allow-transfer { 192.168.80.131; };
};
zone "80.168.192.in-addr.arpa" IN {
type master;
file "192.168.80.zone";
allow-transfer { 192.168.80.131; };
};
include "/etc/named.rfc1912.zones";
include "/etc/named.root.key";
注意
- 在生产环境中,
allow-transfer { 192.168.80.131; };
必不可少, 为防止内网服务器部署情况泄露,限制可以进行同步的服务器。
在 /var/named/ 目录下 新增正反区域解析库文件,test.com.zone 和 192.168.80.zone,并添加如下内容
/var/named/test.con.zone
$TTL 86400
$ORIGIN test.com.
@ IN SOA ns1.test.com. admin.test.com. (
2017011301
1H
5M
7D
1D
)
IN NS ns1
IN NS ns2
ns1 IN A 192.168.80.130
ns2 IN A 192.168.80.131
www IN A 192.168.80.130
IN A 192.168.80.130
* IN A 192.168.80.130
/var/named/192.168.80.zone
$TTL 86400
$ORIGIN 80.168.192.in-addr.arpa.
@ IN SOA ns1.test.com. admin.test.com. (
2017011301
1H
5M
7D
1D
)
IN NS ns1.test.com.
IN NS ns2.test.com.
130 IN PTR ns1.test.com.
131 IN PTR ns2.test.com.
130 IN PTR www.test.com.
最后对配置进行检查
named-checkconf
named-checkzone "test.com" /var/named/test.com.zone
named-checkzone "80.168.192.in-addr.arpa" /var/named/192.168.80.zone
关闭 iptables
service stop iptables
确认配置无误后开启DNS服务
service named start
注意
1. 主服务器应该为一台独立的名称服务器
2. 主服务器的区域解析库文件中必须有一条NS记录是指向从服务器
3. 主服务器必须允许从服务器作区域传送复制
编辑从服务器 配置文件
编辑 /etc/named.conf,结果如下
options {
listen-on port 53 { 192.168.80.131; };
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;
dnssec-enable no;
dnssec-validation no;
/* Path to ISC DLV key */
bindkeys-file "/etc/named.iscdlv.key";
managed-keys-directory "/var/named/dynamic";
pid-file "/run/named/named.pid";
session-keyfile "/run/named/session.key";
};
logging {
channel default_debug {
file "data/named.run";
severity dynamic;
};
};
zone "." IN {
type hint;
file "named.ca";
};
zone "test.com" IN {
type slave;
masters { 192.168.80.130; };
file "slaves/test.com.zone";
};
zone "80.168.192.in-addr.arpa" IN {
type slave;
masters { 192.168.80.130; };
file "slaves/192.168.80.130.zone";
};
include "/etc/named.rfc1912.zones";
include "/etc/named.root.key";
对配置进行检查
named-checkconf
开启DNS服务
- CentOS 7 系列 使用
systemctl
命令开启服务
systemctl start named.service
关闭SELinux 和 防火墙
- /etc/sysconfig/selinux
- systemctl stop firewalld.service
最后在 /var/named/slaves/ 目录能看到已经同步区域解析库文件
[root@localhost ~]# ls /var/named/slaves/
192.168.80.130.zone test.com.zone
注意
1. 从服务器只需要定义区域,而无须提供解析库文件;解析库文件应该放置于/var/named/slaves/目录中
2. bind程序的版本应该保持一致;否则,应该从高,主低
3. 如果未能同步,请检查主服务器的位于/var/named/目录下区域解析库的所属组权限是否正确,
4. 如果未能同步,注意检查主和从服务器的防火墙和SELinux是否设置得当,在本博文配置中,均是关闭状态
5.学会使用 tail -f /var/log/message
查看DNS服务日志来解决问题
DNS常用测试命令使用方法总结
dig命令
dig命令语法
dig [-t type] name [@SERVER] [query options]
- -t 指明类型 如 A记录 MX记录等
- name 需要查询的名称
- [@SERVER] 指定DNS服务器
- [query options] 查询选项
- +[no]trace 跟踪解析过程
- +[no]recurse 进行递归解析
- 示例
- 由指定 192.168.80.131 DNS服务器查询 A记录 名称为 www.test.com 的 IP地址
dig -t A www.test.com @192.168.80.131
host命令
host命令语法
host [-t type] name [SERVER]
示例
- 由指定 192.168.80.131 DNS服务器查询 A记录 名称为 www.test.com 的 IP地址
host -t A www.test.com 192.168.80.131
nslookup命令
nslookup命令语法
nslookup [-option] [name | -] [server]
常使用于交互式模式
nslookup >
server IP:指明使用哪个DNS server进行查询
set q=RR_TYPE:指明查询的资源记录类型
NAME:要查询的名称
示例
[root@localhost ~]# nslookup
> server 192.168.80.131
Default server: 192.168.80.131
Address: 192.168.80.131#53
> set q=A
> www.test.com
Server: 192.168.80.131
Address: 192.168.80.131#53
Name: www.test.com
Address: 192.168.80.130
>