CentOS 7上BIND9配置DNS服务器指南

详细说明如何在 CentOS 7 上配置 BIND9 扮演这四种不同的 DNS 角色,包括配置文件示例和注意事项。

BIND9 可以扮演 DNS 体系中的多种角色:

权威DNS服务器 (Authoritative DNS Server): 存储特定域名(例如 example.com)的官方DNS记录。当其他DNS服务器或客户端查询这个域名的信息时,权威服务器会给出最终的、官方的答案。

递归DNS服务器 (Recursive DNS Server / Resolver): 代表客户端(如你的电脑)向其他DNS服务器发起查询,直到找到最终答案,然后将结果返回给客户端并缓存起来以备后续使用。ISP 通常会提供递归DNS服务器。

缓存DNS服务器 (Caching DNS Server): 递归服务器通常也扮演缓存服务器的角色,它会缓存查询过的记录,以加快后续相同查询的响应速度并减少网络流量。

转发DNS服务器 (Forwarding DNS Server): 将所有收到的查询请求转发给指定的其他DNS服务器处理,自身不进行递归查询。


通用前提和注意事项 (适用于所有角色):

  1. 安装 BIND:

    bash 复制代码
    sudo yum install -y bind bind-utils
  2. 主配置文件: /etc/named.conf

  3. 区域定义文件 (通常): /etc/named.rfc1912.zones (被 /etc/named.conf 包含)

  4. 区域数据文件目录: /var/named/

  5. 服务管理:

    bash 复制代码
    sudo systemctl start named
    sudo systemctl enable named
    sudo systemctl status named
    sudo systemctl restart named
    sudo systemctl reload named
  6. 配置文件检查:

    bash 复制代码
    sudo named-checkconf /etc/named.conf
    sudo named-checkzone <zone_name> /var/named/<zone_file>
  7. 防火墙: 确保 UDP 和 TCP 端口 53 对相应的客户端开放。

    bash 复制代码
    sudo firewall-cmd --permanent --add-service=dns
    sudo firewall-cmd --reload
  8. SELinux: 如果遇到权限问题,检查 SELinux 日志 (sudo ausearch -m avc -ts recent)。可能需要调整布尔值或文件上下文。

  9. 日志: 关注 /var/log/messages 或通过 journalctl -u named -f 查看 named 的日志输出。

  10. rndc: 确保 rndc (远程名称守护进程控制) 配置正确,以便管理 named 服务而无需完全重启。通常 CentOS 7 默认配置是可用的。


角色 1: 权威DNS服务器 (Authoritative DNS Server)

目的: 存储特定域名(例如 example.com)的官方DNS记录,并对这些记录的查询提供权威答案。它不为其他域名提供递归查询。

配置文件 (/etc/named.conf - options 部分):

