凌峰创科服务平台

Ubuntu如何快速搭建DNS服务器?

本指南将以 BIND9 为例,详细介绍在 Ubuntu 22.04 LTS 上搭建一个功能完整的 DNS 服务器的全过程,包括安装、配置、测试和安全加固。

Ubuntu如何快速搭建DNS服务器?-图1
(图片来源网络,侵删)

目录

  1. 第一步:更新系统并安装 BIND9
  2. 第二步:配置 BIND9
    • 1 主配置文件 (named.conf.options)
    • 2 区域配置文件 (named.conf.local)
    • 3 创建区域数据文件
  3. 第三步:启动并测试 DNS 服务器
    • 1 启动并设置开机自启
    • 2 本地测试 (dig, nslookup)
    • 3 从另一台电脑测试
  4. 第四步:配置防火墙
  5. 第五步:高级配置(可选)
    • 1 配置转发器
    • 2 配置反向解析
  6. 第六步:安全加固

第一步:更新系统并安装 BIND9

登录到你的 Ubuntu 服务器,更新软件包列表并安装 BIND9。

# 更新软件包列表
sudo apt update
# 安装 BIND9
sudo apt install bind9

安装完成后,BIND9 服务会自动启动,我们可以检查其状态:

sudo systemctl status bind9

如果看到 active (running),说明服务已经成功启动。


第二步:配置 BIND9

BIND9 的配置文件位于 /etc/bind/ 目录下,我们将主要修改以下几个文件:

Ubuntu如何快速搭建DNS服务器?-图2
(图片来源网络,侵删)
  1. named.conf.options:全局选项,如监听地址、转发规则等。
  2. named.conf.local:定义你管理的 DNS 区域(域名)。
  3. 区域数据文件:包含具体的 DNS 记录(如 A 记录、CNAME 记录等)。

1 主配置文件 (named.conf.options)

这个文件用于配置 BIND9 的全局行为,我们通常需要做两件事:

  • 允许查询:默认情况下,BIND9 只允许本地查询,我们需要修改为允许来自你内网的查询。
  • 配置转发器:将无法解析的请求转发到公共 DNS 服务器(如 8.8.8.8 或 1.1.1.1),而不是直接向根服务器查询。

打开并编辑文件:

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

options 块内进行如下修改:

options {
        directory "/var/cache/bind";
        // 允许来自任何内网地址的查询
        // 将 192.168.1.0/24 替换为你的内网网段
        allow-query { 127.0.0.1; 192.168.1.0/24; };
        // 不允许动态更新
        allow-update { none; };
        // 配置转发器,将未知域名查询转发到 Google DNS
        // 这能加快解析速度
        forwarders {
                8.8.8.8;
                8.8.4.4;
        };
};

说明

Ubuntu如何快速搭建DNS服务器?-图3
(图片来源网络,侵删)
  • allow-query:定义了哪些 IP 地址可以向你的 DNS 服务器发送查询请求。0.0.1 是本机,168.1.0/24 是一个示例内网段,请务必根据你的网络环境修改
  • forwarders:这是 DNS 递归查询的“上级”,当你的 DNS 服务器收到一个它不负责的域名查询时,会把这个请求转发给 forwarders 中的 DNS 服务器。

保存并退出文件(在 nano 中是 Ctrl+X,然后按 Y,再按 Enter)。

2 区域配置文件 (named.conf.local)

这个文件用于声明你管理的 DNS 区域,假设我们要管理 example.lan 这个域名。

打开并编辑文件:

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

在文件末尾添加以下内容来声明一个正向区域和一个反向区域(反向区域可选,但推荐)。

// 正向区域声明
zone "example.lan" {
        type master;
        file "/etc/bind/db.example.lan";
};
// 反向区域声明 (可选)
// 假设你的内网网段是 192.168.1.0/24
zone "1.168.192.in-addr.arpa" {
        type master;
        file "/etc/bind/db.192";
};

说明

  • zone "example.lan":声明我们负责管理 example.lan 这个域。
  • type master:表示这个 DNS 服务器是这个区域的主服务器,数据存储在本地文件中。
  • file "/etc/bind/db.example.lan":指定存储该区域 DNS 记录的文件路径。

保存并退出。

3 创建区域数据文件

我们需要创建上一步中指定的区域数据文件,并填入 DNS 记录。

创建正向区域文件:

BIND9 提供了模板文件,我们可以基于它来创建。

# 复制模板文件
sudo cp /etc/bind/db.local /etc/bind/db.example.lan
# 编辑新文件
sudo nano /etc/bind/db.example.lan

修改如下:

;
; BIND data file for example.lan
;
$TTL    604800
@       IN      SOA     ns1.example.lan. admin.example.lan. (
                              2         ; Serial
                         604800         ; Refresh
                          86400         ; Retry
                        2419200         ; Expire
                         604800 )       ; Negative Cache TTL
;
@       IN      NS      ns1.example.lan.
@       IN      A       192.168.1.10       ; 你的 DNS 服务器 IP
ns1     IN      A       192.168.1.10       ; ns1 主机名的 A 记录
www     IN      A       192.168.1.20       ; www 主机名的 A 记录
ftp     IN      CNAME   www.example.lan.  ; ftp 别名指向 www

