本教程将引导你完成 BIND9 的安装、基本配置,使其成为一个能够响应本地网络查询的缓存 DNS 服务器,并最终配置一个可以解析自定义域名(如 yourdomain.com)的权威 DNS 服务器。

教程大纲
- 环境准备
- 安装 BIND9
- 配置基本缓存 DNS 服务器
- 编辑主配置文件
- 配置本地解析文件
- 重启并测试服务
- 配置权威 DNS 服务器 (可选)
- 创建区域文件
- 更新主配置文件
- 重启并测试权威解析
- 安全加固
- 常见问题与总结
环境准备
在开始之前,请确保你有一台运行 Ubuntu (建议 20.04 或 22.04 LTS) 的服务器,
- 你拥有服务器的
sudo权限。 - 服务器有一个固定的公网 IP 地址(
0.113.10)。 - 你已经购买了一个域名(
yourdomain.com),并将该域名的 NS 记录指向你的服务器 IP,这是为了让互联网上的其他 DNS 服务器知道你的域名由你搭建的这台服务器解析。
重要提示:本教程中的示例 IP 地址是 0.113.10,域名是 yourdomain.com,请将它们替换为你自己的实际 IP 和域名。
安装 BIND9
更新你的软件包列表,然后安装 BIND9。
sudo apt update sudo apt install bind9
安装完成后,BIND9 服务会自动启动,你可以使用以下命令检查其状态:

sudo systemctl status bind9
如果看到绿色的 active (running),说明服务已成功启动。
配置基本缓存 DNS 服务器
默认情况下,BIND9 已经配置为一个缓存 DNS 服务器,它会递归查询并向你转发 DNS 请求,但为了更好地控制和学习,我们将手动配置它。
a. 编辑主配置文件
主配置文件是 /etc/bind/named.conf.options,我们将在这里定义哪些网络可以查询我们的 DNS 服务器,以及是否使用上游 DNS 服务器进行转发。
sudo nano /etc/bind/named.conf.options
在文件中,找到 options { ... }; 块,我们需要做两件事:

