目录
- DNS 基础概念:快速了解 DNS 是什么,以及我们配置的各个部分。
- 环境准备:服务器要求、域名注册和准备工作。
- 安装 BIND:在您的 Linux 服务器上安装 DNS 软件。
- 核心配置文件详解:
named.conf和区域文件。 - 配置示例:一个完整的、可运行的域名(
yourdomain.com)配置示例。 - 启动、测试与管理:如何启动服务、排查问题和日常管理。
- 安全加固:一些重要的安全配置建议。
- 高级配置(可选):配置 DNSSEC 和日志。
DNS 基础概念
在开始配置前,理解几个关键概念至关重要:

- 正向解析:将域名(如
www.google.com)解析为 IP 地址(如250.191.78),这是我们最常用的功能。 - 反向解析:将 IP 地址解析为域名,常用于邮件服务器反垃圾邮件、服务器管理等。
- 区域:DNS 数据库的一部分,包含了某个特定域名(如
yourdomain.com)的所有记录。 - 资源记录:区域文件中的条目,定义了域名与 IP 地址或其他信息的映射关系,常见类型:
A记录:将域名指向一个 IPv4 地址。AAAA记录:将域名指向一个 IPv6 地址。CNAME记录:别名记录,将一个域名指向另一个域名。MX记录:邮件交换记录,指定负责处理该域名邮件的服务器。NS记录:名称服务器记录,指定哪个 DNS 服务器负责解析该域名。SOA记录:起始授权机构记录,包含区域的元数据(如管理员邮箱、序列号等)。
- 权威 DNS 服务器:存储了特定区域最终、官方记录的服务器,我们配置的就是这种。
环境准备
在开始之前,请确保您已准备好以下内容:
- 一台 Linux 服务器:推荐使用 Ubuntu/Debian 或 CentOS/Rocky Linux,本指南将以 Ubuntu 22.04 为例。
- 静态公网 IP 地址:您的服务器必须有一个固定的公网 IP,
0.113.10。 - 一个已注册的域名:
yourdomain.com,您需要从这个域名的注册商(如 GoDaddy, Namecheap, 阿里云等)处获取 NS 记录修改权限。 - 服务器管理员权限:需要
sudo或root权限。
安装 BIND
在 Ubuntu/Debian 系统上,打开终端并执行:
# 更新软件包列表 sudo apt update # 安装 bind9 (Ubuntu/Debian) 或 bind (CentOS/Rocky) sudo apt install bind9 -y
在 CentOS/Rocky Linux 系统上:
# 安装 EPEL 仓库(如果尚未安装) sudo dnf install epel-release -y # 安装 bind sudo dnf install bind bind-utils -y
安装完成后,BIND 服务会自动启动,我们可以检查其状态:

# Ubuntu/Debian sudo systemctl status bind9 # CentOS/Rocky sudo systemctl status named
核心配置文件详解
BIND 的主要配置文件是 /etc/bind/named.conf (Ubuntu) 或 /etc/named.conf (CentOS),区域文件通常存放在 /etc/bind/zones/ (Ubuntu) 或 /var/named/ (CentOS)。
1 主配置文件 (named.conf)
这个文件是 BIND 的“大脑”,它告诉服务器去哪里查找区域文件,以及有哪些全局选项。
关键选项解析:
listen-on port 53 { any; };:监听所有网络接口的 53 端口。localhost或0.0.1表示只允许本机查询。allow-query { any; };:允许任何 IP 地址查询您的 DNS 服务器,为了安全,可以修改为localhost;或您的 IP 地址段。allow-recursion { none; };:递归查询。none表示不对外提供递归查询服务,这可以防止您的服务器被用于 DNS 放大攻击,如果您的服务器是公共 DNS,则需要设置为any;或localhost;。
2 区域文件
这是存储具体域名记录的地方,一个区域文件通常包含:

