在CentOS上自己搭个域名解析服务器
当你需要在内网环境中管理自己的域名,或者想为本地网络提供更快的DNS解析服务时,自己搭建一个DNS服务器是个实际的选择。在CentOS系统上,最经典的工具就是BIND(Berkeley Internet Name Domain)。这套开源的DNS软件套件已经存在了几十年,功能成熟而完整。通过配置BIND,你可以创建自己控制的权威DNS服务器,管理私有域名,或者搭建一个缓存解析器来加速网络访问。
开始之前,确保你有一台运行CentOS 7或8的服务器,并拥有管理员权限。整个过程从安装软件包开始。BIND的主程序包叫做`bind`,而它的一些实用工具和文档在`bind-utils`中。使用yum或dnf命令可以一次性安装它们。
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服务所需的端口上下文,但通常BIND的RPM包已经包含了必要的SELinux策略。
对于防火墙,需要放行DNS服务使用的53端口(TCP和UDP):
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配置增加安全性等。这第一步,就是从安装和配置那几个核心文件开始的。
CN
EN