- 安装 BIND
- 配置主要区域文件
- 配置反向区域文件
- 配置 BIND 主配置文件
- 启动和测试服务
- 安全增强(可选但推荐)
- 常见问题排查
第 1 步:安装 BIND
更新你的软件包列表,然后安装 bind9 包。

sudo apt update sudo apt install bind9 -y
安装完成后,BIND 服务会自动启动,你可以使用以下命令检查其状态:
sudo systemctl status bind9
如果看到 active (running),则表示服务正在运行。
第 2 步:配置主要区域文件
主要区域文件用于将域名(如 example.com)解析为 IP 地址(如 168.1.10)。
1 创建区域配置文件
BIND 的区域定义通常存放在 /etc/bind/named.conf.local 文件中,我们需要在这个文件中声明我们的主要区域和反向区域。

打开并编辑该文件:
sudo nano /etc/bind/named.conf.local
在文件末尾添加以下内容(请务必将 example.com 和 your.email.com 替换为你自己的域名和管理员邮箱):
#
# Do any local configuration here
#
# 主要区域配置
zone "example.com" {
type master;
file "/etc/bind/db.example.com";
};
# 反向区域配置 (稍后会用到)
zone "1.168.192.in-addr.arpa" {
type master;
file "/etc/bind/db.192.168.1";
};
zone "example.com": 定义你要管理的区域。type master;: 表示这个 DNS 服务器是该区域的主服务器。file "/etc/bind/db.example.com";: 指向存储该区域数据的文件,这个文件我们稍后会创建。
2 创建区域数据文件
我们需要创建 /etc/bind/db.example.com 文件,最好的方法是复制一个现有的模板文件。
sudo cp /etc/bind/db.local /etc/bind/db.example.com
然后编辑这个新文件:

sudo nano /etc/bind/db.example.com
修改为如下所示(同样,替换域名和 IP 地址):
;
; BIND data file for example.com
;
$TTL 604800
@ IN SOA ns1.example.com. admin.example.com. (
2 ; Serial
604800 ; Refresh
86400 ; Retry
2419200 ; Expire
604800 ) ; Negative Cache TTL
;
@ IN NS ns1.example.com.
@ IN A 192.168.1.10
@ IN AAAA ::1
; 主机记录
ns1 IN A 192.168.1.10
www IN A 192.168.1.10
mail IN A 192.168.1.11
ftp IN CNAME www.example.com.
解释:**
$TTL 604800: 设置默认的“生存时间”,即 DNS 记录在缓存中保留的时间(这里是 7 天)。- 表示当前区域名(即
example.com)。 SOA (Start of Authority): 区域授权记录,这是区域中最重要的记录。ns1.example.com.: 负责此区域的 DNS 服务器主机名。admin.example.com.: 管理此区域的邮箱地址( 被替换为 )。2: 序列号,当你修改了区域文件后,必须增加这个数字,以便从服务器知道需要重新加载数据。
NS (Name Server): 声明哪些服务器是该区域的权威名称服务器。A (Address): 将主机名映射到 IPv4 地址。@ IN A 192.168.1.10表示example.com本身指向168.1.10。AAAA: 将主机名映射到 IPv6 地址。CNAME (Canonical Name): 别名记录。ftp是www的一个别名。
第 3 步:配置反向区域文件
反向区域用于将 IP 地址解析为域名(反向查找)。
1 创建反向区域数据文件
同样,我们复制一个模板文件来创建反向区域文件。
sudo cp /etc/bind/db.127 /etc/bind/db.192.168.1
然后编辑它:
sudo nano /etc/bind/db.192.168.1
如下(确保 IP 地址段与你的网络匹配):
;
; BIND reverse data file for 1.168.192.in-addr.arpa
;
$TTL 604800
@ IN SOA ns1.example.com. admin.example.com. (
1 ; Serial
604800 ; Refresh
86400 ; Retry
2419200 ; Expire
604800 ) ; Negative Cache TTL
;
@ IN NS ns1.example.com.
; PTR (Pointer) 记录
10 IN PTR ns1.example.com.
10 IN PTR www.example.com.
11 IN PTR mail.example.com.
解释:**
- 反向区域名
168.192.in-addr.arpa是168.1.10的 IP 地址倒序写法。 PTR (Pointer): 指针记录,用于反向解析。10 IN PTR ns1.example.com.: 表示 IP 地址168.1.10对应的主名是ns1.example.com。- 注意:
10是 IP 地址的最后一部分。
第 4 步:配置 BIND 主配置文件
为了安全起见,默认情况下 BIND 只监听在本地回环地址 0.0.1 上,我们需要修改它,让它监听在服务器的所有网络接口上,以便局域网内的其他设备可以使用它。
打开主配置文件:
sudo nano /etc/bind/named.conf.options
找到 options 块,并修改或添加 listen-on 和 allow-query 指令,修改后的部分应如下所示:
options {
directory "/var/cache/bind";
// 监听在所有可用的 IPv4 地址上
listen-on { any; };
// 如果需要支持 IPv6,取消下面这行的注释
// listen-on-v6 { any; };
// 允许任何客户端查询(对于内网 DNS 服务器是安全的)
// 对于生产环境,最好限制为你的局域网网段,allow-query { 192.168.1.0/24; };
allow-query { any; };
// 考虑添加以下行以提高安全性
// recursion yes;
// allow-recursion { localhost; localnets; };
// 禁止区域传输,除非你有从服务器
allow-transfer { none; };
// 其他配置...
};
listen-on { any; }: 告诉 BIND 监听服务器所有 IPv4 网络接口上的 DNS 请求。allow-query { any; }: 允许任何来源的机器向此服务器发起 DNS 查询请求,对于家庭或小型办公室网络,这是最简单的设置,对于更严格的环境,可以将其替换为你的局域网网段,如168.1.0/24。
第 5 步:启动和测试服务
1 检查配置语法
在重启服务之前,务必检查配置文件的语法是否正确。
sudo named-checkconf sudo named-checkzone example.com /etc/bind/db.example.com sudo named-checkzone 1.168.192.in-addr.arpa /etc/bind/db.192.168.1
如果没有任何输出,说明语法正确。
2 重启 BIND 服务
sudo systemctl restart bind9
3 测试 DNS 服务器
让我们在服务器上测试我们自己配置的 DNS。
测试正向解析 (域名 -> IP)
使用 dig 或 nslookup 命令。
dig @127.0.0.1 www.example.com # 或者使用 nslookup nslookup www.example.com 127.0.0.1
你应该能看到类似 ANSWER SECTION 的输出,显示 www.example.com 的 IP 地址是 168.1.10。
测试反向解析 (IP -> 域名)
dig @127.0.0.1 -x 192.168.1.10 # 或者使用 nslookup nslookup 192.168.1.10 127.0.0.1
你应该能看到 ANSWER SECTION 显示 168.1.10 对应的域名是 www.example.com。
第 6 步:配置客户端使用新的 DNS 服务器
要让局域网内的其他设备使用这个新的 DNS 服务器,你需要将它们的 DNS 设置指向这台 Ubuntu 服务器的 IP 地址(168.1.10)。
- 在路由器上: 登录你的路由器管理界面,在 LAN 或 DHCP 设置中,将 DNS 服务器地址设置为
168.1.10,这样连接到路由器的所有设备都会自动使用它。 - 在单个设备上:
- Windows: 网络设置 -> 更改适配器选项 -> 右键点击网络连接 -> 属性 -> Internet 协议版本 4 (TCP/IPv4) -> 属性 -> 使用下面的 DNS 服务器地址 -> 填入
168.1.10。 - macOS: 系统偏好设置 -> 网络 -> 高级 -> DNS -> 点击 添加
168.1.10。 - Linux (Ubuntu): 设置 -> 网络 -> 点击齿轮图标 -> IPv4 -> DNS 服务器 -> 填入
168.1.10。
- Windows: 网络设置 -> 更改适配器选项 -> 右键点击网络连接 -> 属性 -> Internet 协议版本 4 (TCP/IPv4) -> 属性 -> 使用下面的 DNS 服务器地址 -> 填入
第 7 步:安全增强(可选但推荐)
对于生产环境,安全至关重要。
1 使用 Chroot Jail (BIND9 默认启用)
BIND9 在 Ubuntu 上默认以 chroot 方式运行,这意味着它被限制在一个虚拟的根目录 (/var/lib/named) 中,即使被攻破,也难以影响系统其他部分,这通常已经配置好了,无需额外操作。
2 限制查询和递归
在 /etc/bind/named.conf.options 中,我们已经做了基本的限制,一个更安全的配置是:
options {
// ... 其他配置 ...
// 只允许来自本地网络和本机的查询
allow-query { localhost; 192.168.1.0/24; };
// 只允许来自本地网络和本机的递归查询
allow-recursion { localhost; 192.168.1.0/24; };
// 只允许向指定的服务器转发无法解析的查询
// forwarders { 8.8.8.8; 1.1.1.1; };
// forward only;
};
3 使用防火墙 (ufw)
如果你的服务器启用了 ufw (Uncomplicated Firewall),你需要允许 DNS 流量(端口 53)。
sudo ufw allow 53/tcp sudo ufw allow 53/udp sudo ufw reload
第 8 步:常见问题排查
- 问题:
named-checkzone报错 "zone example.com/IN: loaded serial 2`- 原因: 通常是因为序列号没有更新,编辑区域文件,将
SOA记录中的Serial号加一,然后再次检查。
- 原因: 通常是因为序列号没有更新,编辑区域文件,将
- 问题: 客户端无法解析,但服务器上可以。
- 原因 1: 防火墙阻止了端口 53,检查
ufw或iptables规则。 - 原因 2: 客户端的 DNS 设置不正确,确保客户端配置了正确的 DNS 服务器 IP。
- 原因 3:
allow-query设置过于严格,没有包含客户端的 IP 地址。
- 原因 1: 防火墙阻止了端口 53,检查
- 问题: 日志显示
permission denied或cannot open file 'db.example.com': permission denied- 原因: BIND 运行在
bind用户下,该用户可能没有读取区域文件的权限,确保区域文件的属主是root:bind,并且权限是644。sudo chown root:bind /etc/bind/db.example.com sudo chmod 644 /etc/bind/db.example.com
- 原因: BIND 运行在
至此,你已经成功配置了一个基本的、功能齐全的 Ubuntu DNS 服务器,你可以根据需要添加更多的 A、AAAA、CNAME、MX (邮件交换) 等记录。
