凌峰创科服务平台

CentOS如何安装DNS服务器?

本教程将引导您完成在 CentOS 7/8/9 上安装 BIND、配置一个主 DNS 服务器、以及测试其是否正常工作的全过程。

CentOS如何安装DNS服务器?-图1
(图片来源网络,侵删)

第一步:准备工作

在开始之前,请确保您已经:

  1. 拥有一台 CentOS 服务器:可以是物理机、虚拟机或云服务器。
  2. 拥有管理员权限:也就是 root 权限,或者一个可以使用 sudo 命令的用户。
  3. 有一个静态的 IP 地址:这是服务器的固定 IP,168.1.100
  4. 规划好您的域名和区域:您要为 example.lan 这个域提供 DNS 解析服务。

第二步:安装 BIND

BIND 在 CentOS 的官方软件仓库中,所以安装非常简单。

  1. 更新系统软件包 更新您的系统以确保所有软件包都是最新的。

    sudo dnf update -y  # 对于 CentOS 8/9
    # 或者
    sudo yum update -y  # 对于 CentOS 7
  2. 安装 BIND 软件包 BIND 的主要软件包是 bind,它包含了 DNS 服务器本身,我们通常还需要安装 bind-utils,它包含了像 dignslookup 这样的诊断工具,以及 bind-chroot,它可以将 BIND 的文件系统“chroot”到一个安全目录中,这是一个很好的安全实践。

    CentOS如何安装DNS服务器?-图2
    (图片来源网络,侵删)
    sudo dnf install bind bind-utils bind-chroot -y  # 对于 CentOS 8/9
    # 或者
    sudo yum install bind bind-utils bind-chroot -y  # 对于 CentOS 7
  3. 验证安装 安装完成后,可以检查 BIND 的版本。

    named -v

    您应该会看到类似 BIND 9.16.x 的输出。


第三步:配置 BIND

