帮助中心 >
  关于网络安全 >
  在CentOS上自己搭个域名解析服务器

在CentOS上自己搭个域名解析服务器

时间 : 2026-01-19 16:34:58
编辑 : DNS.COM

当你需要在内网环境中管理自己的域名,或者想为本地网络提供更快的DNS解析服务时,自己搭建一个DNS服务器是个实际的选择。在CentOS系统上,最经典的工具就是BINDBerkeley Internet Name Domain)。这套开源的DNS软件套件已经存在了几十年,功能成熟而完整。通过配置BIND,你可以创建自己控制的权威DNS服务器,管理私有域名,或者搭建一个缓存解析器来加速网络访问。

开始之前,确保你有一台运行CentOS 78的服务器,并拥有管理员权限。整个过程从安装软件包开始。BIND的主程序包叫做`bind`,而它的一些实用工具和文档在`bind-utils`中。使用yumdnf命令可以一次性安装它们。

sudo yum install bind bind-utils

安装完成后,BIND的主服务叫做`named`。但在启动它之前,我们需要先进行核心配置。BIND的主要配置文件是`/etc/named.conf`。在修改之前,建议先备份原始文件。

sudo cp /etc/named.conf /etc/named.conf.backup

sudo vi /etc/named.conf

打开配置文件,你会看到一些默认的配置段落。我们需要关注几个关键部分。首先是`options`块,它定义了全局设置。在这里,你需要指定服务器监听的网络接口和端口。如果你想服务器在所有可用IP地址上监听DNS查询(默认端口53),可以保持`listen-on port 53``any`。但为了安全,生产环境通常建议指定具体的IP地址。

options {

listen-on port 53 { 127.0.0.1; 192.168.1.10; };

listen-on-v6 port 53 { ::1; };

directory       "/var/named";

dump-file       "/var/named/data/cache_dump.db";

statistics-file "/var/named/data/named_stats.txt";

memstatistics-file "/var/named/data/named_mem_stats.txt";

allow-query     { localhost; 192.168.1.0/24; };

recursion yes;

};

注意`allow-query`参数,它定义了哪些客户端可以提交DNS查询。这里我们允许本地网络`192.168.1.0/24`和本机进行查询。`recursion yes`表示允许递归查询,这样你的DNS服务器可以帮客户端查询互联网上的其他域名,相当于一个缓存解析器。

接下来是定义区域(zone)的部分。区域文件是DNS记录的实际存放处。假设我们要创建一个私有域`internal.company.local`,我们需要在`/etc/named.conf`文件末尾添加一个正向解析区域和一个反向解析区域的配置。

`named.conf`中,找到类似`zone "." IN { ... }`的部分,在其后添加以下内容:

zone "internal.company.local" IN {

type master;

file "internal.company.local.zone";

allow-update { none; };

};

zone "1.168.192.in-addr.arpa" IN {

type master;

file "192.168.1.rev";

allow-update { none; };

};

第一段定义了一个正向解析区域,类型为`master`(主服务器),区域文件名为`internal.company.local.zone`,它将存放在`/var/named/`目录下。第二段定义了对应的反向解析区域,用于通过IP地址查找主机名。注意反向区域的写法:IP网络部分需要倒序并加上`.in-addr.arpa`后缀。对于`192.168.1.0/24`网段,就是`1.168.192.in-addr.arpa`

现在,我们需要创建刚刚定义的两个区域文件。首先创建正向区域文件:

sudo vi /var/named/internal.company.local.zone

文件内容应包含基本的SOA记录、NS记录以及一些A记录。下面是一个示例:

$TTL 86400

@       IN SOA  ns1.internal.company.local. admin.internal.company.local. (

2024011901 ; serial

3600       ; refresh

1800       ; retry

604800     ; expire

86400      ; minimum TTL

)

IN NS   ns1.internal.company.local.

IN NS   ns2.internal.company.local.

ns1     IN A    192.168.1.10

ns2     IN A    192.168.1.11

www     IN A    192.168.1.100

mail    IN A    192.168.1.101

db      IN A    192.168.1.102

