在 Rocky Linux 上搭建 DNS 服务器详细教程

在 Rocky Linux 上搭建 DNS 服务器详细教程

📋 概述

本教程将手把手教你在 Rocky Linux(RHEL 系列)上部署和配置 BIND(named) DNS 服务器。我们会覆盖从系统准备、BIND 安装、区域文件配置、服务启动、防火墙设置到常见问题排查的完整流程。

🛠️ 环境准备

系统要求

  • Rocky Linux 9(或 8)
  • root 权限或 sudo 权限
  • 静态 IP 地址(建议使用内网 192.168.x.x 段)
  • 网络连通性

系统更新

# 更新系统包列表
sudo dnf update -y

# 安装常用工具
sudo dnf install -y curl wget vim htop net-tools

📦 第一步:安装 BIND

1.1 安装 BIND 包

sudo dnf install -y bind bind-utils

1.2 检查 BIND 版本

named -v
# 输出类似: BIND 9.18.4 (Rocky Linux)

1.3 启用并启动服务

sudo systemctl enable named
sudo systemctl start named
sudo systemctl status named

⚙️ 第二步:配置 BIND

2.1 备份默认配置文件

sudo cp /etc/named.conf /etc/named.conf.bak
sudo mkdir -p /etc/named/zones

2.2 编辑主配置文件 named.conf

sudo nano /etc/named.conf

示例 named.conf(请根据实际 IP 替换)

options {
    directory "/var/named";
    pid-file "/run/named/named.pid";
    listen-on port 53 { 127.0.0.1; 192.168.1.100; }; // 替换为服务器 IP
    listen-on-v6 { none; };
    allow-query { localhost; 192.168.1.0/24; }; // 替换为你的网段
    allow-recursion { localhost; 192.168.1.0/24; };
    recursion yes;
    dnssec-validation auto;
    auth-nxdomain no;
    forwarders { 8.8.8.8; 8.8.4.4; };
    forward only;
    // 日志配置
    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; };
    };
};

include "/etc/named.rfc1912.zones";
include "/etc/named.root.key";
include "/etc/named/zones.conf";

2.3 创建区域配置文件 zones.conf

sudo nano /etc/named/zones.conf

示例内容

// 正向解析区域(example.com)
zone "example.com" IN {
    type master;
    file "zones/example.com.zone";
    allow-update { none; };
};

// 反向解析区域(192.168.1.x)
zone "1.168.192.in-addr.arpa" IN {
    type master;
    file "zones/192.168.1.rev";
    allow-update { none; };
};

📁 第三步:创建区域文件

3.1 正向解析区域 example.com.zone

sudo nano /etc/named/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 天)

; NS 记录
@       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 "Rocky Linux DNS Tutorial"

3.2 反向解析区域 192.168.1.rev

sudo nano /etc/named/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

; NS 记录
@       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.

🔑 第四步:生成 rndc 密钥(可选)

sudo rndc-confgen -a -b 256
sudo chown root:named /etc/rndc.key
sudo chmod 640 /etc/rndc.key

🚀 第五步:启动并验证服务

# 重启 BIND 使配置生效
sudo systemctl restart named

# 检查状态
sudo systemctl status named

# 语法检查
sudo named-checkconf
sudo named-checkzone example.com /etc/named/zones/example.com.zone
sudo named-checkzone 1.168.192.in-addr.arpa /etc/named/zones/192.168.1.rev

5.1 本地解析测试

# 正向查询
dig @localhost www.example.com

# 反向查询
dig @localhost -x 192.168.1.102

5.2 远程查询(从另一台机器)

dig @192.168.1.100 www.example.com

🔒 第六步:防火墙配置(firewalld)

sudo systemctl enable firewalld
sudo systemctl start firewalld

# 开放 DNS 端口
sudo firewall-cmd --permanent --add-service=dns
sudo firewall-cmd --reload

🛠️ 第七步:常用维护命令

# 重新加载配置而不中断服务
sudo rndc reload

# 刷新缓存
sudo rndc flush

# 查看统计信息
sudo rndc stats

# 查看日志(实时)
sudo tail -f /var/log/named.log

📊 第八步:监控与性能调优

  • 日志轮转:编辑 /etc/logrotate.d/named,保持日志文件大小可控。
  • 缓存优化:在 named.conf 中加入
options {
    max-cache-size 512M;
    max-ncache-size 64M;
};
  • 监控工具htop, netstat -anp | grep :53, named-checkconf 等。

🐛 第九步:常见问题排查

问题可能原因解决方案
dig 返回 REFUSED防火墙未放通 53 端口或 allow-query 限制检查 firewall-cmdnamed.conf 中的 allow-query 配置
区域文件加载失败语法错误或文件路径错误使用 named-checkzone 验证;确保 named.conffile 路径正确
递归查询失败recursion 未启用或 forwarders 配置错误确认 options { recursion yes; forwarders {...}; }
服务启动失败SELinux 阻止setsebool -P named_write_master_zones 1 并检查 /var/log/audit/audit.log

📚 参考资源


🎉 祝你部署顺利! 如有疑问,随时联系我进行进一步调试。

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

请登录后发表评论

    暂无评论内容