说明

  • $TTL:记录的默认生存时间,单位是秒,这里设为 7 天(604800秒)。
  • SOA:起始授权机构记录,这是区域文件中最重要的记录。
    • ns1.example.lan.:负责此区域的 DNS 服务器主机名。
    • admin.example.lan.:管理员的邮箱地址(用 代替 )。
    • 2:序列号,当区域文件内容更新时,必须递增这个数字,以便从服务器知道需要重新同步数据。
  • NS:名称服务器记录,指定哪个服务器负责此域名。
  • A:地址记录,将主机名映射到 IPv4 地址。 代表区域名 example.lan
  • CNAME:规范名称记录,为一个主机名创建别名。

创建反向区域文件(可选但推荐):

反向解析是将 IP 地址解析为域名。

# 复制反向模板文件
sudo cp /etc/bind/db.127 /etc/bind/db.192
# 编辑新文件
sudo nano /etc/bind/db.192

修改如下:

;
; BIND reverse data file for 192.168.1.0/24
;
$TTL    604800
@       IN      SOA     ns1.example.lan. admin.example.lan. (
                              1         ; Serial
                         604800         ; Refresh
                          86400         ; Retry
                        2419200         ; Expire
                         604800 )       ; Negative Cache TTL
;
@       IN      NS      ns1.example.lan.
10      IN      PTR     ns1.example.lan.   ; 192.168.1.10 的反向记录
20      IN      PTR     www.example.lan.   ; 192.168.1.20 的反向记录

说明

  • 文件名和区域名对应 /etc/bind/named.conf.local 中的反向区域声明。
  • 关键记录是 PTR(指针记录),格式为 主机号 IN PTR 域名10 对应 168.1.10

第三步:启动并测试 DNS 服务器

1 检查配置并重启服务

在重启 BIND9 之前,最好先检查一下配置文件是否有语法错误。

sudo named-checkconf

如果没有任何输出,说明配置文件语法正确,如果报错,请根据提示返回修改相应文件。

重启 BIND9 服务以应用新配置:

sudo systemctl restart bind9

2 本地测试

使用 dignslookup 命令进行测试。

测试正向解析:

dig @127.0.0.1 www.example.lan

你应该能看到在 ANSWER SECTION 中有类似下面的输出:

;; ANSWER SECTION:
www.example.lan.         604800  IN      A       192.168.1.20

测试反向解析:

dig @127.0.0.1 -x 192.168.1.20

你应该能看到在 ANSWER SECTION 中有类似下面的输出:

;; ANSWER SECTION:
20.1.168.192.in-addr.arpa. 604800 IN      PTR     www.example.lan.

3 从另一台电脑测试

确保另一台电脑的 DNS 服务器地址设置为你 Ubuntu 服务器的 IP(168.1.10),然后在那台电脑上打开命令行,执行 ping www.example.lan

如果能成功 ping 通,IP 地址正确,那么恭喜你,你的 DNS 服务器已经搭建成功了!


第四步:配置防火墙

如果你的 Ubuntu 服务器启用了 UFW 防火墙,你需要开放 DNS 服务所需的端口(UDP 53 和 TCP 53)。

# 允许来自内网的 DNS 查询
sudo ufw allow from 192.168.1.0/24 to any port 53
# 如果你的 DNS 服务器也需要响应区域传输(给从服务器用),还需要开放 TCP 53
sudo ufw allow from 192.168.1.0/24 to any port 53 proto tcp
# 重新加载防火墙规则
sudo ufw reload

第五步:高级配置(可选)

1 配置转发器

named.conf.options 中我们已经配置了全局转发器,如果你只想对某些特定域名进行转发,可以使用 forwardzone 语句实现更精细的控制。

2 配置反向解析

反向解析对于邮件服务器等应用非常重要,因为它们会检查发件人 IP 的 PTR 记录是否有效,我们在第二步中已经详细介绍了如何配置反向解析。


第六步:安全加固

生产环境中,安全至关重要。

  1. 限制查询范围:我们已经通过 allow-query 做到了这一点,只允许受信任的网段。
  2. 禁止区域传输:区域传输会将整个区域文件发送给请求者,这可能暴露你的网络结构,默认情况下,BIND9 是禁止的,但可以显式配置:
    // 在 named.conf.options 的 options 块中
    allow-transfer { none; }; // 或者只允许特定的从服务器 IP
  3. 使用 chroot 环境:BIND9 可以运行在一个 chroot (change root) 环境中,将进程限制在文件系统的一个子目录中,即使被攻破,也能限制其损害范围,Ubuntu 的 bind9 包默认已经配置好了 chroot,其数据目录在 /var/lib/bind/
  4. 使用 TSIG 进行认证:如果需要从服务器拉取区域数据,使用 TSIG (Transaction SIGnature) 进行认证,比简单的 IP 授权要安全得多。

至此,你已经成功在 Ubuntu 上搭建了一个基础的、功能完善的 DNS 服务器,你可以根据需要添加更多的 A 记录、CNAME 记录、MX 记录(用于邮件服务器)等。

DNS 是互联网的核心基础设施之一,配置时务必仔细,修改序列号,并定期检查日志文件 (/var/log/syslog/var/log/named/) 以监控服务器的运行状态。

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