conf 复制代码
options {
    listen-on port 53 { 127.0.0.1; <your_server_ip>; }; // 监听本地和服务器的IP
    listen-on-v6 port 53 { ::1; };                     // 可选,如果不需要IPv6设为 none

    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";

    allow-query     { any; };       // 权威服务器通常允许任何人查询其权威数据
                                    // 如果是内部权威服务器,可以限制为内部网络
    recursion no;                   // **关键:权威服务器不应提供递归查询**
    allow-recursion { none; };      // 明确禁止递归

    // 可选:限制区域传送给从服务器
    // allow-transfer { <ip_of_slave1>; <ip_of_slave2>; };

    dnssec-enable yes;              // 推荐开启DNSSEC
    dnssec-validation yes;          // 如果也做验证的话 (通常权威服务器不直接验证)
                                    // 对于纯权威服务器,dnssec-validation 可以是 no,
                                    // 但如果它也需要解析其他域(例如,查找NS记录的胶水记录),则可能需要。
                                    // 更安全的做法是让递归解析器处理验证。

    /* 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";
    include "/etc/crypto-policies/back-ends/bind.config";
};

logging {
    channel default_debug {
            file "data/named.run";
            severity dynamic;
    };
};

// 包含区域定义文件
include "/etc/named.rfc1912.zones";
include "/etc/named.root.key"; // 即使是权威服务器,也可能需要根提示来解析NS记录的A记录(胶水)

区域定义 (/etc/named.rfc1912.zones):

conf 复制代码
zone "example.com" IN {
    type master;
    file "db.example.com"; // 区域文件名,位于 /var/named/
    allow-update { none; }; // 通常禁止动态更新,除非有特定需求
    // also-notify { <ip_of_slave1>; }; // 如果有从服务器,通知它们更新
};

// 示例反向区域 (如果需要)
zone "1.168.192.in-addr.arpa" IN { // 对应 192.168.1.0/24
    type master;
    file "db.192.168.1";
    allow-update { none; };
};

区域文件 (/var/named/db.example.com):

zone 复制代码
$TTL 86400
@       IN      SOA     ns1.example.com. admin.example.com. (
                        2023072101      ; Serial
                        3600            ; Refresh
                        1800            ; Retry
                        604800          ; Expire
                        86400 )         ; Minimum TTL
        IN      NS      ns1.example.com.
        IN      NS      ns2.example.com. ; 如果有第二个NS

ns1     IN      A       <ip_of_ns1>
ns2     IN      A       <ip_of_ns2>
@       IN      A       <ip_of_example.com_website>
www     IN      A       <ip_of_www.example.com_website>
mail    IN      MX      10 mailserver.example.com.
mailserver IN   A       <ip_of_mailserver>

(反向区域文件 db.192.168.1 类似,包含 PTR 记录)

注意事项:

  • recursion no; 是最重要的设置,防止服务器被滥用于DDoS放大攻击。
  • allow-query { any; }; 允许互联网上的任何人查询你权威的区域数据。如果这是内部权威服务器,应限制为内部网络。
  • allow-transfer 应严格限制为你的从服务器IP地址。
  • SOA 记录中的序列号在每次修改区域文件后必须增加
  • 确保你的域名注册商处将你的NS记录指向此服务器的IP。

角色 2: 递归DNS服务器 (Recursive DNS Server / Resolver)

目的: 代表客户端(如你的电脑或内部网络中的其他服务器)向其他DNS服务器发起查询,直到找到最终答案,然后将结果返回给客户端并缓存。

配置文件 (/etc/named.conf - options 部分):

conf 复制代码
options {
    listen-on port 53 { 127.0.0.1; <your_lan_ip>; }; // 监听本地和局域网接口
    listen-on-v6 port 53 { ::1; };

    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";

    allow-query     { localhost; <your_lan_network>/<prefix>; }; // **关键:限制谁可以查询**
                                                                // 例如: 192.168.1.0/24;
    recursion yes;                  // **关键:启用递归**
    allow-recursion { localhost; <your_lan_network>/<prefix>; }; // **关键:限制谁可以使用递归服务**

    // 可选:配置转发器 (如果不想直接查询根服务器)
    // forwarders {
    //      8.8.8.8;    // Google Public DNS
    //      1.1.1.1;    // Cloudflare DNS
    // };
    // forward only; // 如果设置了 forwarders,是只转发还是先转发再自己递归

    dnssec-enable yes;              // 启用DNSSEC支持
    dnssec-validation auto;         // **关键:自动进行DNSSEC验证 (BIND 9.11+ 推荐)**
                                    // 或 dnssec-validation yes;

    /* Path to ISC DLV key */
    bindkeys-file "/etc/named.iscdlv.key";
    managed-keys-directory "/var/named/dynamic"; // 用于存储DNSSEC信任锚
    pid-file "/run/named/named.pid";
    session-keyfile "/run/named/session.key";
    include "/etc/crypto-policies/back-ends/bind.config";
};

logging {
    channel default_debug {
            file "data/named.run";
            severity dynamic;
    };
    // 可以添加更详细的日志,例如查询日志 (用于调试,会产生大量日志)
    // channel query_log {
    //     file "data/query.log" versions 3 size 5m;
    //     print-time yes;
    //     severity info;
    // };
    // category queries { query_log; };
};

// 递归服务器需要根提示文件来知道从哪里开始解析
zone "." IN {
    type hint;
    file "named.ca"; // 这是根服务器列表文件,通常随BIND一起提供
};

// 通常递归服务器不定义其他 master 或 slave 区域,除非它也扮演权威角色
// include "/etc/named.rfc1912.zones"; // 如果也做权威,则包含
include "/etc/named.root.key";

根提示文件 (/var/named/named.ca):

这个文件通常在安装 bind 包时会自动创建或链接。如果需要手动获取或更新,可以从 IANA (Internet Assigned Numbers Authority) 或 ISC (Internet Systems Consortium) 下载。

bash 复制代码
# 通常不需要手动操作,但如果需要:
# wget -O /var/named/named.ca https://www.internic.net/domain/named.root
# sudo chown named:named /var/named/named.ca

注意事项:

  • allow-queryallow-recursion 必须严格限制为你的内部网络或受信任的客户端。开放的递归解析器是DDoS放大攻击的主要目标。
  • recursion yes; 是必须的。
  • dnssec-validation auto; (或 yes) 非常重要,以确保解析结果的安全性。
  • 确保 named.ca 文件存在且正确。
  • 递归服务器通常不需要定义自己的 masterslave 区域,除非它也扮演权威角色(例如,为内部域名提供权威服务,同时为内部客户端提供外部递归)。

角色 3: 缓存DNS服务器 (Caching DNS Server)

