DNS服务实战汇总

admin 2023年03月29日 375次浏览

1、BIND软件

在 Linux 中,通常使用 BIND 软件搭建 DNS 服务,本文就使用该软件进行 DNS 服务器的搭建进行介绍

1.1、相关程序包

bind:服务器主程序

bind-libs:相关库

bind-utils:客户端

bind-chroot:安全包,将DNS相关文件存放至 /var/named/chroot/

1.2、安装BIND软件

[root@localhost ~]# yum install bind bind-utils -y

1.3、关键文件与路径

  • /etc/named.conf:named 程序配置文件
  • /usr/lib/systemd/system/named.service:DNS 服务程序
  • /usr/sbin/named:bind 主程序文件
  • /var/log/named.log:named 日志文件
  • /var/named/named.ca:根域数据库
  • /etc/named.rfc1912.zones:区域数据库存放路径

1.4、常用工具

这些工具包含在 bind-utils 包中

  • rndc

    named 服务管理工具

    • status:查看 named 状态
    • stop:将挂起的更新保存到主文件并停止服务器
    • reload:重新加载配置文件和区域
    • reload zone:重新加载单个区域
    • flush:刷新服务器的所有缓存
    • dumpdb:将缓存转储到转储文件
  • dig

    用于查询 DNS 域名服务器信息

    # 简单查询
    [root@localhost ~]# dig www.baidu.com
    
    # 使用指定DNS服务器查询
    [root@localhost ~]# dig @8.8.8.8 www.baidu.com
    
    # 查询指定类型的DNS记录
    [root@localhost ~]# dig -t MX baidu.com
    
  • host

    用于查询 DNS 域名服务器信息,只是显示比 dig 简略

    [root@localhost ~]# host www.baidu.com
    www.baidu.com is an alias for www.a.shifen.com.
    www.a.shifen.com has address 14.119.104.189
    www.a.shifen.com has address 14.215.177.38
    
  • named-checkconf

    用于检查 named 程序配置文件的配置正确与否

    [root@localhost ~]# named-checkconf /etc/named.conf
    
  • named-checkzone

    用于检查区域文件配置情况

    [root@localhost ~]# named-checkzone localhost /var/named/named.localhost
    zone localhost/IN: loaded serial 0
    OK
    

1.5、配置文件简介

[root@localhost ~]# cat /etc/named.conf
# 程序通用配置
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";
        # 使用rndc统计信息时服务器追加统计信息的文件
        statistics-file "/var/named/data/named_stats.txt";
        # 服务器在退出时写入内存使用情况统计信息的文件
        memstatistics-file "/var/named/data/named_mem_stats.txt";
        # 指定服务器转储当前通过 rndc recursing 递归查询的文件
        recursing-file  "/var/named/data/named.recursing";
        # 使用rndc secroot时服务器转储安全根的文件
        secroots-file   "/var/named/data/named.secroots";
        # 允许查询的主机列表
        ## 支持:any(任何主机)、单个ip、网段
        allow-query     { localhost; };
        # 是否允许递归和缓存
        recursion yes;
        
        # 安全验证
        dnssec-enable yes;
        dnssec-validation yes;
        # 指定认证密钥
        bindkeys-file "/etc/named.root.key";
        # 用于存储跟踪托管DNSSEC密钥的文件的目录
        managed-keys-directory "/var/named/dynamic";
        # pid文件
        pid-file "/run/named/named.pid";
        # 写入TSIG会话密钥的文件
        session-keyfile "/run/named/session.key";
};

# 日志相关配置
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";

2、配置简单DNS服务

该节主要是配置一个简单的仅用于能够解析域名用来上网使用的服务

在 bind 软件安装完毕,并启动 named 服务后,只有 DNS 服务器本机可以使用该 DNS 服务做域名解析,其他客户端无法使用该服务器做域名解析,因此需要修改配置文件,以给其他客户端提供域名解析服务

