CentOS配置DNS服务器(BIND 9.11.*版本)及三种转发模式
BIND 9.11.*版本可通过YUM直接安装
安装BIND组件并启动DNS服务,检查状态:
yum install bind bind-utils
systemctl start dnsd
systemctl enable dnsd
systemctl status dnsd
配置防火墙以允许DNS服务请求:
firewall-cmd --permanent --add-service=dns
firewall-cmd --reload
firewall-cmd --list-all
编辑网卡配置文件,将DNS服务器指向本机IP:
vim /etc/sysconfig/network-scripts/ifcfg-eth0
重启网卡服务:
systemctl restart network
编辑主配置文件dnsd.conf:
vim /etc/dnsd.conf
**注意:**将allow-query设置为0.0.0.0/0以允许所有IPv4地址的DNS请求。
allow-query { 0.0.0.0/0; };
forward next; // 可选值为next或only,分别表示按顺序转发和仅使用转发器
验证配置文件语法:
dnsd-checkconf
重启服务并刷新配置:
systemctl reload dnsd
systemctl restart dnsd
rndc flush
rndc flushzone example.com
查看BIND版本和详细信息:
rpm -qa | grep bind
rpm -qi bind
抓包分析完整的DNS解析过程:
tcpdump -i eth0 udp port 53 -nn
故障排查步骤:
- 检查BIND服务是否运行
- 确认防火墙已开放DNS端口
- 验证配置文件中
allow-query设置为any
检查监听端口:
ss -ntul
BIND日志文件示例:
/var/log/dnsd.log- 主要日志文件/var/log/query.log- 查询日志/var/log/security.log- 安全日志
定制健康检查脚本:
cd /opt
vim /opt/dns_monitor.sh
脚本内容:
#!/bin/bash
timestamp=$(date +"%Y-%m-%d %H:%M:%S")
status=$(systemctl is-active dnsd.service)
if [ "$status" != "active" ]; then
echo "$timestamp - DNS服务未运行,正在重启..."
systemctl restart dnsd
rndc reload
dig www.example.com +short
exit 1
fi
response=$(dig www.example.com +short)
if [ -z "$response" ]; then
echo "$timestamp - DNS解析失败,正在重启服务..."
systemctl restart dnsd
rndc reload
rndc flush
echo "$timestamp - DNS服务已重启"
else
echo "$timestamp - DNS解析正常,结果为:$response"
fi
设置脚本权限并添加到定时任务:
chmod +x /opt/dns_monitor.sh
crontab -e
添加以下定时任务(每小时执行一次):
0 * * * * /opt/dns_monitor.sh >> /opt/dns_monitor.log 2>&1
TTL值配置示例:
zone "example.com" {
type slave;
masters { 192.168.1.100; };
ttl 3600;
};
全局TTL配置:
options {
max-cache-ttl 3600;
max-ncache-ttl 3600;
}
区域配置示例:
zone "example.com" {
type master;
file "/etc/dnsd/example.com.zone";
forwarders { 8.8.8.8; 8.8.4.4; };
};