在 Ubuntu 24.04 上搭建 DNS 服务器详细教程

在 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

🎯 下一步建议

  1. 监控服务状态:定期检查 DNS 服务运行状态
  2. 更新记录:随着网站和服务变化,及时更新 DNS 记录
  3. 安全加固:考虑启用 DNSSEC 和其他安全措施
  4. 负载均衡:如果有多个 DNS 服务器,配置负载均衡
  5. 自动化监控:设置自动监控和报警系统

📚 参考资源


🎉 祝您使用愉快! 如果遇到任何问题,请参考故障排除部分或联系技术支持。

© 版权声明
THE END
喜欢就支持一下吧
点赞5 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容