# 只需要修改监听地址和允许查询的主机即可
[root@localhost ~]# vim /etc/named.conf
options {
        listen-on port 53 { localhost; };
        allow-query     { any; };
        };

3、配置主DNS服务器

3.1、创建区域数据库

[root@localhost ~]# vim /var/named/testsvr.cn.zone
$TTL 1D
@       IN              SOA     ns1.testsvr.cn. admin.testsvr.cn. ( 0 1D 1H 1W 3H )
                                        
@       IN              NS      ns1.testsvr.cn.
ns1.testsvr.cn. IN      A       192.168.137.10

www     IN              A       192.168.137.11

3.2、将区域文件添加到DNS主服务器数据库

[root@localhost named]# vim /etc/named.rfc1912.zones
# 添加区域记录
zone "testsvr.cn" IN {
        # DNS服务器类型,此处是主服务器
        type master;
        # 区域文件名称
        file "testsvr.cn.zone";
};

3.3、测试DNS解析

[root@localhost named]# dig www.testsvr.cn

; <<>> DiG 9.11.4-P2-RedHat-9.11.4-26.P2.el7_9.13 <<>> www.testsvr.cn
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 34636
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 2

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;www.testsvr.cn. 		IN      A

;; ANSWER SECTION:
www.testsvr.cn.         86400   IN      A       192.168.137.11

;; AUTHORITY SECTION:
testsvr.cn.             86400   IN      NS      ns1.testsvr.cn.

;; ADDITIONAL SECTION:
ns1.testsvr.cn.         86400   IN      A       192.168.137.10

# 使用nslookup测试
C:\Users\Administrator>nslookup www.testsvr.cn
服务器:  UnKnown
Address:  192.168.137.10

名称:    www.testsvr.cn
Address:  192.168.137.11

3.4、测试域名访问

[root@localhost named]# curl www.testsvr.cn
web server 192.168.137.11

4、配置DNS从服务器

如果只有一台 DNS 服务器,就会存在单点故障的问题,可以通过建立从服务器的方式来提供冗余机制。从服务器可以自动和主服务器进行单向数据同步,从而和主服务器保持数据同步。从服务器也可以对外提供解析服务,但是从服务器不提供数据更新服务

