杰瑞科技汇

Linux搭建DNS教程,详细步骤是怎样的?

本教程将以在 CentOS 7 / RHEL 7Ubuntu 18.04 / 20.04 系统上搭建一个权威 DNS 服务器为例,使其能够解析您自己域名下的记录。


教程大纲

  1. 准备工作
  2. 安装 BIND
  3. 配置 BIND
    • 主配置文件 (named.conf)
    • 区域数据文件 (正向解析 & 反向解析)
  4. 启动并设置开机自启
  5. 配置防火墙
  6. 测试 DNS 服务器
  7. 配置转发器 (可选,推荐)

准备工作

在开始之前,请确保您:

  • 拥有一台 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

打开文件后,进行如下修改:

  1. 设置监听地址:默认情况下,BIND 只监听在 localhost (127.0.0.1),我们需要让它监听在服务器的所有 IP 地址上。 找到 listen-on port 53 { 127.0.0.1; }; 这一行,将其修改为:

    listen-on port 53 { any; };
  2. 允许查询:默认只允许本地查询,我们需要允许任何客户端进行查询。 找到 allow-query { localhost; }; 这一行,将其修改为:

    allow-query { any; };
  3. 设置区域文件路径:为了方便管理,我们可以在文件末尾添加一个 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 解析到 IP 168.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)。

测试正向解析

使用 dignslookup 命令。

# 使用 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.81.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 记录。

这份教程涵盖了从安装到配置、测试和最终部署的全过程,希望对你有帮助!

分享:
扫描分享到社交APP
上一篇
下一篇