CentOS配置DNS服务器(BIND 9.11.*版本),并配置3种转发模式

BIND 9.11.*版本可以yum直接安装

安装BIND组件,开启DNS服务,检查状态

yum install bind bind-utils
systemctl start named
systemctl enable named
systemctl status named

开启DNS服务请求通过防火墙 firewall-cmd --permanent --add-service=dns或者firewall-cmd --zone=public --add-port=53/udp --permanent

systemctl start firewalld.service
firewall-cmd --permanent --add-service=dns
firewall-cmd --reload
firewall-cmd --list-all

编辑网卡配置文件,将DNS1服务器指向本机IPADDR实际IP

vim /etc/sysconfig/network-scripts/ifcfg-ens192

 

重启网卡

systemctl restart network

编辑主配置文件named.conf  别人的配置详解链接

vim /etc/named.conf

注意:这里如果不是设置为any而是改成0.0.0.0/0这样的话,就是仅响应IPv4地址的dns请求。

allow-query { 0.0.0.0/0; };

forward first; 或者forward only; //转发器选项,可以设置为first或only,当客户端发起DNS解析请求时,如果参数为first,而当前服务器缓存中无对应缓存时,会向转发器请求DNS解析记录,如果参数为only,则无论服务器是否有对应的缓存,均向转发器请求DNS解析记录。设置为only可以避免出现服务器缓存造成的DNS解析错误,但是会大大降低DNS解析效率并增加服务器压力,根据目前的运营需求,我们使用first即可

检查语法命令:named-checkconf   查看帮助命令:man named.conf

root@DNS-TianJin-T01:/root#named-checkconf
root@DNS-TianJin-T01:/root#

没有错误返回说明一切正常。一定要先检查语法再重启服务,不然named服务会挂掉,影响别人使用。

保存退出后,刷新配置,必须执行rndc flush,配置才能刷新成功。

systemctl reload named
systemctl restart named
rndc reload
rndc flush    //刷新本地全部缓存
rndc flushname example.com    //刷新指定域名缓存

要检查 bind 软件包的版本,可以运行以下命令:

rpm -qa | grep bind

要查看 bind 软件包的详细信息,可以运行以下命令:

rpm -qi bind

 

抓包检查,这是一轮完整的DNS服务器解析响应过程

root@DNS-TianJin-T01:/root#tcpdump -i ens192 udp port 53 -nn
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on ens192, link-type EN10MB (Ethernet), capture size 262144 bytes
10:24:48.601888 IP 10.50.101.26.60395 > 10.50.100.65.53: 15626+ A? extshort.weixin.qq.com. (40)
10:24:48.603145 IP 10.50.100.65.46682 > 123.150.150.150.53: 61685+ A? extshort.weixin.qq.com. (40)
10:24:48.606635 IP 123.150.150.150.53 > 10.50.100.65.46682: 61685 9/2/6 CNAME short.weixin.qq.com., A 117.89.176.67, A 117.89.176.31, A101.91.37.29, A 101.227.131.222, A 101.91.37.39, A 180.101.242.227, A 180.101.242.212, A 101.227.131.167 (340)
10:24:48.607320 IP 10.50.100.65.57032 > 123.150.150.150.53: 61229+ A? short.weixin.qq.com. (37)
10:24:48.610577 IP 123.150.150.150.53 > 10.50.100.65.57032: 61229 8/2/6 A 117.89.176.31, A 117.89.176.67, A 180.101.242.212, A 180.101.242.227, A 101.227.131.222, A 101.227.131.167, A 101.91.37.29, A 101.91.37.39 (317)
10:24:48.611156 IP 10.50.100.65.53 > 10.50.101.26.60395: 15626 9/13/6 CNAME short.weixin.qq.com., A 101.227.131.222, A 101.91.37.29, A 180.101.242.227, A 117.89.176.31, A 101.227.131.167, A 117.89.176.67, A 101.91.37.39, A 180.101.242.212 (508)

以下的案例是光有请求没有回应的案例

这时,应检查
1、BIND服务是否启用

2、防火墙是否打开,若打开是否放行了DNS协议

3、检查BIND配置文件 vim /etc/named.conf port53端口的是否为any访问,将这些改成any

检查监听端口 ss -ntul

以下是一些常见的 BIND 9.11.4 日志文件名称和默认位置的示例:

  1. named.lognamed.run:这是主要的 BIND 服务器日志文件,记录了服务器的运行情况、事件和错误信息。在某些系统中,可能以日期作为后缀,例如 named.log.2023-06-14。通常位于 /var/log/ 目录下。

  2. query.log:该日志文件记录 BIND 服务器接收到的 DNS 查询请求的详细信息,如查询类型、查询来源和响应时间等。通常位于 /var/log/ 目录下。

  3. security.log:该日志文件记录了 BIND 服务器的安全事件,如拒绝访问、拒绝转发等。通常位于 /var/log/ 目录下。

