凌峰创科服务平台

CentOS7如何搭建DNS服务器?

  1. 作为内部局域网的 DNS 服务器:为内网客户端提供域名解析,并缓存外部域名查询结果。
  2. 作为权威 DNS 服务器:管理你自己的域名(example.com),使其在互联网上可被访问。

第零步:准备工作

  1. 操作系统:一台已经安装好的 CentOS 7 服务器。
  2. 网络配置:确保服务器有静态 IP 地址,并且网络连接正常。
  3. 主机名:为服务器设置一个有意义的主机名,dns-server.example.com
  4. 防火墙和 SELinux:这是 CentOS 服务器配置中至关重要的一步,必须正确配置才能让 DNS 服务正常工作。

更新系统

sudo yum update -y

设置主机名

# 将 hostname.example.com 替换为你自己的主机名
sudo hostnamectl set-hostname dns-server.example.com

配置防火墙

# 开放 DNS 服务所需的端口 (TCP/UDP 53)
sudo firewall-cmd --permanent --add-service=dns
# 重新加载防火墙规则使其生效
sudo firewall-cmd --reload

配置 SELinux

SELinux 默认是 enforcing(强制)模式,这会限制 BIND 的行为,为了简化配置,我们将其设置为 permissive(宽容)模式,它会记录违规行为但不阻止,在生产环境中,更推荐使用 semanage 工具来添加正确的策略,但本教程为了简单,先采用此方法。

CentOS7如何搭建DNS服务器?-图1
(图片来源网络,侵删)
# 查看当前 SELinux 状态
sestatus
# 临时设置为 permissive 模式 (重启后失效)
sudo setenforce 0
# 永久设置为 permissive 模式 (需要重启)
# sudo nano /etc/selinux/config
# 将 SELINUX=enforcing 改为 SELINUX=permissive
# sudo reboot

安全提示:在生产环境中,不建议直接关闭 SELinux,更好的做法是安装 policycoreutils-python 包,然后使用 semanage 命令为 BIND 创建正确的策略文件。


第一步:安装 BIND

sudo yum install bind bind-utils -y
  • bind:DNS 服务器主程序。
  • bind-utils:包含客户端工具,如 dig, nslookup, host 等,用于测试 DNS 服务。

安装完成后,BIND 服务会自动启动,我们可以检查一下状态:

sudo systemctl status named

如果服务没有启动,可以手动启动并设置为开机自启:

sudo systemctl start named
sudo systemctl enable named

第二步:配置 BIND

BIND 的主要配置文件是 /etc/named.conf,其他区域文件(zone files)通常存放在 /var/named/ 目录下。

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

备份原始配置文件

sudo cp /etc/named.conf /etc/named.conf.bak

编辑主配置文件

sudo nano /etc/named.conf

我们需要修改以下几个关键部分:

a) 全局选项 在文件开头,可以设置一些全局参数,如监听的地址和允许查询的客户端。

options {
    # 监听所有网络接口上的 53 端口
    listen-on port 53 { any; };
    # 监听 IPv6
    listen-on-v6 port 53 { any; };
    # 允许任何客户端查询(对于缓存/转发服务器)
    # 或者限制为特定网段,{ 192.168.1.0/24; localhost; };
    allow-query { any; };
    # 将 DNS 查询请求转发到上游 DNS 服务器(8.8.8.8)
    # 这对于内部 DNS 服务器至关重要
    forwarders { 8.8.8.8; 1.1.1.1; };
    # 区域文件存放目录
    directory       "/var/named";
    # ... 其他配置保持不变 ...
};

b) 区域定义 区域定义了你负责管理的 DNS 区域(即一个域名)。

// 这是 localhost 的反向解析区域
zone "localhost" IN {
    type master;
    file "named.localhost";
    allow-update { none; };
};
// 这是 localhost 的正向解析区域
zone "0.0.127.in-addr.arpa" IN {
    type master;
    file "named.loopback";
    allow-update { none; };
};
// --- 在这里添加你自己的区域 ---
// 为 example.com 创建一个正向解析区域
zone "example.com" IN {
    type master;
    file "example.com.zone";
};
// 为 example.com 创建一个反向解析区域
// 假设你的服务器 IP 是 192.168.1.100,那么网络段是 192.168.1.0/24
zone "1.168.192.in-addr.arpa" IN {
    type master;
    file "192.168.1.db";
};

c) 控制访问 为了安全,最好限制外部对区域文件的修改。

CentOS7如何搭建DNS服务器?-图3
(图片来源网络,侵删)
// 在文件末尾添加
controls {
    inet 127.0.0.1 allow { localhost; } keys { "rndc-key"; };
};

保存并退出 named.conf 文件 (Ctrl+X, Y, Enter)。


第三步:创建区域文件

我们需要为刚才在 named.conf 中定义的区域创建具体的数据库文件。

设置正确的文件权限

BIND 进程 (named) 需要对区域文件有读取权限,默认情况下,/var/named 目录的权限是正确的,但最好确保一下。

