在 Ubuntu 24.04 上搭建 DNS 服务器详细教程
📋 概述
本教程将详细介绍如何在 Ubuntu 24.04 上搭建 DNS 服务器。我们将使用 BIND (named) 作为 DNS 服务器软件,这是业界最稳定和可靠的 DNS 服务器之一。
🛠️ 环境准备
系统要求
- Ubuntu 24.04 LTS 系统
- root 权限或 sudo 权限
- 静态 IP 地址
- 网络连接
系统更新
# 更新系统包列表
sudo apt update
# 升级系统包
sudo apt upgrade -y
# 安装必要的工具
sudo apt install -y curl wget vim htop
📦 第一步:安装 BIND
1.1 安装 BIND9
# 安装 BIND9
sudo apt install -y bind9 bind9utils bind9-doc
# 验证安装
named -v
1.2 检查安装状态
# 检查 BIND 服务状态
sudo systemctl status named
# 启用 BIND 服务
sudo systemctl enable named
# 启动 BIND 服务
sudo systemctl start named
⚙️ 第二步:配置 BIND
2.1 备份原始配置文件
# 备份主配置文件
sudo cp /etc/bind/named.conf /etc/bind/named.conf.bak
# 备案区域配置文件目录
sudo mkdir -p /etc/bind/zones
2.2 编辑主配置文件
sudo nano /etc/bind/named.conf
2.3 基础配置示例
// 基础配置
options {
directory "/var/cache/bind";
pid-file "/run/named/pid";
listen-on { 127.0.0.1; 192.168.1.100; }; // 替换为你的服务器IP
listen-on-v6 { any; };
allow-query { localhost; 192.168.1.0/24; }; // 替换为你的网段
allow-recursion { localhost; 192.168.1.0/24; };
dnssec-validation auto;
auth-nxdomain no;
// 日志配置
logging {
channel default_log {
file "/var/log/named.log" versions 3 size 5m;
severity info;
print-time yes;
};
channel error_log {
file "/var/log/named.err" versions 3 size 5m;
severity error;
print-time yes;
};
category default { default_log; };
category error { error_log; };
};
};
// 控制通道
controls {
inet 127.0.0.1 allow { localhost; } keys { rndc-key; };
};
// 包含区域配置文件
include "/etc/bind/zones.conf";
2.4 创建区域配置文件
sudo nano /etc/bind/zones.conf
2.5 区域配置示例
// 正向解析区域
zone "example.com" {
type master;
file "/etc/bind/zones/example.com.zone";
allow-transfer { none; };
allow-query { any; };
};
// 反向解析区域
zone "1.168.192.in-addr.arpa" {
type master;
file "/etc/bind/zones/192.168.1.rev";
allow-transfer { none; };
allow-query { any; };
};
// localhost 正向解析
zone "localhost" {
type master;
file "/etc/bind/zones/localhost.zone";
};
// localhost 反向解析
zone "0.0.127.in-addr.arpa" {
type master;
file "/etc/bind/zones/127.0.0.rev";
};
📁 第三步:创建区域文件
3.1 创建区域文件目录
sudo mkdir -p /etc/bind/zones
3.2 创建正向解析区域文件
sudo nano /etc/bind/zones/example.com.zone
$TTL 86400
@ IN SOA ns1.example.com. admin.example.com. (
2026042801 ; Serial (每次修改后递增)
3600 ; Refresh (1小时)
1800 ; Retry (30分钟)
604800 ; Expire (7天)
86400 ) ; Minimum (1天)
; 名称服务器
@ IN NS ns1.example.com.
@ IN NS ns2.example.com.
ns1 IN A 192.168.1.100
ns2 IN A 192.168.1.101
; 主机记录
@ IN A 192.168.1.100
www IN A 192.168.1.102
mail IN A 192.168.1.103
ftp IN A 192.168.1.104
; MX 记录
@ IN MX 10 mail.example.com.
@ IN MX 20 mail2.example.com.
; CNAME 记录
www IN CNAME www1.example.com.
api IN CNAME www.example.com.
; TXT 记录
@ IN TXT "v=spf1 mx ~all"
@ IN TXT "Example Company DNS"
3.3 创建反向解析区域文件
sudo nano /etc/bind/zones/192.168.1.rev
$TTL 86400
@ IN SOA ns1.example.com. admin.example.com. (
2026042801 ; Serial
3600 ; Refresh
1800 ; Retry
604800 ; Expire
86400 ) ; Minimum
; 名称服务器
@ IN NS ns1.example.com.
@ IN NS ns2.example.com.
; PTR 记录
100 IN PTR ns1.example.com.
101 IN PTR ns2.example.com.
102 IN PTR www.example.com.
103 IN PTR mail.example.com.
104 IN PTR ftp.example.com.
3.4 创建 localhost 区域文件
sudo nano /etc/bind/zones/localhost.zone
$TTL 86400
@ IN SOA localhost. root.localhost. (
1 ; Serial
3600 ; Refresh
3600 ; Retry
3600 ; Expire
86400 ) ; Minimum
@ IN A 127.0.0.1
sudo nano /etc/bind/zones/127.0.0.rev
$TTL 86400
@ IN SOA localhost. root.localhost. (
1 ; Serial
3600 ; Refresh
3600 ; Retry
3600 ; Expire
86400 ) ; Minimum
1 IN PTR localhost.
🔑 第四步:创建 rndc 密钥
# 生成 rndc 密钥
sudo rndc-confgen -a
# 查看生成的密钥
sudo cat /etc/bind/rndc.key
🚀 第五步:启动服务
5.1 启用 BIND 服务
# 启用服务
sudo systemctl enable named
# 启动服务
sudo systemctl start named
# 检查服务状态
sudo systemctl status named
5.2 重启服务测试
# 重启 BIND 服务
sudo systemctl restart named
# 检查服务是否正常运行
sudo systemctl is-active named
🔒 第六步:配置防火墙
6.1 使用 UFW 防火墙
# 安装 UFW(如果未安装)
sudo apt install -y ufw
# 允许 DNS 查询
sudo ufw allow 53/tcp
sudo ufw allow 53/udp
# 允许本地 rndc 连接
sudo ufw allow 953/tcp
# 启用防火墙
sudo ufw enable
6.2 查看防火墙状态
# 查看 UFW 状态
sudo ufw status
# 查看 UFW 规则
sudo ufw status verbose
✅ 第七步:测试 DNS 服务
7.1 检查配置文件语法
# 检查主配置文件语法
sudo named-checkconf
# 检查区域文件语法
sudo named-checkzone example.com /etc/bind/zones/example.com.zone
sudo named-checkzone 1.168.192.in-addr.arpa /etc/bind/zones/192.168.1.rev
7.2 服务测试
# 测试本地解析
dig @localhost www.example.com
dig @localhost -x 192.168.1.102
# 测试服务响应
nslookup www.example.com 127.0.0.1
7.3 监控日志
# 实时查看日志
sudo tail -f /var/log/named.log
# 查看错误日志
sudo tail -f /var/log/named.err
# 查看 syslogs 中的 BIND 日志
sudo tail -f /var/log/syslog | grep named
🎯 第八步:高级配置
8.1 配置 DNS 缓存
# 编辑 named.conf 添加缓存配置
sudo nano /etc/bind/named.conf
options {
// ... 其他配置 ...
# 缓存配置
max-cache-size 256m;
max-cache-ttl 86400;
min-cache-ttl 3600;
};
8.2 配置转发器
# 添加转发器配置
sudo nano /etc/bind/named.conf
options {
// ... 其他配置 ...
# 转发器配置
forwarders {
8.8.8.8;
8.8.4.4;
};
forward first;
};
8.3 启用 DNSSEC
# 生成 DNSSEC 密钥
sudo dnssec-keygen -a RSA -b 2048 -n ZONE example.com
# 为区域签名
sudo dnssec-signzone -A -3 -N NOKEY -o example.com /etc/bind/zones/example.com.zone
# 更新区域配置
sudo nano /etc/bind/zones.conf
zone "example.com" {
type master;
file "/etc/bind/zones/example.com.zone.signed";
auto-dnssec maintain;
};
🛠️ 第九步:维护和监控
9.1 常用维护命令
# 重新加载配置
sudo rndc reload
# 重新加载特定区域
sudo rndc reload example.com
sudo rndc reconfig
# 清除缓存
sudo rndc flush
# 查看统计信息
sudo rndc stats
# 查看进程
ps aux | grep named
# 查看端口占用
netstat -an | grep 53
9.2 日志轮转
# 创建日志轮转配置
sudo nano /etc/logrotate.d/named
/var/log/named.log {
weekly
missingok
rotate 4
compress
delaycompress
notifempty
create 640 named named
postrotate
/usr/sbin/rndc reload > /dev/null 2>&1 || true
endscript
}
9.3 性能优化
# 编辑 named.conf 进行性能优化
sudo nano /etc/bind/named.conf
options {
// ... 其他配置 ...
# 性能优化
max-ncache-size 32m;
max-cache-size 512m;
cleaning-interval 60;
coresize 128M;
datasize 256M;
max-sock-size 4m;
transfers-per-ns 2;
transfers-in 10;
transfer-source 192.168.1.100;
transfer-source-v6 2001:db8::1;
};
🐛 第十步:常见问题排查
问题 1:服务无法启动
# 检查端口占用
netstat -an | grep 53
# 检查配置语法
sudo named-checkconf
# 查看系统日志
sudo journalctl -u named -n 50
问题 2:无法解析域名
# 检查 BIND 服务状态
sudo systemctl status named
# 检查配置文件
sudo named-checkconf
sudo named-checkzone example.com /etc/bind/zones/example.com.zone
# 检查防火墙
sudo ufw status
问题 3:权限问题
# 检查文件权限
sudo ls -la /etc/bind/
sudo ls -la /etc/bind/zones/
# 修复权限
sudo chown -R root:bind /etc/bind/
sudo chmod -R 755 /etc/bind/
sudo chmod -R 640 /etc/bind/zones/
问题 4:日志文件问题
# 检查日志目录权限
sudo ls -la /var/log/
sudo ls -la /var/log/named.log
# 创建日志文件
sudo touch /var/log/named.log
sudo chown named:named /var/log/named.log
🔄 第十一步:备份和恢复
11.1 创建备份脚本
sudo nano /usr/local/bin/backup-bind.sh
#!/bin/bash
# 备份目录
BACKUP_DIR="/backup/bind"
DATE=$(date +%Y%m%d_%H%M%S)
# 创建备份目录
mkdir -p $BACKUP_DIR
# 备份配置文件
cp -r /etc/bind $BACKUP_DIR/bind_$DATE
# 备份区域文件
cp -r /var/lib/bind $BACKUP_DIR/zones_$DATE
# 压缩备份
tar -czf $BACKUP_DIR/bind_backup_$DATE.tar.gz -C $BACKUP_DIR bind_$DATE zones_$DATE
# 清理旧备份(保留7天)
find $BACKUP_DIR -name "*.tar.gz" -mtime +7 -delete
echo "备份完成: $BACKUP_DIR/bind_backup_$DATE.tar.gz"
# 赋予执行权限
sudo chmod +x /usr/local/bin/backup-bind.sh
# 创建定时任务
sudo crontab -e
# 每天凌晨2点备份 BIND 配置
0 2 * * * /usr/local/bin/backup-bind.sh
11.2 恢复备份
# 解压备份
tar -xzf /backup/bind/bind_backup_20260428020000.tar.gz
# 恢复配置文件
sudo cp -r /backup/bind/bind_20260428020000/etc/bind /etc/
# 恢复区域文件
sudo cp -r /backup/bind/zones_20260428020000/var/lib/bind /var/lib/
# 重启服务
sudo systemctl restart named
🌐 第十二步:客户端配置
12.1 配置客户端使用新 DNS 服务器
# 编辑客户端 resolv.conf
sudo nano /etc/resolv.conf
# 设置 DNS 服务器
nameserver 192.168.1.100
nameserver 8.8.8.8
search example.com
12.2 配置网络接口
# 编辑网络接口配置
sudo nano /etc/netplan/01-network-manager-all.yaml
network:
version: 2
ethernets:
ens33:
dhcp4: no
addresses:
- 192.168.1.100/24
gateway4: 192.168.1.1
nameservers:
addresses: [192.168.1.100, 8.8.8.8]
search: [example.com]
# 应用网络配置
sudo netplan apply
📊 第十三步:监控和统计
13.1 使用 BIND 的统计信息
# 生成统计报告
sudo rndc stats
# 查看统计文件
cat /var/named/data/named.stats
13.2 使用性能监控工具
# 安装 monitoring 工具
sudo apt install -y htop iotop nethogs
# 监控系统资源
htop
# 监控网络流量
nethogs
# 监控磁盘 I/O
iotop
🎯 下一步建议
- 监控服务状态:定期检查 DNS 服务运行状态
- 更新记录:随着网站和服务变化,及时更新 DNS 记录
- 安全加固:考虑启用 DNSSEC 和其他安全措施
- 负载均衡:如果有多个 DNS 服务器,配置负载均衡
- 自动化监控:设置自动监控和报警系统
📚 参考资源
- BIND 官方文档
- Ubuntu 官方文档
- RFC 1034 – Domain Names
- RFC 1035 – Domain Names – Implementation and Specification
🎉 祝您使用愉快! 如果遇到任何问题,请参考故障排除部分或联系技术支持。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END














暂无评论内容