- 定义允许查询的网络:添加
allow-query { localhost; 192.168.1.0/24; };,168.1.0/24是你的局域网网段,请根据你的实际情况修改,这可以防止滥用。 - 配置转发器:在
options块内添加forwarders,指向你信任的上游 DNS 服务器,如 Google (8.8.8) 或 Cloudflare (1.1.1),这能加快解析速度。
修改后的文件内容可能如下:
options {
directory "/var/cache/bind";
// 允许查询的网络
// localhost 是必须的,用于本地服务查询
// 192.168.1.0/24 是你的局域网,请修改成你自己的
allow-query { localhost; 192.168.1.0/24; };
// 如果你不希望服务器进行递归查询,只做转发,可以取消下面这行的注释
// recursion no;
// 配置转发器,将无法解析的请求转发给这些服务器
forwarders {
8.8.8.8;
1.1.1.1;
};
// 防止 DNS 欺骗
dnssec-validation auto;
// 监听所有网络接口
listen-on { any; };
};
保存并关闭文件 (Ctrl+X, 然后按 Y, 最后按 Enter)。
b. 配置本地解析文件
为了确保本地主机名也能正确解析,我们检查一下 /etc/bind/named.conf.local 文件,确保它没有被修改(默认情况下是空的,因为我们没有配置区域)。
cat /etc/bind/named.conf.local
我们需要告诉 BIND9 使用 /etc/hosts 文件来解析本地主机名,编辑 /etc/bind/named.conf.default-zones:
sudo nano /etc/bind/named.conf.default-zones
找到 zone "localhost" { ... }; 和 zone "127.in-addr.arpa" { ... }; 这两个区域块,确保它们是启用的,它们默认就是启用的,负责将 localhost 解析为 0.0.1。
c. 重启并测试服务
配置完成后,重启 BIND9 服务以使更改生效。
sudo systemctl restart bind9
现在我们来测试一下。
-
测试本地解析:
nslookup localhost
应该能看到
0.0.1的解析结果。 -
测试缓存和转发功能:
nslookup google.com
应该能成功解析出 Google 的 IP 地址。
-
测试从另一台电脑: 在你的局域网内的另一台电脑上,将 DNS 服务器地址设置为你的 Ubuntu 服务器的 IP (
0.113.10或你的局域网 IP),然后在这台电脑上执行nslookup google.com,看是否能成功解析。
如果以上测试都通过,恭喜你,你已经成功搭建了一个基础的缓存 DNS 服务器!
配置权威 DNS 服务器 (可选)
将教你如何让你的 DNS 服务器成为一个“权威”服务器,能够回答 yourdomain.com 的查询。
a. 创建区域文件
区域文件存储了特定域名的 DNS 记录,我们将在 /etc/bind/zones/ 目录下创建它,如果该目录不存在,请先创建。
sudo mkdir -p /etc/bind/zones
创建区域文件 db.yourdomain.com:
sudo nano /etc/bind/zones/db.yourdomain.com
粘贴进去,并根据你的实际情况修改 A 记录和 NS 记录。
;
; BIND data file for yourdomain.com
;
$TTL 604800
@ IN SOA ns1.yourdomain.com. admin.yourdomain.com. (
2 ; Serial
604800 ; Refresh
86400 ; Retry
2419200 ; Expire
604800 ) ; Negative Cache TTL
;
@ IN NS ns1.yourdomain.com.
@ IN A 203.0.113.10 ; 你的服务器公网IP
ns1 IN A 203.0.113.10 ; 你的服务器公网IP
; 如果你有邮件服务器
; mail IN A 203.0.113.10
; @ IN MX 10 mail.yourdomain.com.
; 如果你想创建子域名,www.yourdomain.com
; www IN A 203.0.113.10
解释:
$TTL: 生存时间,单位秒,这里设为 7 天。SOA: "Start of Authority" (权威起始) 记录,是区域文件中最重要的记录。ns1.yourdomain.com.是主域名服务器,admin.yourdomain.com.是管理员邮箱。Serial号(这里是 2)在修改文件后必须递增,以便从服务器知道何时进行同步。NS: "Name Server" (域名服务器) 记录,指定了负责该域名的 DNS 服务器。A: "Address" (地址) 记录,将域名映射到 IPv4 地址。
b. 更新主配置文件
我们需要在 /etc/bind/named.conf.local 中告诉 BIND9 关于这个新区域的信息。
sudo nano /etc/bind/named.conf.local
在文件末尾添加以下内容:
//
// Do any local configuration here
//
// Consider adding the 1918 zones here, if they are not used in your
// organization
// include "/etc/bind/zones.rfc1918";
// --- 添加以下内容 ---
zone "yourdomain.com" {
type master;
file "/etc/bind/zones/db.yourdomain.com";
allow-transfer { none; }; // 禁止区域传输,更安全
allow-query { any; }; // 允许任何人查询这个区域
};
// 反向区域解析 (可选,但推荐)
// 将 IP 地址反向解析为域名
zone "113.0.203.in-addr.arpa" {
type master;
file "/etc/bind/zones/db.203.0.113";
};
解释:
zone "yourdomain.com": 定义了我们要管理的区域。type master: 表示这台服务器是该区域的主权威服务器。file "/etc/bind/zones/db.yourdomain.com": 指向我们刚刚创建的区域文件。allow-query { any; }: 允许任何人查询这个域名的记录,对于生产环境,你可以限制为特定 IP。
c. 重启并测试权威解析
重启 BIND9 服务:
sudo systemctl restart bind9
测试你的权威 DNS 服务器:
-
在本地服务器上测试:
nslookup ns1.yourdomain.com 127.0.0.1 nslookup yourdomain.com 127.0.0.1
应该能看到
0.113.10的解析结果。 -
从另一台电脑测试: 确保那台电脑的 DNS 服务器已经设置为你 Ubuntu 服务器的 IP,然后执行:
nslookup yourdomain.com
如果能成功解析,说明你的权威 DNS 服务器已经工作了!
-
最终验证: 在你的域名注册商(如 GoDaddy, Namecheap 等)处,将
yourdomain.com的 NS 记录修改为:ns1.yourdomain.comns2.yourdomain.com(如果你有第二台服务器,可以添加这个)
等待 DNS 传播(可能需要几分钟到几小时),之后,在全球任何地方执行
nslookup yourdomain.com,都应该能解析到你的服务器 IP。
安全加固
生产环境中,安全至关重要。
-
使用防火墙 (UFW):
# 只允许 DNS (端口 53) 和 SSH (端口 22) 的流量 sudo ufw allow 53/tcp sudo ufw allow 53/udp sudo ufw allow 22/tcp sudo ufw enable
-
运行
named-checkconf和named-checkzone: 在修改配置后,运行这些命令可以检查配置文件和区域文件的语法错误,避免服务无法启动。sudo named-checkconf sudo named-checkzone yourdomain.com /etc/bind/zones/db.yourdomain.com
-
限制区域传输: 在
named.conf.local中,我们已经设置了allow-transfer { none; };,这可以防止任何人从你的服务器拉取区域数据,是一种重要的安全措施。 -
使用
chroot环境运行 (可选): BIND9 可以在一个chroot(change root) 环境中运行,将 DNS 服务的文件系统与主系统隔离,提供额外的安全层,Ubuntu 的 BIND9 包默认可能已经配置了chroot。
常见问题与总结
-
问题:
nslookup返回connection refused或server can't find。- 排查:
- 检查 BIND9 服务状态:
sudo systemctl status bind9。 - 检查防火墙是否阻止了 53 端口。
- 检查配置文件语法:
sudo named-checkconf。 - 检查日志文件:
sudo tail -f /var/log/syslog | grep named。
- 检查 BIND9 服务状态:
- 排查:
-
问题: 我的域名解析很慢。
- 排查:
- 确认你的域名注册商的 NS 记录是否已正确更新。
- 使用
dig yourdomain.com @your_server_ip命令进行更详细的查询,看是否有延迟。 - 检查
named.conf.options中的forwarders配置是否合理。
- 排查:
-
你已经成功地在 Ubuntu 上安装并配置了 BIND9 DNS 服务器,它现在既可以作为一个高效的缓存 DNS 服务器为你的局域网服务,也可以作为一个权威 DNS 服务器管理你自己的域名,随着你对 BIND9 的熟悉,你还可以配置更高级的功能,如 DNSSEC、日志记录、动态更新等。