第一行的`$TTL`设置默认的生存时间。SOA记录是每个区域文件必需的起始授权记录,其中包含了序列号(每次修改文件后需要递增这个数字)、刷新时间等参数。接着定义了两个NS记录指向该域的名称服务器。后面是具体的A记录,将主机名映射到IP地址。

然后创建反向区域文件:

sudo vi /var/named/192.168.1.rev

内容如下:

$TTL 86400

@ IN SOA ns1.internal.company.local. admin.internal.company.local. (

2024011901 ; serial

3600       ; refresh

1800       ; retry

604800     ; expire

86400      ; minimum TTL

)

IN NS ns1.internal.company.local.

IN NS ns2.internal.company.local.

10  IN PTR ns1.internal.company.local.

11  IN PTR ns2.internal.company.local.

100 IN PTR www.internal.company.local.

101 IN PTR mail.internal.company.local.

102 IN PTR db.internal.company.local.

反向区域文件的结构类似,但记录类型是PTR,用于将IP地址映射回主机名。注意PTR记录中只需要写IP地址的最后一部分(主机号)。

创建完区域文件后,需要正确设置文件权限和所有权。BIND通常以`named`用户身份运行,所以这些文件需要允许该用户读取。

sudo chown root:named /var/named/internal.company.local.zone

sudo chown root:named /var/named/192.168.1.rev

sudo chmod 640 /var/named/internal.company.local.zone

sudo chmod 640 /var/named/192.168.1.rev

接下来,我们需要配置SELinux和防火墙,以允许DNS服务正常运行。如果系统启用了SELinux,需要确保相关上下文正确。可以使用`semanage`命令添加DNS服务所需的端口上下文,但通常BINDRPM包已经包含了必要的SELinux策略。

对于防火墙,需要放行DNS服务使用的53端口(TCPUDP):

sudo firewall-cmd --permanent --add-service=dns

sudo firewall-cmd --reload

现在,在启动服务之前,最好先检查配置文件是否有语法错误。BIND提供了两个有用的工具:`named-checkconf`检查主配置文件,`named-checkzone`检查区域文件。

sudo named-checkconf /etc/named.conf

sudo named-checkzone internal.company.local /var/named/internal.company.local.zone

sudo named-checkzone 1.168.192.in-addr.arpa /var/named/192.168.1.rev

如果没有错误输出,就可以启动并启用BIND服务了:

sudo systemctl start named

sudo systemctl enable named

要验证服务是否正常运行,可以查看服务状态和监听端口:

sudo systemctl status named

sudo netstat -tulpn | grep :53

现在,你可以在同一网络中的另一台机器上测试这个DNS服务器。将测试机的DNS服务器设置为你的BIND服务器IP地址,然后使用`dig``nslookup`命令查询。

# 在客户端机器上测试

dig www.internal.company.local @192.168.1.10

dig -x 192.168.1.100 @192.168.1.10

如果一切正常,你会得到正确的解析结果。你还可以测试递归查询功能,比如查询一个互联网域名,看BIND服务器是否能正确返回结果。

在实际使用中,你可能需要定期维护。每次修改区域文件后,记得增加SOA记录中的序列号,然后重新加载BIND配置:

sudo systemctl reload named

BIND的日志默认记录在`/var/log/messages`中,但你也可以在`/etc/named.conf`中配置更详细的日志记录。监控这些日志有助于发现问题,比如大量的查询失败或拒绝服务尝试。

安全方面,除了防火墙配置,还可以考虑使用TSIG(事务签名)来保护区域传输,或者将递归查询限制在更小的客户端范围。对于暴露在公网上的DNS服务器,还需要注意防止DNS放大攻击等威胁。

搭建自己的BIND服务器虽然需要一些初始配置工作,但它给你带来了完全的掌控权。你可以在内网中创建任意私有域名,快速修改解析记录而无需等待公共DNS传播,并且通过缓存加速网络访问。当基本配置运行起来后,你可以进一步探索BIND的高级特性,如视图(views)实现内外网解析分离、DNSSEC配置增加安全性等。这第一步,就是从安装和配置那几个核心文件开始的。

DNS Becky
DNS Amy
DNS Luna
标题
电子邮件地址
类型
信息
验证码
提交