本教程将以在 CentOS 7 / RHEL 7 或 Ubuntu 18.04 / 20.04 系统上搭建一个权威 DNS 服务器为例,使其能够解析您自己域名下的记录。
教程大纲
- 准备工作
- 安装 BIND
- 配置 BIND
- 主配置文件 (
named.conf) - 区域数据文件 (正向解析 & 反向解析)
- 主配置文件 (
- 启动并设置开机自启
- 配置防火墙
- 测试 DNS 服务器
- 配置转发器 (可选,推荐)
准备工作
在开始之前,请确保您:
- 拥有一台 Linux 服务器:可以是虚拟机或云服务器(如阿里云、腾讯云、AWS 等)。
- 拥有一个域名:
example.com,并且您能够修改该域名的 NS 记录。 - 拥有服务器的静态 IP 地址:
168.1.100。 - 以 root 或 sudo 用户身份登录。
安装 BIND
BIND 在不同发行版的包名和安装命令略有不同。
对于 CentOS / RHEL / Rocky Linux
# 更新软件包列表 sudo yum update -y # 安装 bind 包 sudo yum install -y bind bind-utils
bind: BIND 的核心程序。bind-utils: 包含了常用的 DNS 查询工具,如dig,nslookup,host。
对于 Ubuntu / Debian
# 更新软件包列表 sudo apt update # 安装 bind9 包 sudo apt install -y bind9 bind9utils
配置 BIND
这是最核心的部分,我们将分步配置主配置文件和区域数据文件。
步骤 3.1: 编辑主配置文件 (named.conf)
这个文件是 BIND 的总控制台。
- CentOS/RHEL: 路径为
/etc/named.conf - Ubuntu/Debian: 路径为
/etc/bind/named.conf
sudo vim /etc/named.conf
打开文件后,进行如下修改:
-
设置监听地址:默认情况下,BIND 只监听在
localhost (127.0.0.1),我们需要让它监听在服务器的所有 IP 地址上。 找到listen-on port 53 { 127.0.0.1; };这一行,将其修改为:listen-on port 53 { any; }; -
允许查询:默认只允许本地查询,我们需要允许任何客户端进行查询。 找到
allow-query { localhost; };这一行,将其修改为:allow-query { any; }; -
设置区域文件路径:为了方便管理,我们可以在文件末尾添加一个
include指令,专门用来存放我们自定义的区域配置。 在文件末尾添加:include "/etc/named/zones.conf";
保存并退出 (wq)。
步骤 3.2: 创建区域配置文件 (zones.conf)
这个文件将定义我们要管理的所有 DNS 区域。
sudo vim /etc/named/zones.conf
(/etc/named 目录不存在,请先创建:sudo mkdir -p /etc/named)
在 zones.conf 文件中,添加以下内容,这里我们以 example.com 为例,并假设其服务器 IP 是 168.1.100。
//
// 定义正向解析区域
//
zone "example.com" {
type master; // 表示这是一个主 DNS 服务器
file "example.com.zone"; // 区域数据文件的名称,存放在 /var/named/ 目录下
allow-update { none; }; // 不允许动态更新
};
//
// 定义反向解析区域
// 192.168.1.100 的网络部分是 1.168.192,需要反写
//
zone "1.168.192.in-addr.arpa" {
type master;
file "192.168.1.zone";
allow-update { none; };
};
解释:
- 正向解析:将域名
www.example.com解析到 IP168.1.100。 - 反向解析:将 IP
168.1.100解析到域名www.example.com。 type master:声明此区域由本服务器管理。file:指定存储该区域具体 DNS 记录的文件名。
步骤 3.3: 创建正向解析区域数据文件
我们创建在 zones.conf 中指定的数据文件。
# 进入 BIND 的工作目录 cd /var/named # 复制一个模板文件作为基础(CentOS/RHEL) sudo cp -p named.localhost example.com.zone # 或者 (Ubuntu/Debian) # sudo cp -p db.local example.com.zone
注意:使用 -p 参数是为了保留原始文件的权限,这对于 BIND 安全至关重要。
现在编辑这个新文件:
sudo vim /var/named/example.com.zone
替换为以下内容,并根据你的实际情况修改:
;
; BIND data file for example.com
;
$TTL 86400 ; 24 hours
$ORIGIN example.com.
@ IN SOA ns1.example.com. admin.example.com. (
2025102501 ; Serial (必须递增,用于同步)
3600 ; Refresh
1800 ; Retry
604800 ; Expire
86400 ) ; Minimum TTL
; Name Servers (NS 记录)
IN NS ns1.example.com.
; A Records (主机记录)
ns1 IN A 192.168.1.100
www IN A 192.168.1.100
; 可以添加更多记录,
; mail IN A 192.168.1.101
; ftp IN A 192.168.1.102
关键字段解释:
$TTL:默认的生存时间,86400 秒(24小时)。$ORIGIN:设置默认域名,这样后面的记录就可以简写(如www就代表www.example.com)。SOA(Start of Authority):权威记录,一个区域必须有且仅有一个 SOA 记录。ns1.example.com.:主域名服务器的 FQDN。admin.example.com.:管理员的邮箱地址(用 代替 )。Serial:序列号。当你修改了任何 DNS 记录后,必须递增这个数字,否则从 DNS 服务器不会重新同步数据。
NS:域名服务器记录,告诉外界谁来负责解析这个域名。A:地址记录,将主机名映射到 IPv4 地址。
步骤 3.4: 创建反向解析区域数据文件
同样,我们创建反向解析的数据文件。
# 复制模板 sudo cp -p named.loopback 192.168.1.zone # 编辑文件 sudo vim /var/named/192.168.1.zone
替换为:
;
; BIND reverse data file for 192.168.1.0/24
;
$TTL 86400
$ORIGIN 1.168.192.in-addr.arpa.
@ IN SOA ns1.example.com. admin.example.com. (
2025102501 ; Serial
3600 ; Refresh
1800 ; Retry
604800 ; Expire
86400 ) ; Minimum TTL
IN NS ns1.example.com.
; PTR Records (指针记录)
100 IN PTR www.example.com.
; 如果有其他 IP,继续添加:
; 101 IN PTR mail.example.com.
关键字段解释:
$ORIGIN:这里是反向解析的区域名称。PTR:指针记录,将 IP 地址映射到域名。100对应的是168.1.100的主机部分。
启动并设置开机自启
配置完成后,启动 BIND 服务并设置为开机自启。
对于 CentOS / RHEL
# 启动服务 sudo systemctl start named # 设置开机自启 sudo systemctl enable named # 检查服务状态 sudo systemctl status named
对于 Ubuntu / Debian
# 启动服务 sudo systemctl start bind9 # 设置开机自启 sudo systemctl enable bind9 # 检查服务状态 sudo systemctl status bind9
如果服务启动失败,请检查 /var/log/messages (CentOS) 或 /var/log/syslog (Ubuntu) 中的错误日志,排查配置文件语法问题。
配置防火墙
确保防火墙允许 DNS 流量通过。
对于 CentOS / RHEL (使用 firewalld)
# 允许 TCP 和 UDP 的 53 端口 sudo firewall-cmd --permanent --add-service=dns sudo firewall-cmd --reload
对于 Ubuntu / Debian (使用 ufw)
# 允许 TCP 和 UDP 的 53 端口 sudo ufw allow 53/tcp sudo ufw allow 53/udp sudo ufw reload
测试 DNS 服务器
是时候检验我们的成果了!确保你的本地网络或客户端的 DNS 设置指向了你的新 DNS 服务器(168.1.100)。
测试正向解析
使用 dig 或 nslookup 命令。
# 使用 dig (推荐,信息更详细) dig @192.168.1.100 www.example.com # 预期输出中应包含: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: ... ;; ANSWER SECTION: www.example.com. 86400 IN A 192.168.1.100
测试反向解析
# 使用 dig dig @192.168.1.100 -x 192.168.1.100 # 预期输出中应包含: ;; ANSWER SECTION: 100.1.168.192.in-addr.arpa. 86400 IN PTR www.example.com.
如果以上测试都成功,恭喜你!你的 DNS 服务器已经可以正常工作了。
配置转发器 (可选,但强烈推荐)
一个权威 DNS 服务器通常也需要知道如何解析其他域名的地址(google.com),我们可以配置 BIND 将所有它不负责的查询请求转发到公共 DNS 服务器(如 8.8.8 或 1.1.1)。
编辑 /etc/named.conf 文件,在 options 块中添加 forwarders 指令:
options {
listen-on port 53 { any; };
allow-query { any; };
directory "/var/named";
// 在这里添加转发器
forwarders {
8.8.8.8;
1.1.1.1;
};
// 或者,你也可以选择 "只转发,不递归"
// forward only;
};
forwarders:指定一个或多个上游 DNS 服务器的 IP。forward only:如果设置此项,BIND 将永远不会自己进行递归查询,只会把请求转发给forwarders,这可以减轻服务器负担,但有时会降低解析某些特殊域名的灵活性。
修改后,重新加载 BIND 配置(无需重启服务):
# CentOS/RHEL sudo systemctl reload named # Ubuntu/Debian sudo systemctl reload bind9
然后再次测试解析一个外部域名,如 google.com:
dig @192.168.1.100 google.com
你应该能看到它返回了正确的 IP 地址。
最终步骤:配置域名注册商的 NS 记录
你的 DNS 服务器虽然已经可以工作,但全世界还不知道 example.com 的 DNS 服务器是你这台机器,你需要在你的域名注册商(如 GoDaddy, Namecheap, 阿里云等)那里修改域名的 NS 记录。
假设你的 DNS 服务器主机名是 ns1.example.com,IP 是 168.1.100,你需要登录你的域名注册商控制面板,找到 example.com 的 DNS 设置,将其 NS 记录修改为:
- Name Server 1:
ns1.example.com - Name Server 2: (可选,但推荐)
ns2.example.com(你可以设置另一台 IP 不同的服务器作为备份)
注意:NS 记录的修改可能需要几分钟到 48 小时不等才能在全球范围内生效(这个过程称为 DNS 传播)。
至此,你已经成功在 Linux 上搭建了一个功能完整的权威 DNS 服务器!
- 核心软件:BIND
- 核心配置:
named.conf(总控制),zones.conf(区域列表),*.zone(区域数据) - 关键记录:
SOA,NS,A,PTR - 关键操作:修改
Serial号以触发同步,配置防火墙,测试,并在域名注册商处更新 NS 记录。
这份教程涵盖了从安装到配置、测试和最终部署的全过程,希望对你有帮助!
