在Ubuntu系统中搭建DNS服务器是一项常见的服务器管理任务,无论是用于内部网络域名解析还是作为公共DNS服务,BIND(Berkeley Internet Name Domain)都是最广泛使用的DNS软件之一,本文将详细介绍在Ubuntu上安装、配置和管理DNS服务器的完整过程,包括基础配置、区域文件管理、安全设置及常见问题排查。

安装BIND9
需要更新系统软件包列表并安装BIND9,打开终端,执行以下命令:
sudo apt update sudo apt install bind9 bind9utils bind9-doc
安装完成后,BIND9服务会自动启动,可以通过以下命令检查服务状态:
sudo systemctl status bind9
如果服务未启动,使用sudo systemctl start bind9启动,并设置开机自启sudo systemctl enable bind9。
主配置文件解析
BIND9的主配置文件位于/etc/bind/named.conf,该文件负责定义全局参数和包含其他配置文件,我们不会直接修改此文件,而是通过/etc/bind/named.conf.options和/etc/bind/named.conf.local进行配置。

修改named.conf.options
编辑/etc/bind/named.conf.options,主要配置监听地址和允许查询的客户端:
sudo nano /etc/bind/named.conf.options
在options块中添加或修改以下内容:
options {
directory "/var/cache/bind";
recursion yes; # 允许递归查询
allow-query { localhost; 192.168.1.0/24; }; # 仅允许本地和192.168.1.0/24网段查询
forwarders {
8.8.8.8; # 转发未知查询到Google DNS
114.114.114.114; # 可选:备用转发服务器
};
};
保存后重启BIND9服务:sudo systemctl restart bind9。
定义正向和反向区域
区域文件用于存储域名与IP地址的映射关系,在/etc/bind/named.conf.local中添加区域定义:

正向区域示例(example.com):
zone "example.com" {
type master;
file "/etc/bind/zones/example.com.db";
};
反向区域示例(192.168.1.0/24):
zone "1.168.192.in-addr.arpa" {
type master;
file "/etc/bind/zones/1.168.192.db";
};
创建区域文件目录:
sudo mkdir -p /etc/bind/zones
创建区域文件
正向区域文件
创建/etc/bind/zones/example.com.db:
sudo nano /etc/bind/zones/example.com.db
```示例:
```plaintext
$TTL 86400
@ IN SOA ns1.example.com. admin.example.com. (
2025081501 ; Serial
3600 ; Refresh
1800 ; Retry
604800 ; Expire
86400 ; Minimum TTL
)
IN NS ns1.example.com.
IN A 192.168.1.1
ns1 IN A 192.168.1.1
www IN A 192.168.1.2
mail IN A 192.168.1.3
反向区域文件
创建/etc/bind/zones/1.168.192.db:
sudo nano /etc/bind/zones/1.168.192.db
```示例:
```plaintext
$TTL 86400
@ IN SOA ns1.example.com. admin.example.com. (
2025081501 ; Serial
3600 ; Refresh
1800 ; Retry
604800 ; Expire
86400 ; Minimum TTL
)
IN NS ns1.example.com.
1 IN PTR ns1.example.com.
2 IN PTR www.example.com.
3 IN PTR mail.example.com.
权限与重启
确保区域文件所有者为bind用户:
sudo chown -R bind:bind /etc/bind/zones
检查配置文件语法:
sudo named-checkconf sudo named-checkzone example.com /etc/bind/zones/example.com.db sudo named-checkzone 1.168.192.in-addr.arpa /etc/bind/zones/1.168.192.db
若无错误,重启BIND9服务:
sudo systemctl restart bind9
安全配置建议
- 限制ACL:在
named.conf.options中通过allow-query和allow-transfer限制访问。 - 启用DNSSEC:通过
dnssec-signzone工具为区域添加数字签名。 - 日志监控:在
/etc/bind/named.conf.options中配置logging记录查询日志。
测试DNS解析
使用dig或nslookup测试解析:
dig @127.0.0.1 example.com dig @127.0.0.1 -x 192.168.1.2
确保返回正确的IP地址或域名。
常见问题排查
- 权限问题:区域文件权限不正确会导致服务启动失败,确保
bind用户可读写。 - 序列号错误:修改区域文件后需递增序列号,否则可能导致区域传输失败。
相关问答FAQs
Q1: 如何在Ubuntu DNS服务器中配置动态更新(DDNS)?
A1: 要启用动态更新,需在区域定义中添加allow-update参数,在named.conf.local中修改区域块:
zone "example.com" {
type master;
file "/etc/bind/zones/example.com.db";
allow-update { key "ddns-key"; };
};
然后生成密钥并配置客户端使用TSIG认证,具体步骤包括:
- 生成密钥:
sudo dnssec-keygen -a HMAC-SHA256 -b 256 -n HOST ddns-key - 提取密钥文本并添加到
/etc/bind/named.conf.keys - 在客户端配置使用该密钥进行动态更新。
Q2: 如何优化Ubuntu DNS服务器的性能?
A2: 性能优化可通过以下方式实现:
- 调整缓存大小:在
named.conf.options中增加max-cache-size值,例如max-cache-size 1G;。 - 启用响应缓存:设置
max-ncache-size和min-ncache-ttl优化负缓存。 - 并行查询:通过
multiple-clients-per-query yes;允许多个客户端共享同一查询。 - 使用dnsmasq:对于小型网络,可考虑用轻量级的dnsmasq替代BIND9。
- 监控工具:使用
rndc status或dnstop监控查询负载,定期分析日志。
以下是优化参数示例:
options {
max-cache-size 1G;
multiple-clients-per-query yes;
min-ncache-ttl 3600;
cleaning-interval 60;
}; 