凌峰创科服务平台

Linux如何搭建DNS服务器?

在Linux环境下搭建DNS(Domain Name System)服务器是网络管理中的一项核心任务,它主要负责将人类易于记忆的域名解析为机器能够识别的IP地址,在企业内网或实验环境中,搭建私有DNS服务器不仅可以加快解析速度,还能通过自定义域名方便地管理内部资源,目前最常用的DNS服务软件是BIND(Berkeley Internet Name Domain),以下将以CentOS 7/8或类似的RHEL系Linux发行版为例,详细介绍使用BIND搭建DNS主服务器的全过程。

Linux如何搭建DNS服务器?-图1
(图片来源网络,侵删)

环境准备与软件安装

在开始之前,必须确保服务器拥有一个静态的IP地址,因为DNS服务器需要稳定的网络标识,假设我们的服务器IP为 168.1.10,域名为 example.com

通过YUM包管理器安装BIND软件包,打开终端,执行以下命令:

yum install -y bind bind-utils

安装完成后,系统会生成主配置文件和区域文件目录。bind-utils 包含了 nslookupdig 等测试工具,是排查DNS故障的必备工具集。

主配置文件修改

BIND的核心配置文件位于 /etc/named.conf,为了安全和功能需求,我们需要修改该文件中的监听地址和访问控制权限。

Linux如何搭建DNS服务器?-图2
(图片来源网络,侵删)

使用文本编辑器(如vim)打开文件:

vim /etc/named.conf

主要修改以下两个部分:

  1. 监听设置:找到 listen-on port 53 项,默认通常只监听 0.0.1(localhost),需要将其修改为服务器的实际IP地址 168.1.10,或者直接改为 any 以监听所有接口。
  2. 查询权限:找到 allow-query 项,默认可能只允许本地查询,建议修改为 any 或者指定特定的内网网段(如 168.1.0/24),以允许局域网内的其他设备向该服务器发起DNS请求。

为了防止DNS放大攻击,建议保留 recursion no;(如果该服务器仅作为权威DNS)或严格限制递归查询的网段,修改后的配置片段大致如下:

options {
    listen-on port 53 { 192.168.1.10; };
    directory       "/var/named";
    allow-query     { any; };
    recursion yes;  // 仅在可信内网环境中开启
    ...
};

配置正向与反向解析区域

/etc/named.conf 文件的末尾,我们需要定义区域,告诉BIND我们要管理哪些域名。

  1. 正向解析区域:将域名解析为IP。
  2. 反向解析区域:将IP解析为域名(可选,但在某些邮件服务器验证场景中必需)。

named.conf 中添加如下配置:

zone "example.com" IN {
    type master;
    file "example.com.zone";
    allow-update { none; };
};
zone "1.168.192.in-addr.arpa" IN {
    type master;
    file "192.168.1.zone";
    allow-update { none; };
};

这里 file 参数指定了区域数据文件的名称,这些文件默认存放在 /var/named/ 目录下。

创建区域数据文件

进入 /var/named/ 目录,创建正向解析文件 example.com.zone,我们可以参考 named.localhost 模板来创建。

正向解析文件内容示例:

$TTL 86400
@       IN SOA  ns1.example.com. root.example.com. (
                                        0       ; serial
                                        1D      ; refresh
                                        1H      ; retry
                                        1W      ; expire
                                        3H )    ; minimum
        IN NS   ns1.example.com.
ns1     IN A    192.168.1.10
www     IN A    192.168.1.100
mail    IN A    192.168.1.101

在此文件中,SOA 记录定义了授权起始信息,NS 记录指定了名称服务器,A 记录则将主机名映射到IP地址,注意,域名末尾的“.”代表根域,不能省略。

接下来创建反向解析文件 168.1.zone,用于IP到域名的映射:

$TTL 86400
@       IN SOA  ns1.example.com. root.example.com. (
                                        0       ; serial
                                        1D      ; refresh
                                        1H      ; retry
                                        1W      ; expire
                                        3H )    ; minimum
        IN NS   ns1.example.com.
10      IN PTR  ns1.example.com.
100     IN PTR  www.example.com.

这里使用的是 PTR 指针记录,前面的数字(如10)代表IP地址的最后一段。

权限检查与服务启动

配置文件编写完毕后,必须检查语法错误并调整文件权限。

  1. 语法检查:使用 named-checkconf 检查主配置文件,使用 named-checkzone 检查区域文件。
    named-checkconf
    named-checkzone example.com /var/named/example.com.zone
  2. 权限修复:BIND对文件权限非常敏感,必须确保 /var/named/ 下的文件所有者为 named
    chown named:named /var/named/*.zone
  3. 启动服务:启动named服务并设置开机自启。
    systemctl start named
    systemctl enable named
  4. 防火墙配置:不要忘记开放防火墙的53端口(UDP和TCP)。
    firewall-cmd --permanent --add-service=dns
    firewall-cmd --reload

验证测试

将测试机器的DNS服务器地址修改为 168.1.10,使用 nslookupdig 命令进行测试。

nslookup www.example.com 192.168.1.10

如果返回配置中设定的IP地址 168.1.100,则说明DNS服务器搭建成功。


相关问答FAQs

Q1: 在修改了区域文件(如增加了一条A记录)后,为什么使用nslookup查询时仍然是旧的IP地址或查不到?

A1: 这通常是因为修改后没有重启BIND服务或序列号未更新导致的,DNS服务器在读取区域文件时会缓存数据,解决方法分两步:

  1. 更新序列号:在区域文件中,必须手动将 SOA 记录中的 serial(序列号)数值加1,这是通知从服务器(Slave)或自身服务数据已变更的标准机制。
  2. 重启服务:执行 systemctl restart named 命令,强制服务重新加载配置文件,如果仍然不行,请检查客户端的DNS缓存(如Windows下的 ipconfig /flushdns)。

Q2: 配置文件中域名末尾的“.”(点)有什么特殊含义?如果不加会怎样?

A2: 在BIND配置中,末尾的点(.)代表“根域”,表示这是一个“完全限定域名”(FQQN),如果不加这个点,BIND会自动将当前的区域名称(即 $ORIGIN 或 zone名称)追加到后面。 在 example.com 的区域文件中,如果你写 www,系统会解析为 www.example.com.;如果你写 www.example.com(没加点),系统会错误地将其解析为 www.example.com.example.com.,导致解析失败,除了简写的主机名外,完整的域名后面务必加上点。

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