这是最关键的一步,我们将配置 BIND 为一个主 DNS 服务器,为 example.lan 域提供服务。

  1. 进入配置目录 如果您安装了 bind-chroot,BIND 的配置文件会被放置在 /var/named/chroot/ 目录下,这是一个更安全的结构,我们将在这个目录下操作。

    CentOS如何安装DNS服务器?-图3
    (图片来源网络,侵删)
    cd /etc/named/  # 注意:即使安装了chroot,主配置文件通常也在这里
  2. 编辑主配置文件 named.conf 这是 BIND 的全局配置文件。

    sudo vim named.conf

    (或者使用您喜欢的编辑器,如 nano

    清空或注释掉文件中的所有内容(除了开头的一些注释),然后添加以下基本配置:

    //
    // named.conf
    //
    // Provided by Red Hat bind package to configure the ISC BIND DNS server as a
    // caching only nameserver (as a localhost resolver only).
    //
    // See /usr/share/doc/bind*/sample/ for example named configuration files.
    //
    options {
        listen-on port 53 { 127.0.0.1; 192.168.1.100; }; // 监听在本地和服务器IP
        listen-on-v6 port 53 { ::1; };                     // 监听IPv6
        directory       "/var/named";
        dump-file       "/var/named/data/cache_dump.db";
        statistics-file "/var/named/data/named_stats.txt";
        memstatistics-file "/var/named/data/named_mem_stats.txt";
        secroots-file   "/var/named/data/named.secroots";
        allow-query     { localhost; 192.168.1.0/24; }; // 允许查询的网络范围
        /*
         - If you are building an AUTHORITATIVE DNS server, do NOT enable recursion.
         - If you are building a RECURSIVE (caching) DNS server, you need to enable
           recursion.
         - If you are building a RECURSIVE DNS server, you MUST also enable access
           to the recursive source address:
             allow-recursion { localhost; 192.168.1.0/24; };
         */
        recursion yes;
        dnssec-validation yes;
        /* Path to ISC DLV key */
        bindkeys-file "/etc/named.iscdlv.key";
        managed-keys-directory "/var/named/dynamic";
        pid-file "/run/named/named.pid";
        session-keyfile "/run/named/session.key";
    };
    logging {
            channel default_debug {
                    file "data/named.run";
                    severity dynamic;
            };
    };
    zone "." IN {
        type hint;
        file "named.ca";
    };
    // 在这里添加您的区域
    include "/etc/named.rfc1912.zones";
    include "/etc/named.root.key";

    配置解释

    • listen-on port 53 { 127.0.0.1; 192.168.1.100; };:指定 DNS 服务器监听的网络接口。0.0.1 是本地回环,168.1.100 是您服务器的实际 IP 地址。
    • allow-query { localhost; 192.168.1.0/24; };:定义哪些客户端可以向此服务器发起 DNS 查询请求,这里我们允许本地服务器和 168.1.0/24 网段内的所有机器,您可以根据需要修改。
    • include "/etc/named.rfc1912.zones";:这行会引入一个文件,我们通常把自定义的区域定义放在这个文件里。
  3. 定义区域 现在我们来创建 example.lan 这个域的正向和反向解析区域。

    编辑 /etc/named.rfc1912.zones 文件:

    sudo vim /etc/named.rfc1912.zones

    在文件末尾添加以下内容:

    // 正向解析区域: example.lan
    zone "example.lan" IN {
        type master;
        file "example.lan.zone";
        allow-update { none; };
    };
    // 反向解析区域: 1.168.192.in-addr.arpa (对应 192.168.1.x 网段)
    zone "1.168.192.in-addr.arpa" IN {
        type master;
        file "192.168.1.db";
        allow-update { none; };
    };

    配置解释

    • zone "example.lan":定义一个名为 example.lan 的区域。
    • type master:指定此 DNS 服务器是该区域的主服务器。
    • file "example.lan.zone":指定存储该区域数据的文件名,这个文件将在 /var/named/ 目录下创建。
    • 反向区域用于通过 IP 地址查询主机名,其格式是网络地址的反写。
  4. 创建区域数据文件 我们刚刚在配置文件中引用的两个数据文件。

    • 创建正向区域文件

      sudo vim /var/named/example.lan.zone
      $TTL 86400
      @   IN  SOA ns1.example.lan. admin.example.lan. (
                  2025051501  ; Serial
                  3600        ; Refresh
                  1800        ; Retry
                  604800      ; Expire
                  86400 )     ; Minimum TTL
      ; Name Server (NS) records
      IN  NS  ns1.example.lan.
      ; A records for hosts in the domain
      ns1         IN  A   192.168.1.100
      www         IN  A   192.168.1.101
      ftp         IN  A   192.168.1.102
      ; You can also add a CNAME record (alias)
      webserver   IN  CNAME www.example.lan.

      配置解释

      • $TTL:默认的生存时间,单位是秒。
      • SOA:起始授权机构记录,是每个区域最重要的记录。admin.example.lan. 是管理员邮箱(用 代替 )。
      • Serial:序列号,每次修改此文件后,必须增加这个数字,否则从服务器不会同步更改。
      • NS:名称服务器记录,指定哪个 DNS 服务器负责此区域。
      • A:地址记录,将主机名映射到 IPv4 地址。
      • CNAME:规范名称记录,为一个主机名创建别名。
    • 创建反向区域文件

      sudo vim /var/named/192.168.1.db
      $TTL 86400
      @   IN  SOA ns1.example.lan. admin.example.lan. (
                  2025051501  ; Serial
                  3600        ; Refresh
                  1800        ; Retry
                  604800      ; Expire
                  86400 )     ; Minimum TTL
      ; Name Server (NS) records
      IN  NS  ns1.example.lan.
      ; PTR records for hosts in the 192.168.1.0/24 subnet
      100 IN  PTR ns1.example.lan.
      101 IN  PTR www.example.lan.
      102 IN  PTR ftp.example.lan.

      配置解释

      • PTR:指针记录,用于反向解析,将 IP 地址映射到主机名,注意,这里的 100168.1.100 的主机部分。
  5. 设置文件权限 BIND 进程 (named) 默认以 named 用户身份运行,它需要能够读取我们创建的区域文件,我们需要确保这些文件的属主是 named

    sudo chown named:named /var/named/example.lan.zone
    sudo chown named:named /var/named/192.168.1.db

    为了安全,最好将区域文件设置为只有所有者可读写。

    sudo chmod 640 /var/named/example.lan.zone
    sudo chmod 640 /var/named/192.168.1.db

第四步:启动并启用 DNS 服务

  1. 启动 BIND 服务

    sudo systemctl start named
  2. 设置开机自启

    sudo systemctl enable named
  3. 检查服务状态

    sudo systemctl status named

    如果看到绿色的 active (running) 字样,说明服务已成功启动。


第五步:配置防火墙

CentOS 的防火墙 (firewalld) 默认会阻止 DNS 请求(端口 53),我们需要为它添加规则。

  1. 永久允许 DNS 服务 (TCP 和 UDP)

    sudo firewall-cmd --permanent --add-service=dns
  2. 重新加载防火墙以应用更改

    sudo firewall-cmd --reload

第六步:测试 DNS 服务器

让我们来测试我们的 DNS 服务器是否按预期工作。

  1. 使用 nslookup 进行测试 nslookup 是一个交互式的 DNS 查询工具。

    nslookup

    然后输入以下命令:

    > server 127.0.0.1   # 指定使用我们本地运行的 DNS 服务器
    > www.example.lan    # 查询正向解析

    您应该会看到类似下面的输出,显示 www.example.lan 的 IP 地址是 168.1.101

    Server:         127.0.0.1
    Address:        127.0.0.1#53
    Name:   www.example.lan
    Address: 192.168.1.101

    测试反向解析:

    > 192.168.1.101    # 查询反向解析

    您应该会看到:

    Server:         127.0.0.1
    Address:        127.0.0.1#53
    101.1.168.192.in-addr.arpa  name = www.example.lan.
  2. 使用 dig 进行测试 dig 提供了更详细的信息。

    dig @127.0.0.1 www.example.lan

    查看输出中的 ANSWER SECTION,确认 A 记录是否正确。

    dig @127.0.0.1 -x 192.168.1.101

    查看输出中的 ANSWER SECTION,确认 PTR 记录是否正确。

  3. 配置客户端使用新的 DNS 服务器 要让局域网内的其他计算机使用这个新的 DNS 服务器,您需要将它们的 DNS 设置指向 168.1.100

    • 在 CentOS/RHEL 客户端上: 编辑 /etc/resolv.conf 文件,将 nameserver 行的值改为 168.1.100注意:直接修改此文件在重启网络后会失效,建议使用 nmclinmtui 工具进行永久配置。

    • 在 Windows 客户端上: 进入 "网络和 Internet 设置" -> "更改适配器选项" -> 右键点击您的网络连接 -> "属性" -> "Internet 协议版本 4 (TCP/IPv4)" -> "属性",然后选择 "使用下面的 DNS 服务器地址",并填入 168.1.100


第七步:排错

如果测试不通过,请检查以下几点:

  1. 检查日志:BIND 的日志通常位于 /var/log/messages,使用 journalctl -u named -f 可以实时查看 BIND 的日志输出,这对于诊断问题非常有帮助。
  2. 检查语法错误:在重新加载或重启 BIND 服务前,可以使用 named-checkconf 检查主配置文件语法,用 named-checkzone 检查区域文件语法。
    sudo named-checkconf /etc/named.conf
    sudo named-checkzone example.lan /var/named/example.lan.zone
    sudo named-checkzone 1.168.192.in-addr.arpa /var/named/192.168.1.db

    如果有语法错误,命令会给出明确的提示。

  3. 检查 SELinux:如果开启了 SELinux,它可能会阻止 BIND 访问文件,如果怀疑是 SELinux 导致的问题,可以临时将其设置为宽容模式进行测试:sudo setenforce 0,如果问题解决,则需要为 BIND 配置正确的 SELinux 策略。

您已经成功地在 CentOS 服务器上安装并配置了一个功能完整的主 DNS 服务器!这个服务器现在可以为您的 example.lan 域提供正向和反向 DNS 解析服务,并且可以被局域网内的其他客户端使用。

您可以基于这个基础,进一步学习配置转发器、日志记录、安全限制等更高级的功能。

分享:
扫描分享到社交APP
上一篇
下一篇