- SOA 记录:必须放在文件开头。
- NS 记录:指定当前域名的权威 DNS 服务器。
- 其他记录:A, CNAME, MX 等。
配置示例
假设我们要为域名 yourdomain.com 配置 DNS 服务器,服务器的公网 IP 是 0.113.10。
创建区域目录 (如果不存在)
在 Ubuntu 上,BIND 通常会自动创建,如果没有:
sudo mkdir -p /etc/bind/zones
编辑主配置文件 (/etc/bind/named.conf)
使用您喜欢的编辑器(如 nano 或 vim)打开文件:
sudo nano /etc/bind/named.conf
在文件末尾添加以下内容,定义 yourdomain.com 的正向和反向区域。
// 正向区域定义
zone "yourdomain.com" {
type master; // 这是一个主权威服务器
file "/etc/bind/zones/yourdomain.com.db"; // 区域文件路径
allow-query { any; }; // 允许任何人查询此区域
};
// 反向区域定义 (根据您的IP段)
// 假设您的IP是 203.0.113.10,则网络段是 203.0.113.0/24
// 反向区域名称是 IP 段倒序,加上 in-addr.arpa
zone "113.0.203.in-addr.arpa" {
type master;
file "/etc/bind/zones/yourdomain.com.rev";
allow-query { any; };
};
创建正向区域文件 (/etc/bind/zones/yourdomain.com.db)
sudo nano /etc/bind/zones/yourdomain.com.db
并务必修改 ns1.yourdomain.com 和 admin.yourdomain.com 中的域名。
;
; BIND data file for yourdomain.com
;
$TTL 86400
@ IN SOA ns1.yourdomain.com. admin.yourdomain.com. (
2025051501 ; Serial
604800 ; Refresh
86400 ; Retry
2419200 ; Expire
86400 ) ; Negative Cache TTL
;
; Name Servers
@ IN NS ns1.yourdomain.com.
@ IN NS ns2.yourdomain.com. ; 如果有备用服务器
; A Records for Name Servers (将 ns1 和 ns2 指向您的服务器IP)
ns1 IN A 203.0.113.10
ns2 IN A 203.0.113.10 ; 如果只有一个IP,也指向这里
; A Records for other hosts
www IN A 203.0.113.10
@ IN A 203.0.113.10 ; 将根域名也指向IP
ftp IN A 203.0.113.11 ; 另一台服务器的IP
; CNAME Record
blog IN CNAME www.yourdomain.com.
; MX Record
@ IN MX 10 mail.yourdomain.com.
mail IN A 203.0.113.12 ; 邮件服务器的IP
注意:
Serial号必须每次修改区域文件后递增,否则从服务器不会更新。- 符号代表当前区域名(
yourdomain.com)。
创建反向区域文件 (/etc/bind/zones/yourdomain.com.rev)
sudo nano /etc/bind/zones/yourdomain.com.rev
确保 IP 地址和主机名与正向区域一致。
;
; BIND reverse data file for 203.0.113.0/24
;
$TTL 86400
@ IN SOA ns1.yourdomain.com. admin.yourdomain.com. (
2025051501 ; Serial
604800 ; Refresh
86400 ; Retry
2419200 ; Expire
86400 ) ; Negative Cache TTL
;
; Name Servers
@ IN NS ns1.yourdomain.com.
@ IN NS ns2.yourdomain.com.
; PTR Records (反向解析)
10 IN PTR ns1.yourdomain.com.
10 IN PTR www.yourdomain.com.
10 IN PTR yourdomain.com.
11 IN PTR ftp.yourdomain.com.
12 IN PTR mail.yourdomain.com.
设置文件权限
BIND 进程 (named) 需要能够读取这些区域文件,在 Ubuntu 上,它们通常有正确的权限,如果没有,可以执行:
sudo chown root:bind /etc/bind/zones/yourdomain.com.db sudo chown root:bind /etc/bind/zones/yourdomain.com.rev sudo chmod 640 /etc/bind/zones/yourdomain.com.db sudo chmod 640 /etc/bind/zones/yourdomain.com.rev
检查配置语法
在重启服务前,务必检查配置文件是否有语法错误:
# Ubuntu/Debian sudo named-checkconf sudo named-checkzone yourdomain.com /etc/bind/zones/yourdomain.com.db sudo named-checkzone 113.0.203.in-addr.arpa /etc/bind/zones/yourdomain.com.rev # CentOS/Rocky sudo named-checkconf sudo named-checkzone yourdomain.com /var/named/yourdomain.com.db sudo named-checkzone 113.0.203.in-addr.arpa /var/named/yourdomain.com.rev
如果命令没有输出任何信息,说明配置正确,如果有错误,它会告诉你哪一行有问题。
重启 BIND 服务
# Ubuntu/Debian sudo systemctl restart bind9 # CentOS/Rocky sudo systemctl restart named
启动、测试与管理
1 在服务器上测试
使用 dig 或 nslookup 工具进行测试。
# 测试正向解析 dig @localhost yourdomain.com dig @localhost www.yourdomain.com # 测试反向解析 dig @localhost -x 203.0.113.10 # 测试 MX 记录 dig @localhost yourdomain.com MX
2 在本地电脑上测试
关键步骤:您需要将您的电脑 DNS 服务器地址修改为您新配置的 DNS 服务器 IP (0.113.10),才能正确测试。
- Windows: 网络和 Internet -> 网络和共享中心 -> 更改适配器设置 -> 右键点击网络连接 -> 属性 -> Internet 协议版本 4 (TCP/IPv4) -> 属性 -> 使用下面的 DNS 服务器地址 -> 填入
0.113.10。 - macOS: 系统偏好设置 -> 网络 -> 高级 -> DNS -> 点击 号添加
0.113.10。
修改后,在命令行中测试:
# 在 Windows (cmd) 或 macOS/Linux (terminal) 中 nslookup yourdomain.com nslookup 203.0.113.10
如果返回了正确的 IP 地址和域名,说明您的 DNS 服务器配置成功!
3 配置域名注册商
您需要去您的域名注册商(如 GoDaddy)那里,将 yourdomain.com 的 NS 记录修改为您配置的服务器。
通常需要添加两条 NS 记录:
ns1.yourdomain.com(指向0.113.10)ns2.yourdomain.com(也指向0.113.10,或另一个备用 IP)
注意:DNS 修改可能需要几分钟到 48 小时才能在全球范围内生效(这个过程称为 DNS 传播)。
安全加固
生产环境中,安全性至关重要。
-
限制查询:在
named.conf中,将allow-query { any; }修改为只允许您自己的 IP 或信任的 IP。allow-query { localhost; 192.168.1.0/24; }; // 允许本机和局域网 -
禁止递归:防止您的服务器被用作放大攻击的跳板。
allow-recursion { none; }; // 或者 { localhost; }; -
使用防火墙:只允许 53 端口(TCP/UDP)的访问。
# Ubuntu (ufw) sudo ufw allow 53/tcp sudo ufw allow 53/udp # CentOS (firewalld) sudo firewall-cmd --permanent --add-service=dns sudo firewall-cmd --reload
-
运行在 Chroot 环境中:这是 BIND 的一个安全特性,将其限制在一个目录中运行,现代版本的 BIND 在某些发行版中默认已启用。
高级配置(可选)
配置 DNSSEC
DNSSEC (DNS Security Extensions) 通过数字签名来验证 DNS 响应的真实性和完整性,可以有效防止 DNS 欺骗攻击,配置过程相对复杂,涉及生成密钥对、将公钥注册到您的域名注册商等,这里不作详述,但强烈建议对重要域名启用。
配置日志
您可以在 named.conf 中配置日志,以便排查问题。
logging {
channel default_log {
file "/var/log/named/default.log" versions 3 size 1m; // 日志文件位置和大小
severity info; // 日志级别
print-time yes; // 打印时间戳
};
category default {
default_log;
};
};
创建日志文件并设置权限:
sudo touch /var/log/named/default.log sudo chown bind:bind /var/log/named/default.log
