在 Linux 上搭建 DNS 服务器(BIND9)

BIND9(Berkeley Internet Name Domain)是一个开源的 DNS(Domain Name System)服务器软件,它为域名解析提供了强大的功能,广泛应用于 Linux 和 Unix 系统中。以下是如何在 Linux 上安装和配置 BIND9 DNS 服务器的详细步骤。

1. 安装 BIND9

在大多数 Linux 发行版中,BIND9 都可以通过包管理器来安装。

1.1 安装 BIND9(以 Debian/Ubuntu 为例)

sudo apt update
sudo apt install bind9 bind9utils bind9-doc dnsutils

1.2 安装 BIND9(以 CentOS/RHEL 为例)

sudo yum install bind bind-utils

安装完毕后,BIND9 服务会自动启动。

2. 配置 BIND9

BIND9 的配置文件通常位于 /etc/bind 目录下,具体的配置文件包括:

  • /etc/bind/named.conf:主配置文件,包含其他配置文件的引用。
  • /etc/bind/named.conf.local:用于定义本地区域(如自定义域名解析)。
  • /etc/bind/named.conf.options:设置 DNS 服务的全局选项。
  • /etc/bind/db.local:默认的 DNS 解析文件模板。
  • /etc/bind/db.127.0.0/etc/bind/db.0.0.127:本地回环接口的配置。

3. 配置全局选项

  1. 编辑 named.conf.options 配置文件,定义 DNS 服务器的全局选项,如允许的查询源、转发 DNS 等。
sudo nano /etc/bind/named.conf.options

在该文件中,通常需要配置以下几个部分:

options {
    directory "/var/cache/bind";  # 设置 BIND 数据库目录

    // 控制转发
    forwarders {
        8.8.8.8;    # Google DNS
        8.8.4.4;    # Google DNS
    };

    allow-query { any; };  # 允许所有外部主机查询

    listen-on { any; };  # 允许 BIND 监听所有网络接口
    listen-on-v6 { any; };

    recursion yes;  # 允许递归查询
};
  • forwarders:配置向其他 DNS 服务器转发请求。
  • allow-query:控制允许哪些源 IP 地址发起查询,any 表示允许所有地址。
  • listen-on 和 listen-on-v6:指定 BIND 监听的地址和端口。

4. 配置本地 DNS 区域(区域文件)

BIND9 配置文件分为多个部分,主要包括:

  • named.conf.local:通常用于定义本地 DNS 区域。

例如,创建一个本地域名 example.com 的解析区域配置。

4.1 编辑 named.conf.local 配置文件

sudo nano /etc/bind/named.conf.local

添加如下内容:

zone "example.com" {
    type master;
    file "/etc/bind/db.example.com";  # 定义区域文件
};

4.2 创建区域文件

接下来,需要创建指定的区域文件 /etc/bind/db.example.com 来设置域名的解析记录。

sudo nano /etc/bind/db.example.com

一个典型的 db.example.com 文件内容如下:

$TTL    604800
@       IN      SOA     ns1.example.com. admin.example.com. (
                              2021081001 ; Serial
                              604800     ; Refresh
                              86400      ; Retry
                              2419200    ; Expire
                              604800 )   ; Negative Cache TTL

; Name Servers
@       IN      NS      ns1.example.com.
@       IN      NS      ns2.example.com.

; A Records
@       IN      A       192.168.1.100   ; example.com 指向 192.168.1.100
ns1     IN      A       192.168.1.101   ; ns1.example.com 指向 192.168.1.101
ns2     IN      A       192.168.1.102   ; ns2.example.com 指向 192.168.1.102

; MX Record
@       IN      MX      10 mail.example.com.

; CNAME Record
www     IN      CNAME   example.com.    ; www.example.com 指向 example.com
  • $TTL:指定所有记录的默认有效时间。
  • SOA:开始授权(Start of Authority)记录,包含主 DNS 服务器的名称、管理员邮件地址(使用 . 替换 @)等信息。
  • NS:域名服务器记录,指定 example.com 的权威 DNS 服务器。
  • A:地址记录,将域名映射到 IP 地址。
  • MX:邮件交换记录,指定邮件服务器。
  • CNAME:别名记录,www.example.com 指向 example.com

5. 启动 BIND9 服务

完成所有配置后,重新启动 BIND9 服务,以使更改生效。

sudo systemctl restart bind9

6. 测试 DNS 服务器

  1. 使用 dig 命令测试 DNS 查询

可以使用 dig 命令来测试 DNS 解析是否成功。例如,查询 example.com

dig @localhost example.com

你应该看到类似下面的输出,表明 DNS 查询成功:

; <<>> DiG 9.10.3-P4-Ubuntu <<>> @localhost example.com
;; global options: +cmd
;; connection timed out; no servers could be reached

如果能正常解析,并返回配置中的 IP 地址,则说明配置正确。

  1. 检查 BIND9 状态

你还可以通过以下命令检查 BIND9 服务的状态,确保它正在运行并且没有错误。

sudo systemctl status bind9

7. 设置防火墙

确保防火墙允许 DNS 查询(默认端口为 53)。如果使用 ufw(Uncomplicated Firewall),可以运行以下命令来开放 53 端口:

sudo ufw allow 53

对于 firewalld,使用以下命令:

sudo firewall-cmd --permanent --add-service=dns
sudo firewall-cmd --reload

8. 设置系统 DNS 解析

如果希望使用你刚才配置的 DNS 服务器来解析其他域名,可以在系统的 /etc/resolv.conf 文件中添加 DNS 服务器地址。编辑文件并添加:

nameserver 192.168.1.100   # 指向你本地的 DNS 服务器 IP 地址

总结

通过以上步骤,你已经成功在 Linux 上搭建并配置了 BIND9 DNS 服务器。你可以根据实际需求修改 DNS 区域文件、配置转发器等。此外,定期检查 DNS 服务的运行状态、日志文件,确保其稳定和安全运行。