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

目录
- 第一步:更新系统并安装 BIND9
- 第二步:配置 BIND9
- 1 主配置文件 (
named.conf.options) - 2 区域配置文件 (
named.conf.local) - 3 创建区域数据文件
- 1 主配置文件 (
- 第三步:启动并测试 DNS 服务器
- 1 启动并设置开机自启
- 2 本地测试 (
dig,nslookup) - 3 从另一台电脑测试
- 第四步:配置防火墙
- 第五步:高级配置(可选)
- 1 配置转发器
- 2 配置反向解析
- 第六步:安全加固
第一步:更新系统并安装 BIND9
登录到你的 Ubuntu 服务器,更新软件包列表并安装 BIND9。
# 更新软件包列表 sudo apt update # 安装 BIND9 sudo apt install bind9
安装完成后,BIND9 服务会自动启动,我们可以检查其状态:
sudo systemctl status bind9
如果看到 active (running),说明服务已经成功启动。
第二步:配置 BIND9
BIND9 的配置文件位于 /etc/bind/ 目录下,我们将主要修改以下几个文件:

named.conf.options:全局选项,如监听地址、转发规则等。named.conf.local:定义你管理的 DNS 区域(域名)。- 区域数据文件:包含具体的 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;
};
};
说明:

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 本地测试
使用 dig 或 nslookup 命令进行测试。
测试正向解析:
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 中我们已经配置了全局转发器,如果你只想对某些特定域名进行转发,可以使用 forward 和 zone 语句实现更精细的控制。
2 配置反向解析
反向解析对于邮件服务器等应用非常重要,因为它们会检查发件人 IP 的 PTR 记录是否有效,我们在第二步中已经详细介绍了如何配置反向解析。
第六步:安全加固
生产环境中,安全至关重要。
- 限制查询范围:我们已经通过
allow-query做到了这一点,只允许受信任的网段。 - 禁止区域传输:区域传输会将整个区域文件发送给请求者,这可能暴露你的网络结构,默认情况下,BIND9 是禁止的,但可以显式配置:
// 在 named.conf.options 的 options 块中 allow-transfer { none; }; // 或者只允许特定的从服务器 IP - 使用
chroot环境:BIND9 可以运行在一个chroot(change root) 环境中,将进程限制在文件系统的一个子目录中,即使被攻破,也能限制其损害范围,Ubuntu 的bind9包默认已经配置好了chroot,其数据目录在/var/lib/bind/。 - 使用 TSIG 进行认证:如果需要从服务器拉取区域数据,使用 TSIG (Transaction SIGnature) 进行认证,比简单的 IP 授权要安全得多。
至此,你已经成功在 Ubuntu 上搭建了一个基础的、功能完善的 DNS 服务器,你可以根据需要添加更多的 A 记录、CNAME 记录、MX 记录(用于邮件服务器)等。
DNS 是互联网的核心基础设施之一,配置时务必仔细,修改序列号,并定期检查日志文件 (/var/log/syslog 或 /var/log/named/) 以监控服务器的运行状态。
