在Linux系统中搭建DNS服务器通常使用BIND(Berkeley Internet Name Domain)软件,它是目前最广泛使用的DNS服务器软件之一,以下将详细介绍在Linux系统(以Ubuntu/Debian为例)中配置DNS服务器的完整步骤,包括安装、配置文件编写、测试及常见问题处理。

安装BIND软件
首先需要更新系统软件包列表并安装BIND9,打开终端,执行以下命令:
sudo apt update sudo apt install bind9 bind9utils bind9-doc
安装完成后,BIND服务会自动启动,可通过systemctl status bind9检查服务状态,若未启动,使用sudo systemctl start bind9启动,并设置sudo systemctl enable bind9实现开机自启。
配置DNS区域文件
DNS服务器的核心配置包括主配置文件named.conf及区域数据文件,以下以配置正向解析区域example.com和反向解析区域168.192.in-addr.arpa为例。
编辑主配置文件
主配置文件位于/etc/bind/named.conf,默认包含本地和回环解析的配置,在文件末尾添加自定义区域声明:

sudo nano /etc/bind/named.conf
zone "example.com" {
type master;
file "/etc/bind/zones/db.example.com";
};
zone "1.168.192.in-addr.arpa" {
type master;
file "/etc/bind/zones/db.192.168.1";
};
其中type master表示主DNS服务器,file指定区域数据文件路径。
创建区域数据文件
创建正向解析区域文件目录:
sudo mkdir -p /etc/bind/zones
复制正向解析模板文件并编辑:
sudo cp /etc/bind/db.local /etc/bind/zones/db.example.com sudo nano /etc/bind/zones/db.example.com ```如下:
; ; 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.100 ns1 IN A 192.168.1.100 www IN A 192.168.1.101

SOA`记录包含域名管理信息,`NS`记录指定域名服务器,`A`记录将域名映射到IP地址。
创建反向解析区域文件:
```bash
sudo cp /etc/bind/db.127 /etc/bind/zones/db.192.168.1
sudo nano /etc/bind/zones/db.192.168.1
```如下:
; ; BIND reverse data file for 192.168.1.0/24 ; $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. 100 IN PTR ns1.example.com. 101 IN PTR www.example.com.
`PTR`记录将IP地址映射到域名。
#### 3. 配置允许查询的客户端
在`/etc/bind/named.conf.options`中修改`allow-query`选项,指定允许查询的IP段(如局域网`192.168.1.0/24`):
```bash
options {
directory "/var/cache/bind";
allow-query { 192.168.1.0/24; localhost; };
// 其他配置...
};
启动服务与测试
配置完成后,检查配置文件语法是否正确:
sudo named-checkconf sudo named-checkzone example.com /etc/bind/zones/db.example.com sudo named-checkzone 1.168.192.in-addr.arpa /etc/bind/zones/db.192.168.1
若无错误,重启BIND服务:
sudo systemctl restart bind9
测试DNS解析
使用dig或nslookup命令测试解析:
dig @192.168.1.100 www.example.com nslookup 192.168.1.101 192.168.1.100
若返回正确的域名或IP,说明配置成功。
常见问题处理
- 权限问题:确保区域数据文件属主为
bind用户,权限为644:sudo chown bind:bind /etc/bind/zones/db.* sudo chmod 644 /etc/bind/zones/db.*
- 防火墙拦截:若客户端无法解析,检查服务器防火墙(如UFW)是否开放53端口:
sudo ufw allow 53/tcp sudo ufw allow 53/udp
相关问答FAQs
Q1: 如何配置DNS转发,使本地无法解析的请求转发到上游DNS服务器?
A1: 在/etc/bind/named.conf.options中添加forwarders选项,
options {
forwarders { 8.8.8.8; 114.114.114.114; };
forward only; // 仅转发,不递归查询
};
保存后重启BIND服务即可。
Q2: 如何为子域(如sub.example.com)创建单独的区域?
A2: 在named.conf中添加子域区域声明,并创建对应的区域数据文件。
zone "sub.example.com" {
type master;
file "/etc/bind/zones/db.sub.example.com";
};
在db.sub.example.com中配置子域的A记录或CNAME记录,并确保主域example.com的NS记录指向子域服务器。
