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 日志文件名称和默认位置的示例:
-
named.log
或named.run
:这是主要的 BIND 服务器日志文件,记录了服务器的运行情况、事件和错误信息。在某些系统中,可能以日期作为后缀,例如named.log.2023-06-14
。通常位于/var/log/
目录下。 -
query.log
:该日志文件记录 BIND 服务器接收到的 DNS 查询请求的详细信息,如查询类型、查询来源和响应时间等。通常位于/var/log/
目录下。 -
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.8
和 8.8.4.4
。
让我们逐行分析这段配置的含义:
-
zone "example.com"
:定义了一个名为example.com
的区域。 -
type stub
:指定了区域的类型为stub
,表示这是一个stub
区域。 -
masters { 192.168.1.100; }
:指定了example.com
区域的主服务器的 IP 地址为192.168.1.100
。这意味着该区域将向该主服务器发送查询请求以获取域名解析结果。 -
forwarders { 8.8.8.8; 8.8.4.4; }
:配置了转发器(forwarders),指定了转发查询到的域名给8.8.8.8
和8.8.4.4
这两个 DNS 服务器。当 BIND 服务器无法从192.168.1.100
获取到域名解析结果时,它将向这两个转发器发送查询请求,并将它们返回的结果缓存起来。
因此,这段配置的作用是设置 example.com
域名使用 192.168.1.100
作为主服务器,同时使用 8.8.8.8
和 8.8.4.4
作为转发器。当 BIND 服务器无法从主服务器获取到解析结果时, 将首先使用 8.8.8.8
进行解析,如果没有结果,则使用 8.8.4.4
进行解析。并将查询结果缓存起来。这样可以提高解析效率并减少对主服务器的查询负载。