sudo chown root:named /var/named/*
sudo chmod 640 /var/named/*

创建正向解析区域文件 (example.com.zone)

sudo nano /var/named/example.com.zone

并根据你的实际情况修改:

$TTL 1D
@       IN SOA  dns-server.example.com. admin.example.com. (
                        2025102501      ; Serial
                        3600            ; Refresh (1 hour)
                        1800            ; Retry (30 minutes)
                        604800          ; Expire (1 week)
                        86400           ; Minimum (1 day)
                        )
        IN NS   dns-server.example.com.
        IN MX   10  mail.example.com.
; 主机记录
dns-server       IN A    192.168.1.100
www              IN A    192.168.1.101
mail             IN A    192.168.1.102
; 别名记录
ftp              IN CNAME www.example.com.

文件解析

  • $TTL 1D:默认的生存时间为1天。
  • 代表当前区域名 (example.com.)。
  • SOA:起始授权机构,记录了区域的管理信息。
  • Serial:序列号。每次修改此文件后,都必须增加这个数字,否则主从DNS同步会失败。
  • NS:域名服务器记录,指定了谁是这个区域的权威服务器。
  • MX:邮件交换记录,指定了处理该域名的邮件服务器。
  • A:地址记录,将主机名映射到 IPv4 地址。
  • CNAME:规范名称记录,为一个主机名创建别名。

创建反向解析区域文件 (168.1.db)

反向解析是将 IP 地址映射回主机名。

sudo nano /var/named/192.168.1.db
$TTL 1D
@       IN SOA  dns-server.example.com. admin.example.com. (
                        2025102501      ; Serial
                        3600            ; Refresh
                        1800            ; Retry
                        604800          ; Expire
                        86400           ; Minimum
                        )
        IN NS   dns-server.example.com.
; PTR 记录
100     IN PTR  dns-server.example.com.
101     IN PTR  www.example.com.
102     IN PTR  mail.example.com.

文件解析

  • zone 定义中的 168.192.in-addr.arpa 对应的是 IP 168.1.x
  • PTR:指针记录,将 IP 地址的最后一部分(如 100)映射到主机名。

第四步:检查配置并重启服务

在重启 BIND 服务之前,务必检查配置文件语法是否正确。

检查 named.conf 语法

sudo named-checkconf

如果没有任何输出,说明语法正确,如果有错误,它会告诉你具体哪一行有问题。

检查区域文件语法

sudo named-checkzone example.com /var/named/example.com.zone
sudo named-checkzone 1.168.192.in-addr.arpa /var/named/192.168.1.db

如果看到类似 zone example.com/IN: loaded serial 2025102501 的输出,说明区域文件正确。

重启 BIND 服务

sudo systemctl restart named

第五步:测试 DNS 服务器

你可以使用 dignslookup 工具来测试你的 DNS 服务器了。

测试正向解析

客户端机器上,将 DNS 服务器地址设置为你的 CentOS 服务器的 IP (168.1.100),然后进行测试。

# 测试本地域名
dig @192.168.1.100 dns-server.example.com
# 测试 WWW 域名
dig @192.168.1.100 www.example.com
# 查看更详细的响应
dig @192.168.1.100 www.example.com +short

测试反向解析

dig @192.168.1.100 -x 192.168.1.101

测试缓存功能

# 查询一个外部域名
dig @192.168.1.100 www.google.com
# 再次查询,应该会显示从缓存中获取 (cache)
dig @192.168.1.100 www.google.com

第六步:配置客户端

要让局域网内的其他计算机使用这台 DNS 服务器,你需要将它们的 DNS 设置指向这台服务器的 IP 地址。

  • 在 Linux 客户端:编辑 /etc/resolv.conf 文件,将 nameserver 行修改为你的 DNS 服务器 IP。
    sudo nano /etc/resolv.conf
    nameserver 192.168.1.100
  • 在 Windows 客户端
    1. 打开“网络和共享中心” -> “更改适配器设置”。
    2. 右键点击你正在使用的网络连接(如“以太网”或“WLAN”),选择“属性”。
    3. 双击列表中的“Internet 协议版本 4 (TCP/IPv4)”。
    4. 选择“使用下面的 DNS 服务器地址”,并填入 168.1.100

总结与进阶

你已经成功在 CentOS 7 上搭建了一台功能完备的 DNS 服务器!

  • 作为内部 DNS 服务器:它可以为你的内网提供域名解析,并缓存外部查询,加快访问速度。
  • 作为权威 DNS 服务器:它可以为你的域名(如 example.com)在互联网上提供权威解析。

进阶提示

  • 主从 DNS:为了高可用性,你可以配置另一台服务器作为从 DNS,从主 DNS 同步区域文件。
  • DNSSEC:为了增强安全性,可以部署 DNSSEC 来防止 DNS 欺骗和缓存投毒攻击。
  • 视图:使用 BIND 的“视图”功能,可以为不同网段的客户端(例如内网和外网)提供不同的解析结果。
分享:
扫描分享到社交APP
上一篇
下一篇