4.1、配置要求

  • 从服务器应该是一台单独的服务器
  • 主服务器的区域解析库文件中必须有一条 NS 记录指向从服务器
  • 从服务器只需要定义区域,而无需提供解析库文件(解析库文件默认存放路径: /var/named/slaves/
  • 主服务器需要允许从服务器作区域传送
  • 主从服务器时间应该同步(可使用 NTP 实现)
  • bind 程序的版本最好保持一致,否则从服务器的版本需要高于主服务器的版本

4.2、定义从区域

zone "ZONE_NAME" IN {
    type slave;
    masters { MASTERS_IP; }
    file "slaves/ZONE_NAME.zone";
};

4.3、实现DNS从服务器

4.3.1、配置主DNS服务器

# 修改主配置文件
[root@dns-master ~]# vim /etc/named.conf
options {
        listen-on port 53 { localhost; };
        allow-query     { any; };
        # 只允许从服务器进行区域传输
		allow-transfer  { 192.168.137.20; };
		};

# 创建区域文件
[root@dns-master ~]# vim /var/named/testsvr.cn.zone
$TTL 1D
@       IN      SOA     master admin.testsvr.cn. (0 1D 1H 1W 3H)

                NS      master
                NS      slave

master  IN      A       192.168.137.10
slave   IN      A       192.168.137.20

# 添加区域记录
[root@dns-master ~]# vim /etc/named.rfc1912.zones
zone "testsvr.cn" IN {
        type master;
        file "testsvr.cn.zone";
};

4.3.2、配置从DNS服务器

# 配置bind程序
[root@dns-slave ~]# vim /etc/named.conf
options {
        listen-on port 53 { localhost; };
        allow-query     { any; };
        # 不允许其他服务器进行区域传输
        allow-transfer  { none; };
        };

# 添加区域记录
[root@dns-slave ~]# vim /etc/named.rfc1912.zones
zone "testsvr.cn" IN {
        type slave;
        masters { 192.168.137.10; };
        file "slaves/testsvr.cn.slave";
};

# 重载服务
[root@dns-slave ~]# rndc reload
server reload successful

# 查看区域文件生成情况
[root@dns-slave ~]# ll /var/named/slaves/
总用量 4
-rw-r--r-- 1 named named 356 3月  26 19:02 testsvr.cn.slave

4.2.3、测试DNS从服务器

# 停止DNS主服务器
[root@dns-master ~]# systemctl stop named

# 测试DNS从服务器解析
[root@dns-slave ~]# host www.testsvr.cn 192.168.137.20
Using domain server:
Name: 192.168.137.20
Address: 192.168.137.20#53
Aliases:
www.testsvr.cn has address 192.168.137.11

# 测试主从同步
## 在主服务器中添加一条记录,并修改序列号,然后重载区域文件
@               A       192.168.137.11
[root@dns-master ~]# rndc reload
server reload successful
## 查看从服务器区域文件信息
[root@dns-slave ~]# ll /var/named/slaves/
总用量 4
-rw-r--r-- 1 named named 394 3月  26 19:20 testsvr.cn.slave

5、配置DNS子域服务器

在现有域名 testsvr.cn 的域下创建一个独立的 sc.testsvr.cn 子域,并且对外提供域名解析服务

5.1、子域委派授权

将子域授权给其他主机管理,实现分布式 DNS 数据库

dy			600	IN	NS	ns1.dy.testsvr.cn
					NS	ns2.dy.testsvr.cn
cd			600	IN	NS	ns1.cd.testsvr.cn
					NS	ns2.cd.testsvr.cn

ns1.dy.testsvr.cn	600	IN	A	192.168.137.10
ns2.dy.testsvr.cn	600	IN	A	192.168.137.20
ns1.cd.testsvr.cn	600	IN	A	192.168.137.30
ns2.cd.testsvr.cn	600	IN	A	192.168.137.40

5.2、配置DNS父域和子域服务

5.2.1、配置父DNS服务器

# 修改主配置文件
[root@dns-master ~]# vim /etc/named.conf
options {
        listen-on port 53 { localhost; };
        allow-query     { any; };
		allow-transfer  { 192.168.137.20; };
		};

# 创建区域文件
[root@dns-master ~]# vim /var/named/testsvr.cn.zone
$TTL 1D
@       IN      SOA     mastar  admin.testsvr.cn. (0 1D 1H 1W 3H)


                NS      master
dy              NS      dy

master  IN      A       192.168.137.10
dy      IN      A       192.168.137.20

www     IN      A       192.168.137.11

# 添加区域记录
[root@dns-master ~]# vim /etc/named.rfc1912.zones
zone "testsvr.cn" IN {
        type master;
        file "testsvr.cn.zone";
};

5.2.2、配置子域DNS服务器

# 配置bind程序
[root@sub-domains ~]# vim /etc/named.conf
options {
        listen-on port 53 { localhost; };
        allow-query     { any; };
        allow-transfer  { none; };
        };

# 创建区域文件
[root@sub-domains ~]# vim /var/named/dy.testsvr.cn.zone
$TTL 1D
@       IN      SOA     mastar  admin.testsvr.cn. (0 1D 1H 1W 3H)


                NS      master

master  IN      A       192.168.137.10
www     IN      A       192.168.137.11

# 添加区域记录
[root@dns-slave ~]# vim /etc/named.rfc1912.zones
zone "dy.testsvr.cn" IN {
        type master;
        file "dy.testsvr.cn.zone";
};

# 重载配置
[root@sub-domains ~]# rndc reload
server reload successful

5.2.3、验证配置

# 客户端发起请问求
[root@client ~]# curl www.dy.testsvr.cn
web server 192.168.137.11

# 主DNS解析过程
[root@dns-master ~]# tcpdump -i ens33 port 53 -nn
21:35:30.068831 IP 192.168.137.11.55819 > 192.168.137.10.53: 4551+ A? www.dy.testsvr.cn. (35)
21:35:30.069259 IP 192.168.137.10.34222 > 192.168.137.20.53: 58837 [1au] A? www.dy.testsvr.cn. (46)
21:35:30.069740 IP 192.168.137.20.53 > 192.168.137.10.34222: 58837* 1/0/1 A 192.168.137.11 (62)

# dig测试解析信息
[root@client ~]# dig www.dy.testsvr.cn
;; ANSWER SECTION:
www.dy.testsvr.cn.      86269   IN      A       192.168.137.11

;; AUTHORITY SECTION:
dy.testsvr.cn.          86400   IN      NS      dy.testsvr.cn.

6、配置DNS转发(缓存)服务器

6.1、DNS转发

利用 DNS 转发,可以将用户的 DNS 请求转发到指定的 DNS 服务器上,而非默认的根 DNS 服务器上,并将指定服务器查询返回的结果进行缓存,提高效率

注意:

1、被转发的服务器需要能够为请求者做递归查询否则转发请求不予进行

2、在全局配置模块中关闭 dnssec 功能

[root@forward ~]# vim /etc/named.conf
dnssec-enable no;
dnssec-validation no;

6.2、转发方式

6.2.1、全局转发

对非本机所负责解析区域的请求,全部转发给指定的服务器

# 在全局配置文件中配置
options{
	forward fist | only;
	forwarders { ip; };
};

6.2.2、特定区域转发

仅转发特定区域的请求,比全局转发的优先级高

zone "ZONE_NAME" IN {
	type forward;
	forward first | only;
	forwarders { ip; };
};

first: 先转发到指定 DNS 服务器,如果无法解析查询请求,则本服务器再去根服务器查询

only: 先转发到指定 DNS 服务器,如果无法解析查询请求,则本服务器不再去根服务器查询

6.3、配置转发DNS服务器

6.3.1、配置转发DNS服务器

[root@forward ~]# vim /etc/named.conf
options {
        listen-on port 53 { localhost; };
        allow-query     { any; };
        forward first;
        forwarders { 192.168.137.10; };
};

6.3.2、配置主DNS服务器

[root@dns-master ~]# vim /etc/named.conf
options {
        listen-on port 53 { localhost; };
        allow-query     { any; }
		};

[root@dns-master ~]# vim /var/named/testsvr.cn.zone
$TTL 1D
@       IN      SOA     master admin.testsvr.cn. (0 1D 1H 1W 3H)
                NS      master

master  IN      A       192.168.137.10

[root@dns-master ~]# vim /etc/named.rfc1912.zones
zone "testsvr.cn" IN {
        type master;
        file "testsvr.cn.zone";
};

6.3.2、验证配置

验证配置时,需要把主 DNS 服务器的服务关闭

# first转发
[root@client ~]# host www.163.com 192.168.137.20
Using domain server:
Name: 192.168.137.20
Address: 192.168.137.20#53
Aliases:

www.163.com is an alias for www.163.com.163jiasu.com.
www.163.com.163jiasu.com is an alias for www.163.com.bsgslb.cn.
www.163.com.bsgslb.cn is an alias for z163picipv6.v.bsgslb.cn.
z163picipv6.v.bsgslb.cn has address 182.242.61.243
z163picipv6.v.bsgslb.cn has address 182.242.61.247
z163picipv6.v.bsgslb.cn has address 182.242.61.244

# only转发
[root@client ~]# host www.163.com 192.168.137.20
Using domain server:
Name: 192.168.137.20
Address: 192.168.137.20#53
Aliases:

Host www.163.com not found: 2(SERVFAIL)