案例:BIND 安装与配置详解
一、安装 BIND 软件包
-
安装 BIND 软件包
-
通过网络源或挂载的光盘安装 BIND:
yum install bind -y
-
或者通过 RPM 包安装,前提是挂载系统盘 ISO 镜像:
rpm -ivh bind-x.x.x-x.el7.x86_64.rpm
-
-
查看 BIND 配置文件路径
rpm -qc bind
该命令显示 BIND 安装后的配置文件路径,重要的几个讲解:
-
/etc/named.conf
:主配置文件,控制 BIND 服务的全局设置。该文件用于配置 DNS 服务器的行为,如区域(zones)、转发器(forwarders)、ACL(访问控制列表)等。
-
/etc/named.rfc1912.zones
- 区域配置文件,控制具体区域。专门用于定义 BIND 服务器中使用的区域(zone)。 -
/var/named/named.localhost
- 区域数据文件,存储区域信息。
-
二、配置 BIND 主服务器(正向解析)
本节环境
主服务器:20.0.0.11
客户端:Windows 10 或 Linux
-
修改主配置文件
编辑/etc/named.conf
文件,配置监听端口、区域数据存放位置及允许查询的网段:vim /etc/named.conf
主要修改以下几项:
- 监听端口和 IP 地址:指定 BIND 服务监听的端口和 IP 地址。
- 区域数据文件的存储路径:指定区域数据文件的存储目录。
- 允许查询的网段:定义允许访问 DNS 服务的客户端网段。
配置示例:
options { listen-on port 53 { 20.0.0.100; }; # ☆☆☆修改:监听53端口,指定本地IP,也可用any表示所有IP。 # listen-on-v6 port 53 { ::1; }; # ipv6行如不使用可以注释掉或者删除。 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 { 20.0.0.0/24; 172.16.100.0/24; }; allow-query { any; }; # ☆☆☆修改:允许访问本DNS解析服务的网段,也可用any表示所有。 };
-
配置根区域
在named.conf
中定义根区域,根区域用于处理域名解析的根请求:zone "." IN { # 正向解析“."根区域 type hint; # 类型为根区域(索引) file "named.ca"; # 区域数据文件为named.ca }; # named.ca文件记录了13台根域服务器的域名和IP地址等信息 include "/etc/named.rfc1912.zones"; # 包含区域配置文件中的所有配置,存储了标准的区域配置。
-
配置正向区域
- 编辑区域配置文件
/etc/named.rfc1912.zones
,文件里有模版,可复制粘贴后修改,添加正向解析区域:
vim /etc/named.rfc1912.zones
提示:vim编辑器的使用
- 定位到起始行:
j
或k
上下移动,G
直接跳行 - 进入可视模式:
V
进可视行模式,高亮显示当前行 - 选择多行:
j
向下选行,按一次选一行 - 复制选中的行:选中,按
y
进行复制到剪贴板 - 移动到粘贴位置:移动到要粘贴的位置
- 粘贴复制的行:
p
粘贴。当前行上方使用P
大P。
配置示例:
zone "my.com" IN { # ☆修改:正向解析"benet.com"区域 type master; # 声明该区域是主区域 file "my.com.zone"; # ☆修改:区域数据文件的路径,相对于/var/named路径目录,可以加个. allow-update { none; }; # 不允许自动更新区域数据 };
- 编辑区域配置文件
-
配置正向区域数据文件
- 在
/var/named/
目录下创建或修改区域数据文件,这个文件包含域名与 IP 地址的映射关系,可以直接复制改名原模板:
cd /var/named/ cp -p named.localhost my.com.zone # 保留源文件的权限和属主的属性复制 vim my.com.zone
数据文件通常包括 SOA 记录、NS 记录、A 记录等。
宏定义$,注释;
配置示例:
$TTL 1D # $-宏定义 # TTL(Time to Live)-缓存生存时间,表示在 DNS 服务器或客户端的缓存中,有效解析记录的生命周期 # 1D 表示 1 天,该区域数据在 1 天(1D)内有效 @ IN SOA my.com. rname.invalid ( # @-表示该文件定义的根域名,当前的DNS区域名 # IN-表示“Internet”类的资源记录类型。 # SOA-第一条解析,起始记录的解析 ## admin-主机名、服务名 0 ; serial # 序列号,表示该区域文件的版本,每次修改后应增加 1D ; refresh # 刷新时间,告知从服务器多久查询一次主服务器 1H ; retry # 重试时间,从服务器未联系到主服务器后的重试间隔 1W ; expire # 过期时间,从服务器未能更新后,缓存数据的有效期 3H ) ; minimum # 最小TTL值,未命中的缓存记录的生存时间 NS my.com. # 定义此区域的名称服务器 A 20.0.0.11 # A-将域名映射到IPV4 # 为域名 my.com 设置IP地址 ## MX 10 mail.my.com. ## 定义邮件交换记录 www IN A 20.0.0.20 # 定义子域名 www 的 A 记录 ## mail IN A 20.0.0.20 ## 定义子域名 mail 的 A 记录 ftp IN CNAME www # CNAME-别名,将 ftp 子域名设置为 www 子域名的别名 * IN A 20.0.0.20 # *-通配符,匹配所有未明确定义的子域名,泛域名
内容解释:
- @: 代表当前区域的根域名。
- 在 DNS 区域文件中,
@
代表该文件定义的根域名,也就是当前区域的名称。在实际使用中,@
将被解析为文件顶部定义的域名。 - 例如,如果区域文件顶部定义的域名是
example.com.
, 那么@
就代表example.com.
。
- 在 DNS 区域文件中,
- IN: 表示记录的类别,一般为互联网(Internet),通常情况下使用
IN
。- 表示“Internet”类(Internet Class)的资源记录类型。在大多数情况下,DNS 记录都使用
IN
,因为它表示记录属于互联网的标准 DNS 记录类型。 - 除了
IN
之外,还有其他类,如CH
(用于 CHAOS 类),但它们非常少见。
- 表示“Internet”类(Internet Class)的资源记录类型。在大多数情况下,DNS 记录都使用
- SOA (Start of Authority): 表示该 DNS 区域的起始记录,包含了该区域的主要信息,如序列号、刷新时间等。
SOA
是“Start of Authority”的缩写,表示权威起始记录。每个 DNS 区域文件必须包含一个且只有一个 SOA 记录。SOA
记录包含了一些重要信息,如主服务器的名称、负责人的电子邮件地址、区域的序列号、刷新时间、重试时间、过期时间和最小 TTL(生存时间)值。
- NS (Name Server): 指定负责该区域的名称服务器。
- A (Address Record): 将域名映射到 IPv4 地址。
- CNAME (Canonical Name Record): 将一个域名作为别名指向另一个域名。
- MX (Mail Exchange Record): 指定处理电子邮件的邮件服务器。
- TTL (Time to Live): 指定 DNS 记录在缓存中保留的时间长度,超过时间后需要重新查询。
- 在
-
检查启动文件格式
- 检查:
named-checkzone my.com /var/named/my.com.zone # 输出: zone my.com/IN: loaded serial 0 O
-
启动 BIND 服务并关闭防火墙
- 启动 BIND 服务:
systemctl start named
- 关闭防火墙以确保 DNS 服务的正常运行:
systemctl stop firewalld setenforce 0 # 关闭 SELinux
注意:若服务启动失败,可以查看日志文件排查错误,如果服务卡住,执行第二行命令解决:
tail -f /var/log/messages rndc-confgen -r /dev/urandom -a
- 检查端口,确认启动成功
netstat -natpul | grep 53
- 对域名语法进行检查(named.conf):
named-checkconf -z /etc/named.conf
-
客户端配置和测试DNS解析(Windows)
启动同网段下的客户端,以Windows为例
- 在Windows下更改网卡配置:
# 以我的网络环境为例,做如下配置 IP 20.0.0.120 # 同网段即可 NETMASK 255.255.255.0 GATEWAY 20.0.0.11 # 指向DNS服务器 DNS 20.0.0.11
- cmd使用nslookup命令测试:
nslookup www.my.com # 解析www域名对应的IP地址 # 输出: 服务器:UnKnown Address:20.0.0.11 名称:www.my.com Address:20.0.0.20 nslookup ftp.my.com # 解析ftp的别名对应的IP地址 # 输出: 服务器:UnKnown Address:20.0.0.11 名称:www.my.com Address:20.0.0.20 nslookup aa.my.com # 解析泛域名对应的IP地址 # 输出: 服务器:UnKnown Address:20.0.0.11 名称:www.my.com Address:20.0.0.20
都可以看到返回服务器地址,测试成功
-
客户端配置和测试DNS解析(Linux)
- 编辑客户端的
/etc/resolv.conf
文件,添加 DNS 服务器地址:
vim /etc/resolv.conf nameserver 20.0.0.11
- 或者在网络接口配置文件中添加 DNS 服务器地址,修改后需重启网卡:
vim /etc/sysconfig/network-scripts/ifcfg-ens33 DNS1=20.0.0.11 systemctl restart network
- 使用
host
或nslookup
命令测试 DNS 解析是否成功:
host www.my.com nslookup www.my.com
- 编辑客户端的
三、配置反向解析
本节环境
主服务器:20.0.0.11
客户端:Windows 10 或 Linux
-
配置反向区域
- 编辑区域配置文件
/etc/named.rfc1912.zones
,添加反向解析区域:
vim /etc/named.rfc1912.zones
在此文件中定义 IP 地址段的区域信息。同样复制模版修改。
配置示例:
zone "0.0.20.in-addr.arpa" IN { # 此处 20.0.0.0 反向为 0.0.20 # 再如:192.168.10.0 反向则是 10.168.192 type master; # 定义主区域 file "my.com.zone.local"; # 反向解析的数据文件 allow-update { none; }; # 禁止自动更新 };
- 编辑区域配置文件
-
配置反向区域数据文件
- 创建或修改反向区域数据文件:
cd /var/named/ cp -p my.com.zone my.com.zone.local vim my.com.zone.local
数据文件中通常包含 IP 地址与域名的映射。
配置示例:
$TTL 1D @ IN SOA my.com. rname.invalid. ( # 点.必须加上,否则报错,下同 0 ; serial # 序列号 # 更新序列号,10位以内数字,用于主从同步,主服务器这个数值要大于从服务器否则无法同步 1D ; refresh # 刷新时间 1H ; retry # 重试时间 1W ; expire # 过期时间 3H ) ; minimum # 最小TTL NS my.com. 100 IN PTR www.my.com. # 将IP地址的最后一段(100)解析为www.my.com 200 IN PTR mail.my.com. # 将IP地址的最后一段(200)解析为mail.my.com # 20是192.168.10.20的意思 # RTP反向指针 功能:反向解析
-
启动 BIND 服务
- 启动或重启 BIND 服务:
systemctl restart named
-
测试反向解析(Windows)
以Windows为例,确保网卡配置信息无误:
# 以我的网络环境为例,做如下配置 IP 20.0.0.120 # 同网段即可 NETMASK 255.255.255.0 GATEWAY 20.0.0.11 # 指向DNS服务器 DNS 20.0.0.11
- cmd使用nslookup命令测试:
nslookup 20.0.0.100 # 解析末段为 100 IP地址的域名 # 输出: 服务器:UnKnown Address:20.0.0.11 名称:www.my.com Address:20.0.0.100 nslookup 20.0.0.200 # 解析末段为 200 IP地址的域名 # 输出: 服务器:UnKnown Address:20.0.0.11 名称:mail.my.com Address:20.0.0.200
可以看到返回服务器地址和域名信息,测试成功
-
测试反向解析(Linux)
- 使用
host
命令测试反向解析,测试IP地址是否正确解析为域名:
host 20.0.0.100
若没问题将会反向解析出域名www.my.com。
- 使用
四、配置主从 DNS 服务器及自动同步
本节环境
主服务器:20.0.0.11
从服务器:20.0.0.12
客户端:Windows 10 或 Linux
-
主服务器配置
- 修改
/etc/named.conf
,允许所有网段查询:
options { listen-on port 53 { any; }; allow-query { any; }; };
- 编辑区域配置文件
/etc/named.rfc1912.zones
,添加从服务器地址:
zone "my.com" IN { type master; # 类型为主区域 file "my.com.zone"; allow-transfer { 20.0.0.12; }; }; # 设置从服务器地址 # 反向解析没有配置,这段关系不大 zone "0.0.20.in-addr.arpa" IN { type master; file "my.com.zone.local"; allow-transfer { 20.0.0.12; }; };
- 配置正向区域数据文件
my.com.zone
,带属性拷贝编辑:
cd /var/named/ cp -p name.localhost my.com.zone vim /var/named/my.com.zone
配置示例(只有正向解析,无反向解析)
$TTL 1D #有效解析记录的生存周期 @ in SOA my.com. rname.invalid ( #“@"符号表示当前的DNS区域名 0 ; serial #更新序列号,可以是10位以内的整数 1D ; refresh #刷新时间,重新下载地址数据的间隔 1H ; retry #重试延时,下载失败后的重试间隔 1W ; expire #失效时间,超过该时间仍无法下载则放弃# 3H) ; minimum #无效解析记录的生存周期 NS my.com. #记录当前区域的DNS服务器的名称 A 20.0.0.11 #记录主机IP地址 IN MX 10 mail.my.com. #MX为邮件交换记录,数字越大优先级越低 www IN A 20.0.0.11 #记录正向解析www.benet.com对应的IP mail IN A 20.0.0.22 #MX为邮件交换记录,数字越大优先级低 ftp IN CNAME www #CNAME使用别名,ftp 是www的别名 * IN A 20.0.0.30 #泛域名解析,“*"代表任意主机名,给一个不存在的地址
- 修改
-
从服务器配置
- 安装 BIND 并修改配置文件:
yum install -y bind vim /etc/named.conf #编辑后可以使用named-checkconf语法检查,后面参数可省 named-checkconf -z /etc/named.conf
配置示例:
options { listen-on port 53 { 20.0.0.12; }; # 监听53端口,ip地址使用提供服务的本地IP,也可用any表示所有 #listen-on-v6 port 53 { ::1; }; # ipv6行如不使用可以注释掉或者删除 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; }; # 允许使用本DNS解析服务的网段,也可用any代表所有 };
- 编辑从服务器的区域配置文件:
vim /etc/named.rfc1912.zones
配置示例:
zone "my.com" IN { type slave; # 类型为从区域 file "slaves/my.com.zone"; # 下载的区域数据文件保存到slaves/目录下 #allow-update { none; }; # 此行必须删掉,用于配置主服务器的动态更新DNS记录 masters { 20.0.0.11; }; }; # 设置主服务器地址 zone "0.0.20.in-addr.arpa" IN { type slave; file "slaves/my.com.zone.local"; masters { 20.0.0.11; }; };
-
启动服务并验证
- 主从都重启 BIND 服务,并检查从服务器的区域数据文件是否成功下载:
systemctl restart named ls -1 /var/named/slaves/
-
测试(Windows)
- 在cmd下使用nsloopup命令分别测试:
nslookup www.my.com # 解析www域名对应的IP地址 # 输出: 服务器:UnKnown Address:20.0.0.11 名称:www.my.com Address:20.0.0.11 nslookup ftp.my.com # 解析ftp的别名对应的IP地址 # 输出: 服务器:UnKnown Address:20.0.0.11 名称:www.my.com Address:20.0.0.11 nslookup mail.my.com # 解析mail域名对应的IP地址 # 输出: 服务器:UnKnown Address:20.0.0.11 名称:mail.my.com Address:20.0.0.22 nslookup aa.my.com # 解析泛域名对应的IP地址 # 输出: 服务器:UnKnown Address:20.0.0.11 名称:aa.my.com Address:20.0.0.30
经测试,全部一一对应,是成功的
-
测试(Linux)
- 在Linux的域名解析配置文件中添加从DNS服务器地址
echo "nameserver 20.0.0.11" >> /etc/resolv.conf
- 测试
host 20.0.0.12 host www.my.com nslookup 20.0.0.11
-
模拟故障
- 停止主服务器的服务,模拟主服务器故障
systemctl stop named
- 再在Windows端测试
注意:在Windows端需将从DNS服务器IP设置为首选DNS,否则无论是重启还是中断主DNS服务器网络,Windows系统都只认首选,备选不会选择,暂时未解决。Linux未测试。