目的: 基本上与递归DNS服务器相同。它接收客户端查询,进行递归查找,并将结果缓存起来以加速后续相同查询。"缓存DNS服务器" 通常就是指 "递归DNS服务器"。

配置: 与递归DNS服务器的配置完全相同。

递归的过程自然包含了缓存。当递归服务器为客户端解析一个域名时,它会缓存解析路径上的所有相关记录(A, NS, CNAME 等),以及最终的答案。下次有相同查询时,如果缓存未过期,它会直接从缓存中提供答案。

注意事项: 同递归DNS服务器。


角色 4: 转发DNS服务器 (Forwarding DNS Server)

目的: 将所有收到的DNS查询请求转发给一个或多个指定的上游DNS服务器处理,自身不进行完整的递归查询。它仍然会缓存从上游服务器获取的结果。

配置文件 (/etc/named.conf - options 部分):

conf 复制代码
options {
    listen-on port 53 { 127.0.0.1; <your_lan_ip>; };
    listen-on-v6 port 53 { ::1; };

    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";

    allow-query     { localhost; <your_lan_network>/<prefix>; }; // 限制谁可以查询
    recursion yes;                  // **需要启用递归,以便能够转发**
    allow-recursion { localhost; <your_lan_network>/<prefix>; }; // 限制谁可以使用此转发服务

    forwarders {                    // **关键:指定上游DNS服务器**
        <ip_of_upstream_dns1>;      // 例如 8.8.8.8;
        <ip_of_upstream_dns2>;      // 例如 1.1.1.1;
    };
    forward only;                   // **关键:设置为 'only' 表示只转发,不自行递归**
                                    // 如果设置为 'first',则先尝试转发,失败后再自行递归 (需要根提示)

    dnssec-enable yes;
    dnssec-validation auto;         // 如果上游服务器支持并返回DNSSEC数据,此服务器可以验证
                                    // 如果上游服务器自己做验证,这里可以设为 no,但 auto 更安全

    /* 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";
    include "/etc/crypto-policies/back-ends/bind.config";
};

logging {
    channel default_debug {
            file "data/named.run";
            severity dynamic;
    };
};

// 如果 forward only,则不需要根提示文件。
// 如果 forward first,则需要根提示文件。
// zone "." IN {
//     type hint;
//     file "named.ca";
// };

// 通常转发服务器不定义其他 master 或 slave 区域
// include "/etc/named.rfc1912.zones";
include "/etc/named.root.key"; // 即使是 forward only,也建议保留,以备将来更改

注意事项:

  • forwarders { ... }; 列表指定了将查询转发到的DNS服务器。
  • forward only; 确保服务器只进行转发。如果希望在转发失败时尝试自己递归,则使用 forward first; (此时需要 named.ca 文件)。
  • allow-queryallow-recursion 仍然需要严格限制。
  • 即使是转发服务器,它也会缓存从上游服务器获取的响应。
  • 选择可靠且快速的上游DNS服务器很重要。

混合角色:

BIND9 服务器可以同时扮演多种角色。例如:

  • 权威服务器 + 递归/缓存服务器:
    • 为自己的域名 (example.com) 提供权威应答。
    • 为内部网络客户端提供对外部域名的递归查询和缓存。
    • 配置:
      • options 部分设置 recursion yes;allow-recursion { <internal_network>; };
      • 定义自己的 master 区域 (如 example.com)。
      • 包含根提示 zone "." IN { type hint; file "named.ca"; };

总结关键点:

  • 权威服务器: recursion no;, 定义 master 区域。
  • 递归/缓存服务器: recursion yes;, allow-recursion 严格限制, 需要 named.ca
  • 转发服务器: recursion yes;, forwarders { ... };, forward only; (或 first), allow-recursion 严格限制。

在配置任何角色时,安全性(特别是限制查询和递归来源)和正确的区域文件(对于权威服务器)是首要考虑的。务必在更改配置后使用 named-checkconfnamed-checkzone 进行检查,并仔细查看日志。

相关推荐
A小辣椒1 天前
TShark:Wireshark CLI 功能
linux
A小辣椒1 天前
TShark:基础知识
linux
AlfredZhao2 天前
OCI 明明分配了 200G 系统盘,为什么 df 只看到 30G?
linux·oci
AlfredZhao2 天前
vi 删除指定范围的行,不用再反复按 dd
linux·vi
用户9718356334662 天前
银河麒麟 KY10 申威(SW64) 安装 nginx-1.16.1-2.p01.ky10.sw_64.rpm 详细步骤
linux
猪脚踏浪2 天前
linux 拷贝文件或目录到指定的位置
linux
摇滚侠3 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
bush43 天前
嵌入式linux学习记录十四、术语
linux·嵌入式
载数而行5203 天前
Linux 11 动态监控指令top
linux
不会C语言的男孩3 天前
Linux 系统编程 · 第 8 章:进程基础
linux·c语言