前言
整个互联网中连接了数以亿计的服务器、个人主机,其中大部分的网站、邮件等服务器都使用了域名形式的地址,比如 www.google.com 、mail.163.com 等。很明显这种格式的地址要比使用 64.233.189.147 的 IP 地址形式更加直观,而且更容易被用户记住。
一、BIND 域名服务基础
1.DNS 服务器及类型
1.1 DNS 服务器
-
全世界只有13台 DNS 根服务器(这13台根域名服务器名字分别为 “A” 至 “w” ),1个为主根服务器在美国,其余12个均为辅根服务器,其中9个在美国,欧洲2个,位于英国和瑞典,亚洲1个位于日本。 -
DNS 的默认端口为53,分为TCP和UDP。 -
TCP 是用来做区域传送,多用于主从同步,在一个区中主 DNS 服务器从自己本机的数据文件中读取该区的 DNS 数据信息,而辅助 DNS 服务器则从区的主 DNS 服务器中读取该区的 DNS 数据信息。 -
UDP 是用来做 DNS 解析的
1.2 服务器类型
根据所管理的区域地址数据的来源不同,DNS系统可以分为不同的类型。在同一台DNS服务器中,相对于不同的区域来说,也拥有不同的身份。常见的几种类型如下:
-
缓存域名服务器:只提供域名解析结果的缓存功能,目的在于提高查询速度和效率,但是没有自己控制的区域地址数据。构建缓存域名服务器时,必须设置根域或指定其他 DNS服务器作为解析来源。 -
主域名服务器:维护某一个特定 DNS区域的地址数据库,对其中的解析记录具有自主控制权,是指定区域中唯一存在的权威服务器、官方服务器。构建主域名服务器时,而要自行建立所负责区域的地址数据文件。 -
从域名服务器:与主域名服务器提供完全相同的DNS解析服务,通常用于DNS服务器的热备份。
2. DNS 系统的分布式数据结构
-
全域名是指同时带有主机名和域名的名称,如 www.baidu.com -
用树根的完整表述方式,从节点到树根采用反向书写,并将每个节点用 “.” 分隔 -
FQDN 有严格的命名限制,长度不能超过256字节,只允许使用字符a-z,0-9,A-Z 和减号 “-” 。 -
点号 “.” 只允许在域名标志之间或者 FQDN 的结尾使用。 -
域名不区分大小,由最顶层到下层,可以分成:根域、顶级域、二级域、子域,如下图
示例
www.baidu.com.
www #主机
.baidu #子域
.com #二级
.cn #顶级域
. #根域
3.BIND 安装和配置文件
BIND 不是唯一能够提供域名服务的 DNS 服务程序,但它却是应用最为广泛的,可以运行在大多数 Linux/UNIX 主机中。
3.1 BIND的安装
软件包及功能如下
-
bind-9.9.4-37.el7.x86 64.rpm ——提供了域名服务的主要程序及相关文件。 -
bind-utils-9.9.4-37.el7.x86 64.rpm——提供了对DNS服务器的测试工具程序,如 nslookup 等 -
bind-libs-9.9.4-37.el7.x86_64.rpm ——提供了bind、bind-utils需要使用的库函数。 -
bind-chroot-9.9.4-37.el7.x86 64.rpm ——为 BIND服务提供一个伪装的根目录(将/var/named/chroot/文件夹作为BIND 服务的根目录),以提高安全性。
默认已安装 bind-utils 和 bind-libs,因此只需要安装 bind 和 bind-chroot 即可
[root@localhost ~]#yum install -y bind #安装bind软件包
[root@localhost /]#rpm -qa |grep "^bind" #查看是否已安装与bind相关的软件包
bind-license-9.11.4-26.P2.el7_9.5.noarch
bind-9.11.4-26.P2.el7_9.5.x86_64
bind-export-libs-9.11.4-26.P2.el7_9.5.x86_64
bind-libs-9.11.4-26.P2.el7_9.5.x86_64
bind-utils-9.11.4-26.P2.el7_9.5.x86_64
bind-libs-lite-9.11.4-26.P2.el7_9.5.x86_64
3.2 BIND服务控制
[root@localhost /var/named]#service named status #查看服务状态
或者
[root@localhost /var/named]#systemctl status named #查看服务状态
[root@localhost /var/named]#systemctl start named #开启服务
3.3 BIND 服务的配置文件
[root@localhost ~]# rpm -qc bind
- 主配置文件 named.conf 通常位于 /etc/ 目录下,named.conf 文件里主要包括全局配置和区域配置两个部分
① 全局配置
options {
listen-on port 53 { 192.168.24.129; }; #监听地址和端口
# 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";
recursing-file "/var/named/data/named.recursing";
secroots-file "/var/named/data/named.secroots";
allow-query { any; }; #允许使用的本DNS服务的网段(any代表所有)
② 区域配置
zone "benet.com." IN { #正向“benet.com.”区域
type master; #类型为主区域
file "benet.com.zone"; #区域数据文件为 benet.com.zone
allow-update { none; };
};
修改完主配置文件以后,可以执行 named-checkconf 命令对 named.conf 文件进行语法检查。如果文件中没有语法错误,该命令将不给出任何提示;反之,则会给出相应的提示信息,只要根据出错提示修正文件中的错误即可。
带“-z”选项的 named-checkconf 命令还可以尝试加载主配置文件中对应的区域数据库文件,并检查该文件是否存在问题。例如,当出现“…file not found”的错误时,表示找不到对应的文件。
- 区域数据配置文件 named.localhost 通常位于 /var/named/ 目录下,每个区域数据文件对应一个 DNS 解析区域
$TTL 1D #有效解析记录生存周期
@ IN SOA benet.com. admin.benet.com. ( #"@"符号表示当前的DNS区域名
0 ; serial #更新序列号,可以是10位以内的整数
1D ; refresh #刷新时间,重新下教地址数据的间隔
1H ; retry #重试延时,下教失败后的重试间隔
1W ; expire #失效时间,超过该时间仍无法下载则放弃
3H ) ; minimum #无效解析记录的生存周期
NS benet.com. #记录当前区域的DNS服务器的名称
A 192.168.24.129 #主机IP地址
IN MX 10 mail.benet.com. #MX邮件交换记录,数字越大优先级越低
www IN A 192.168.24.129 #正向解析对应的IP地址
mail IN A 192.168.24.30
ftp IN CNAME www #CNAME使用别名,ftp是www的别名
* IN A 192.168.24.100 #泛域名解析,“*"代表任意主机名
注意:"benet.com. “为完全合格域名(FQDN),后面有个”."不能漏掉,否则无法解析
二、使用 BIND 构建域名服务器
1. 正向解析
基本步骤如下
① 关闭防火墙
systemctl stop firewalld
② 先挂载再安装 BIND 软件包
[root@localhost ~]#mount /dev/sr0 /mnt/
mount: /dev/sr0 写保护,将以只读方式挂载
[root@localhost ~]#yum install -y bind
已安装:
bind.x86_64 32:9.11.4-26.P2.el7_9.5
作为依赖被安装:
bind-export-libs.x86_64 32:9.11.4-26.P2.el7_9.5
作为依赖被升级:
bind-libs.x86_64 32:9.11.4-26.P2.el7_9.5 bind-libs-lite.x86_64 32:9.11.4-26.P2.el7_9.5 bind-license.noarch 32:9.11.4-26.P2.el7_9.5
bind-utils.x86_64 32:9.11.4-26.P2.el7_9.5 dhclient.x86_64 12:4.2.5-83.el7.centos.1 dhcp-common.x86_64 12:4.2.5-83.el7.centos.1
dhcp-libs.x86_64 12:4.2.5-83.el7.centos.1
完毕!
③ 配置主配置文件
[root@localhost ~]#vim /etc/named.conf
options {
listen-on port 53 { 192.168.24.129; }; #本地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";
recursing-file "/var/named/data/named.recursing";
secroots-file "/var/named/data/named.secroots";
allow-query { any; }; #设置any代表允许所有解析的网段
:wq保存并退出
④ 更改区域配置文件,添加正向解析的区域目标
[root@localhost /var/named]#vim /etc/named.rfc1912.zones
......
};
zone "benet.com." IN { #正向解析的区域
type master;
file "benet.com.zone"; #指定文件为benet.com.zone
allow-update { none; };
};
......
:wq保存并退出
⑤ 备份配置文件
[root@localhost /var/named]#cd /var/named/ #区域数据文件存放位置
[root@localhost /var/named]#ls
data dynamic named.ca named.empty named.localhost named.loopback slaves
[root@localhost /var/named]#cp -p named.localhost benet.com.zone #这里一定带上"-p"选项,保留权限
[root@localhost /var/named]#ls
benet.com.zone data dynamic named.ca named.empty named.localhost named.loopback slaves
⑥ 配置正向区域数据文件
[root@localhost /var/named]#vim benet.com.zone
$TTL 1D
@ IN SOA benet.com. admin.benet.com. (
0 ; serial
1D ; refresh
1H ; retry
1W ; expire
3H ) ; minimum
NS benet.com.
A 192.168.24.129
IN MX 10 mail.benet.com.
www IN A 192.168.24.129
mail IN A 192.168.24.30
ftp IN CNAME www
* IN A 192.168.24.100
:wq保存并退出
注意:配置的时候一定要再三检查格式,不要漏掉任何一个标点符号,比如"." !!!
⑦ 修改客户端的域名解析配置文件,添加 DNS 服务器地址。
[root@localhost /var/named]#vim /etc/resolv.conf
# Generated by NetworkManager
search localdomain
#nameserver 192.168.24.2 #注释掉
nameserver 192.168.24.129 #添加本地IP地址
~
⑧ 启动 named 服务
[root@localhost /var/named]#systemctl start named #开启服务
[root@localhost /var/named]#systemctl status named #查看服务状态
⑨ 验证解析
[root@localhost /var/named]#nslookup www.benet.com
Server: 192.168.24.129
Address: 192.168.24.129#53
Non-authoritative answer:
Name: www.bene.com
Address: 85.13.130.6
[root@localhost /var/named]#nslookup mail.benet.com
Server: 192.168.24.129
Address: 192.168.24.129#53
Name: mail.benet.com
Address: 192.168.24.30
[root@localhost /var/named]#nslookup aaab.benet.com
Server: 192.168.24.129
Address: 192.168.24.129#53
Name: aaab.benet.com
Address: 192.168.24.100
[root@localhost /]#host abc.benet.com
2. 反向解析
- 这里是建立在上面正向解析基础上来进行配置的,主配置文件就不做修改了。
步骤如下
①更改区域配置文件,添加反向解析的区域目标
[root@localhost /var/named]#vim /etc/named.rfc1912.zones
zone "24.168.192.in-addr.arpa" IN { #这里填写地址的时候一定要注意不能多填或是少"."
type master;
file "benet.com.zone.local";
allow-update { none; };
};
:wq保存并退出
② 备份
[root@localhost /var/named]#cp -p benet.com.zone benet.com.zone.local
[root@localhost /var/named]#ls
benet.com.zone benet.com.zone.local data named.ca named.empty named.localhost named.loopback slaves
③ 配置反向区域数据文件
[root@localhost /var/named]#vim benet.com.zone.local
$TTL 1D
@ IN SOA benet.com. admin.benet.com. (
0 ; serial
1D ; refresh
1H ; retry
1W ; expire
3H ) ; minimum
NS benet.com.
A 192.168.24.129
100 IN PTR www.benet.com.
:wq保存并退出
④ 重启服务
[root@localhost /var/named]#systemctl restart named
⑤ 测试解析
[root@localhost /var/named]#host 192.168.10.100
Host 100.10.168.192.in-addr.arpa. not found: 3(NXDOMAIN)
3. 正向解析过程详解
3.1 解析过程
首先,客户机提交域名解析请求,并将该请求发送给本地的域名服务器:
①当本地的域名服务器收到请求后,先检查DNS服务器的缓存,若查到请求的地址或名字,即向客户机发出应答信息;
②若没有查到,则在数据库中查找,若查到请求的地址或名字,即向客户机发出应答信息;
③若没有查到,则将请求发给根域DNS服务器,并依序从根域查找顶级域,由顶级查找二级域,二级域查找三级,直至找到要解析的地址或名字,即向客户机所在网络的 DNS 服务器发出应答信息,DNS 服务器收到应答后先在缓存中存储,然后将解析结果发给客户机。
④若没有找到,则返回错误信息。
3.2 查询方式
① 递归查询
- 递归查询是一种 DNS 服务器的查询模式,在该模式下 DNS 服务器接收到客户机请求,必须使用一个准确的查询结果回复客户机。如果 DNS 服务器本地没有存储查询 DNS 信息,那么该服务器会询问其他服务器,并将返回的查询结果提交给客户机。
通俗来说就是客户机发送请求后自己只用等待结果即可,中间具体过程交给服务器实现。
② 迭代查询
- DNS 服务器另外一种查询方式,当客户机发送查询请求时,DNS 服务器并不直接回复查询结果,而是告诉客户机另一台 DNS 服务器地址,客户机再向这台 DNS 服务器提交请求,依次循环直到返回查询的结果为止。
大概意思就是客户机的请求需要自己挨个去查询才能得到结果,服务器没有结果时候只会给你提供其它服务器的地址,而不会帮你去请求查询,这与递归截然相反。
三、构建主从域名服务器
1. 从服务器作用
从服务器作为主 DNS 的备份服务器,为主服务器分担域名查询的压力,并且提供区域数据的备份。
2. 主从服务器的构建
① 先配置主服务器
[root@localhost ~]# vim /etc/named.rfc1912.zones
zone "benet.com." IN {
type master; #类型为主服务器
file "benet.com.zone";
allow-transfer { 192.168.24.128; }; #设置从服务器地址
};
};
zone "24.168.192.in-addr.arpa" IN {
type master;
file "benet.com.zone.local";
allow-transfer { 192.168.24.128; };
[root@localhost ~]# vim /etc/resolv.conf
# Generated by NetworkManager
#nameserver 192.168.24.2
nameserver 192.168.24.129
nameserver 192.168.24.128
② 配置从服务器
[root@localhost ~]#mount /dev/sr0 /mnt/ #先挂载
mount: /dev/sr0 写保护,将以只读方式挂载
[root@localhost ~]#df -h
[root@localhost ~]#yum install -y bind #安装 BIND 包
[root@localhost ~]#cp -p /etc/named.conf /etc/named.conf.bak #先进行备份
[root@localhost /]#vim /etc/named.conf #修改主配置文件
options {
listen-on port 53 { 192.168.24.128; };
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";
recursing-file "/var/named/data/named.recursing";
secroots-file "/var/named/data/named.secroots";
allow-query { any; };
[root@localhost /]#vim /etc/named.rfc1912.zones #修改区域配置文件
zone "benet.com" IN {
type slave; #类型设置为从服务器
file "slaves/benet.com.zone"; #指定数据文件
masters { 192.168.24.129; }; #指向主服务器IP地址
};
zone "24.168.192.in-addr.arpa" IN {
type slave;
file "slaves/benet.com.zone.local";
masters { 192.168.24.129; };
};
:wq保存并退出
到客户端的域名解析配置文件中添加从服务器地址
[root@localhost /]#vim /etc/resolv.conf
# Generated by NetworkManager
search localdomain
#nameserver 192.168.24.2
nameserver 192.168.24.129
nameserver 192.168.24.128
重启 named 服务
[root@localhost /etc/named]#systemctl restart named
配置完以后关闭主服务,测试能否进行域名解析
到主服务器里关闭named服务,并解析
[root@localhost ~]# systemctl stop named
[root@localhost ~]# host www.benet.com
www.benet.com has address 192.168.24.129
总结:可以看到当主服务器的 named 服务关闭以后,一样是可以解析的。
四、构建分离解析的域名服务器
① 安装 bind 软件包
[root@localhost ~]#yum install -y bind
② 添加二块新网卡ens33 ens37
③ 对网卡进行配置
[root@localhost ~]#cd /etc/sysconfig/network-scripts/
[root@localhost /etc/sysconfig/network-scripts]#vim ifcfg-ens33
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens33
UUID=d070a868-b0cc-4909-829f-5dcb4cda6ba0
DEVICE=ens33
ONBOOT=yes
IPADDR=192.168.20.21
NETMASK=255.255.255.0
[root@localhost /etc/sysconfig/network-scripts]#cp -p ifcfg-ens33 ifcfg-ens37
[root@localhost /etc/sysconfig/network-scripts]#vim ifcfg-ens37
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
#NAME=ens37
#UUID=d070a868-b0cc-4909-829f-5dcb4cda6ba0
DEVICE=ens37
ONBOOT=yes
IPADDR=10.0.0.101
NETMASK=255.255.255.0
④ 查看网卡信息
root@localhost /etc/sysconfig/network-scripts]#systemctl restart network
[root@localhost /etc/sysconfig/network-scripts]#ifconfig
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.20.21 netmask 255.255.255.0 broadcast 192.168.20.255
inet6 fe80::88c5:1c37:ef02:f37f prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:d2:bb:c5 txqueuelen 1000 (Ethernet)
RX packets 444 bytes 42749 (41.7 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 393 bytes 58207 (56.8 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
ens37: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 10.0.0.101 netmask 255.255.255.0 broadcast 10.0.0.255
inet6 fe80::1be3:a624:9776:2f7b prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:d2:bb:cf txqueuelen 1000 (Ethernet)
RX packets 263 bytes 24145 (23.5 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 219 bytes 28810 (28.1 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
⑤ 修改主配置文件
[root@localhost ~]#vim /etc/named.conf
options {
listen-on port 53 { any; };
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";
recursing-file "/var/named/data/named.recursing";
secroots-file "/var/named/data/named.secroots";
allow-query { any; };
:wq 保存退出
⑥ 配置区域配置文件
[root@localhost ~]#vim /etc/named.rfc1912.zones
view "lan" {
match-clients { 192.168.20.0/24; } ;
zone "benet.com" IN {
type master;
file "benet.com.zone.lan";
};
zone "." IN {
type hint;
file "named.ca";
};
};
view "wan" {
match-clients { any; };
zone "benet.com" IN {
type master;
file "benet.com.zone.wan";
};
};
:wq保存并退出
⑦ 修改区域数据配置文件
[root@localhost ~]#cd /var/named/
[root@localhost /var/named]#ls
data dynamic named.ca named.empty named.localhost named.loopback slaves
[root@localhost /var/named]#cp -p named.lo
named.localhost named.loopback
[root@localhost /var/named]#cp -p named.localhost benet.com.zone.lan
[root@localhost /var/named]#vim benet.com.zone.lan
$TTL 1D
@ IN SOA benet.com. admin.benet.com. (
0 ; serial
1D ; refresh
1H ; retry
1W ; expire
3H ) ; minimum
NS benet.com.
A 192.168.20.21
www IN A 192.168.20.21
:wq保存退出
[root@localhost /var/named]#cp -p benet.com.zone.lan benet.com.zone.wan
[root@localhost /var/named]#vim benet.com.zone.wan
$TTL 1D
@ IN SOA benet.com. admin.benet.com. (
0 ; serial
1D ; refresh
1H ; retry
1W ; expire
3H ) ; minimum
NS benet.com.
A 10.0.0.101
www IN A 10.0.0.101
:wq保存退出
⑧ 内网验证
[root@localhost /var/named]#systemctl restart named
[root@localhost /var/named]#host www.benet.com
www.benet.com has address 10.0.0.101
⑨ 进入虚拟机 Windows10 系统里更改配置验证外网能否解析
先把网卡改为 VMnet3
然后手动配置 IP 地址等信息
查看 IP 地址
从上面输出信息可以看出以外网的 IP 成功解析
总结
-
DNS 系统主要提供以下功能:根据域名查找IP地址(正向解析),根据IP地址查找域名(反向解析)。 -
常见的 DNS 服务器类型包括:缓存域名服务器、主域名服务器、从域名服务器。 -
DNS 服务的配置文件主要包括:主配置文件 named.conf、各个解析区域的区域数据文件。 -
分离解析的域名服务器实际也还是主域名服务器,可以根据不同的客户端提供不同的域名解析记录。
|