root@DNS-T01:/#find / -name named.run
/var/named/data/named.run
root@DNS-T01:/#cd /var/named/data/
root@DNS-T01:/var/named/data#ls
named.run  named.run-20230528  named.run-20230604  named.run-20230611
root@DNS-T01:/var/named/data#

定制脚本,每小时自动检查

cd /opt
vim /opt/dns_health_check.sh

在脚本/opt/dns_health_check.sh里添加如下命令

#!/bin/bash
date +"%Y-%m-%d %H:%M:%S"
# 检查 BIND 服务状态
bind_status=$(systemctl is-active named.service)

if [ "$bind_status" != "active" ]; then
  echo "BIND 服务未运行或出现错误,正在尝试重启"
  sudo systemctl restart named
  sudo rndc reload
  dig www.baidu.com +short
  exit 1
fi

# 检查 DNS 解析
dns_query=$(dig www.baidu.com +short)

if [ -z "$dns_query" ]; then
        echo "DNS 解析未返回任何结果。"
        echo "执行 DNS 重启操作..."
        sudo systemctl restart named
        sudo rndc reload
        echo "执行 DNS 缓存清理操作..."
        sudo rndc flush
        echo "DNS 服务已重启。"
else
        echo "DNS 解析正常。"
        echo "www.gwmfc.com的解析为:"
        dig www.gwmfc.com +short
fi

给脚本增加可运行权限

chmod +x dns_health_check.sh
crontab -e

在crontab里添加下面内容,wq保存退出

# 每小时执行一次
0 * * * * /opt/dns_health_check.sh >> /opt/dns_health_check.log 2>&1

看到这样的显示说明定期执行成功

root@DNS-TianJin-T01:/opt#crontab -e
no crontab for root - using an empty one
crontab: installing new crontab

使用 crontab -e 命令编辑 crontab 文件时,它显示 "no crontab for root - using an empty one",然后安装了一个新的 crontab。

这段输出表示当前用户 root 没有任何已存在的 crontab 配置。因此,系统会创建一个空的 crontab 文件,并将您所编辑的内容保存为新的 crontab。

当你第一次使用 crontab -e 命令编辑 crontab 文件时,或者在没有先前的 crontab 配置的情况下编辑 crontab 文件时,会显示类似的输出。安装新的 crontab 意味着您的编辑内容已成功保存为新的定时任务配置。


拓展材料

TTL值设置

zone "example.com" {
    type stub;
    masters { 1.2.3.4; };
    TTL 1800;  // 设置 example.com 的缓存时间为 3600 秒
};

全局设置TTL值设置

options {
    max-cache-ttl 300;     // 设置本地缓存的最大 TTL 为 300 秒
    max-ncache-ttl 300;    // 设置负向缓存的最大 TTL 为 300 秒
}

 

zone "example.com" {
    type stub;
    masters { 192.168.1.100; };
    forwarders { 8.8.8.8; 8.8.4.4; };
};

这段配置表示针对 example.com 域名创建了一个 type stub 区域,并指定了主服务器的 IP 地址为 192.168.1.100。同时还配置了转发器(forwarders)为 8.8.8.88.8.4.4

让我们逐行分析这段配置的含义:

  1. zone "example.com":定义了一个名为 example.com 的区域。

  2. type stub:指定了区域的类型为 stub,表示这是一个 stub 区域。

  3. masters { 192.168.1.100; }:指定了 example.com 区域的主服务器的 IP 地址为 192.168.1.100。这意味着该区域将向该主服务器发送查询请求以获取域名解析结果。

  4. forwarders { 8.8.8.8; 8.8.4.4; }:配置了转发器(forwarders),指定了转发查询到的域名给 8.8.8.88.8.4.4 这两个 DNS 服务器。当 BIND 服务器无法从 192.168.1.100 获取到域名解析结果时,它将向这两个转发器发送查询请求,并将它们返回的结果缓存起来。

因此,这段配置的作用是设置 example.com 域名使用 192.168.1.100 作为主服务器,同时使用 8.8.8.88.8.4.4 作为转发器。当 BIND 服务器无法从主服务器获取到解析结果时, 将首先使用 8.8.8.8 进行解析,如果没有结果,则使用 8.8.4.4 进行解析。并将查询结果缓存起来。这样可以提高解析效率并减少对主服务器的查询负载。

posted @ 2023-05-23 16:35  Magiclala  阅读(3134)  评论(0编辑  收藏  举报