从零开始:CentOS系统下搭建DNS服务器的详细教程

前言

如果你希望在CentOS系统上建立自己的DNS服务器,那么这篇文章绝对是你不容错过的宝藏指南。我们提供了详尽的步骤和实用技巧,让你能够轻松完成搭建过程。从安装必要的软件到配置区域文件,我们都将一一为你呈现。无论你的身份是运维人员,还是程序员,抑或是对网络基础设施感兴趣的读者,我相信这篇文章都将为你提供有力的帮助。开始阅读本文吧,开始打造一个高效、可靠的DNS解析服务!

DNS

DNS代表域名系统(Domain Name System),它是互联网中的一项基本服务。DNS是一个分布式的命名系统,用于将人类可读的域名转换成计算机可理解的IP地址。

在互联网上,每个设备都有其唯一的IP地址,如192.168.1.1。然而,人们更容易记住有意义的域名,如google.com或baidu.com等。当您在浏览器中输入域名时,浏览器会发送请求到DNS服务器,并获取与该域名相对应的IP地址。这样,浏览器就可以使用该IP地址与目标服务器进行通信和交互。

DNS系统是一个分层的结构,由许多不同的DNS服务器组成。这些服务器按照层次结构进行组织,每个层次都由不同的组织或机构管理。在顶层,有根DNS服务器,它存储了所有顶级域名服务器的信息。下一层是顶级域名服务器,它存储了特定顶级域名(如.com、.org、.cn等)的DNS记录。最后,有权威DNS服务器,它存储了与具体域名相对应的IP地址。

DNS的作用是解析域名,并将其转换为相应的IP地址,以便设备能够准确地定位和访问目标服务器。它是互联网基础设施中不可或缺的一部分,使得我们能够轻松地浏览网站、发送电子邮件、进行网络通信等。

应用场景

到底有没有必要自己来动手搭建DNS服务器呢?或者说,在什么场景下需要自己动手来搭建DNS服务器?相信每个人的答案可能都不相同。我认为掌握DNS服务器的搭建还是很必要的,至少在下面几种场景下,是需要自己来动手搭建一个DNS服务器的:

  • 局域网内部解析:如果你在局域网中拥有多个设备,希望它们能够通过域名相互访问,而不是仅仅使用 IP 地址,那么你可以搭建一个 DNS 服务器来实现内部解析。这样,你可以使用自定义的域名来访问各个设备,提高网络的可用性和易用性。
  • 域名注册和管理:如果你是一个企业或组织,并且拥有自己的域名,你可能需要搭建一个 DNS 服务器来管理你的域名。通过搭建自己的 DNS 服务器,你可以更灵活地配置域名解析、子域名管理,以及其他 DNS 相关的设置,以满足你的特定需求。
  • 隐藏内部网络拓扑:在某些情况下,你可能希望隐藏你的内部网络拓扑结构,以增加网络的安全性。通过搭建自己的 DNS 服务器,你可以将内部 IP 地址映射为不公开的域名,从而隐藏实际的网络结构。

DNS服务器搭建过程

在一个CentOS 7 系统中安装dns服务器,详细的步骤是什么呢?其实很简单,在CentOS 7上安装DNS服务器通常使用BIND(Berkeley Internet Name Domain)软件,这个软件在上一篇文章CentOS系统的DNS管理:超实用的几种DNS管理工具的安装和使用方法全解析 - 掘金 (juejin.cn)中已经提到过。以下是在CentOS 7上安装BIND DNS服务器的详细步骤:

更新系统的软件包:

sql 复制代码
sudo yum update

安装BIND:

perl 复制代码
sudo yum install bind bind-utils

配置BIND:

打开BIND的主配置文件:

bash 复制代码
sudo nano /etc/named.conf

先来看一下,配置文件中的 options 部分,如下所示:

ini 复制代码
options {
    listen-on port 53 { any; };
    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     { any; };
    recursion yes;
};

上面的配置文件是什么意思?包含了哪些信息呢?这是一个典型的 BIND (Berkeley Internet Name Domain) 配置文件的一部分。BIND 是一个常用的 DNS (Domain Name System) 服务器软件。

这个配置段指定了以下内容:

  • listen-on port 53 { any; };: 指定 DNS 服务器监听的端口为 53,即 DNS 标准端口。any 表示允许任何 IP 地址连接到该端口。
  • directory "/var/named";: 指定存储 BIND 相关文件的目录路径为 "/var/named"。这包括配置文件、区域文件和其他数据文件。
  • dump-file "/var/named/data/cache_dump.db";: 指定缓存转储文件的路径。缓存转储文件用于保存 DNS 缓存的内容。
  • statistics-file "/var/named/data/named_stats.txt";: 指定统计信息文件的路径。该文件记录了 BIND 服务器的运行统计信息,如查询数量、响应时间等。
  • memstatistics-file "/var/named/data/named_mem_stats.txt";: 指定内存统计信息文件的路径。该文件记录了 BIND 服务器使用的内存统计信息。
  • allow-query { any; };: 允许任何主机查询该 DNS 服务器。这样就允许任何主机向该服务器发送 DNS 查询请求。
  • recursion yes;: 启用 DNS 递归查询功能。当 DNS 服务器无法直接解析请求时,它将通过迭代查询其他 DNS 服务器来获取答案。

这只是配置文件的一部分,一般情况下,这部分不需要动,更完整的配置文件通常还包括区域定义、转发设置和安全性配置等。

如果想创建一个自定义的域名,通过域名来访问主机,还需要创建一个新的区域配置文件,以便配置有关域名的信息。打开 named.conf 文件,并在 zone 部分添加以下行,注意是单独配置:

bash 复制代码
zone "fanfu.gx" IN {
        type    master;
        file    "db.fanfu.gx";
        };

上面的配置是BIND 配置文件的一部分,这里我指定了一个名为 "fanfu.gx" 的 DNS 域,并指定了该域的类型为 master,同时指定了该域对应的区域文件为 "db.fanfu.gx"。具体解读一下上面配置的含义:

  • zone "fanfu.gx" IN {: 指定了该区域对应的 DNS 域名为 "fanfu.gx"。
  • type master;: 指定了该域的类型为 master。这意味着该 DNS 服务器是 "fanfu.gx" 域的主服务器,并负责管理该域的所有资源记录。
  • file "db.fanfu.gx";: 指定了该域对应的区域文件为 "db.fanfu.gx"。该文件包含了该域的所有资源记录,如主机名、IP 地址、邮件服务器等。

需要注意的是,区域文件通常包含多个资源记录,不同类型的资源记录有着不同的格式和语法。例如,A 记录用于将主机名映射到 IPv4 地址,MX 记录用于指定邮件服务器等等,后面在区域文件的配置中会再详细说明。

创建区域文件:

在上面的bind配置文件中,只是定义了域名,但是并没有建立起域名与主机的关系,这里创建一个区域配置文件,注意要给这个文件读、写、可执行三种权限。

bash 复制代码
sudo touch /var/named/db.fanfu.gx sudo 
chmod 777 /var/named/db.fanfu.gx

在db.fanfu.gx文件中添加类似以下内容的信息:

ini 复制代码
$TTL 1h
@       IN      SOA     ns1.fanfu.gx. admin.fanfu.gx. (
        2024012001      ; 序列号
        3h              ; 刷新时间
        1h              ; 重试时间
        1w              ; 过期时间
        1h )            ; 默认 TTL
        IN      NS      ns1.fanfu.gx.    ; 指定主域名服务器
        IN      NS      ns2.fanfu.gx.    ; 指定备用域名服务器
@       IN      A       192.168.35.99    ; 指定域名的 IPv4 地址
        ns1     IN      A       192.168.35.100    ; 主域名服务器的 IP 地址
        ns2     IN      A       192.168.35.100    ; 备用域名服务器的 IP 地址

上述配置内容的具体含义:

  • SOA 记录以 @ 表示当前域名,指定了域名的授权来源和一些其他信息,如上指定了主域名服务器为 ns1.fanfu.gx,管理员邮箱为 admin.fanfu.gx,序列号为 2024012001,刷新时间为 3 小时,重试时间为 1 小时,过期时间为 1 周,TTL(Time To Live)为 1 小时。
  • NS 记录指定了域名服务器的名称,如上指定了主域名服务器为 ns1.fanfu.gx,备用域名服务器为 ns2.fanfu.gx。
  • A 记录指定了域名的 IPv4 地址,如上:指定了域名 fanfu.gx 的 IPv4 地址为 192.168.35.99。
  • 还有两条记录指定了域名服务器的 IP 地址,这些记录分别指定了主域名服务器和备用域名服务器的 IPv4 地址为 192.168.35.100。实际来讲应该是两台DNS服务器,一主一备,这里我简化设置成了主备为同一个。

请根据您的网络配置和域名信息修改IP地址和域名。

防火墙要开启53端口,下面是开启53端口,重新启动防火墙以便新开53端口可以生效以及查询已开放端口的命令:

css 复制代码
sudo firewall-cmd --zone=public --add-port=53/tcp --permanent 
sudo firewall-cmd --reload 
sudo firewall-cmd --zone=public --list

接着,启动并启用BIND服务(第二条命令用于把bind服务设置成为开机启动):

bash 复制代码
sudo systemctl start named sudo systemctl enable named

启动bind服务后,可以使用以下命令检查BIND服务的状态:

lua 复制代码
sudo systemctl status named

确保服务已经启动并且没有错误。

在客户端配置DNS:

至此DNS服务端已经搭建好了,DNS服务器的地址是192.168.35.100;在上面的配置中,还指定了主机ip是192.168.35.99的域名是fanfu.gx;现在登陆到主机ip是192.168.35.99的服务器上,更新一下fanfu.gx主机的的DNS地址为192.168.35.100,具体来说就是,在/etc/resolv.conf 文件中添加DNS服务器的IP地址:

nameserver 192.168.35.100

配置完resolv.conf文件后,重启网络服务

systemctl restart NetworkManager

重启网络服务后,注意要检查一下resolv.conf文件的nameserver是否被重置了。如果重启后,发现resolv.conf中的配置被重置,那么在/etc/NetworkManager/NetworkManager.conf中增加下面的配置,然后再重启网络服务,就不会再重置了,这个配置的作用是:告诉NetworkManager不要自动配置DNS服务器。这意味着NetworkManager将不会自动从DHCP服务器或其他来源获取DNS服务器的信息,也不会自动更新/etc/resolv.conf文件。这通常用于在特定网络环境下手动配置DNS设置,或者如果用户希望完全由自己管理DNS设置而不希望NetworkManager进行干预。

ini 复制代码
[main] dns=none

完成上述步骤后,执行下面的命令进行测试验证

ping fanfu.gx

可以看到,配置在CentOS 7系统的DNS服务器正在运行,为你提供域名解析服务。

设置互联网根域和设置DNS转发

CentOS系统搭建DNS服务器后,要不要设置互联网根域和设置DNS转发呢?想要回答这个问题,需要先来看一看什么是设置互联网根域和设置DNS转发以及作用。

设置互联网根域和设置DNS转发是两个不同的概念,它们分别对应着DNS服务器的两种重要功能。

  • 设置互联网根域:在DNS服务器中设置互联网根域(通常表示为".")是指在DNS配置中指定根域的权威解析服务器。互联网根域包含了整个互联网的顶层域名信息,如.com、.org、.net等。通过设置互联网根域,DNS服务器可以进行全局的域名解析,确保能够正常解析并访问互联网上的各种网站和资源。
  • 设置DNS转发:DNS转发是指当本地DNS服务器无法直接解析某个域名时,将DNS查询请求转发给其他上游DNS服务器进行解析的过程。通过设置DNS转发,本地DNS服务器可以向上游DNS服务器请求帮助来解析外部域名,从而提高解析效率和减轻自身的负担。

设置互联网根域和设置DNS转发的作用:

  • 设置互联网根域:确保DNS服务器具有全局的域名解析能力,能够解析并访问互联网上的所有域名和资源。
  • 设置DNS转发:提高本地DNS服务器的解析效率,加快对外部域名的解析速度,并减轻本地DNS服务器的负担。

综而言之,通过正确设置互联网根域和DNS转发,可以保证DNS服务器能够有效地解析互联网上的各种域名,并提供快速、可靠的域名解析服务。

由此可见,如果只是纯纯在局域网内玩一玩,那就没有必要设置互联网根域和设置DNS转发。

既然说到这里,还是要深入一点,继续分享一下在 CentOS 上搭建 DNS 服务器后,设置互联网根域和配置 DNS 转发的步骤:

  • 设置互联网根域

编辑 named.conf 文件:打开 BIND 的主配置文件 named.conf,通常位于 /etc/named.conf。

bash 复制代码
sudo vi /etc/named.conf
  • 配置互联网根域

在 named.conf 中找到 options 部分,然后添加或确保以下行存在(在上面的配置中实际上已经配过了):

ini 复制代码
    options {
        // ...
        recursion yes;
        allow-recursion { localhost; };
        // ...
    };
  1. allow-query { any; };: 允许任何主机查询该 DNS 服务器。这样就允许任何主机向该服务器发送 DNS 查询请求。
  2. recursion yes;: 启用 DNS 递归查询功能。当 DNS 服务器无法直接解析请求时,它将通过迭代查询其他 DNS 服务器来获取答案。
  • 重启 BIND 服务

保存文件后,重启 BIND 服务以应用更改:

sudo systemctl restart named
  • 配置 DNS 转发

编辑 named.conf 文件:打开 BIND 的主配置文件 named.conf,通常位于 /etc/named.conf。

bash 复制代码
sudo vi /etc/named.conf

在 options 部分配置 DNS 转发:在 options 部分添加或确保以下行存在:

ini 复制代码
    options {
        // ...
        forwarders { 8.8.8.8; 8.8.4.4; };  // 使用 Google Public DNS 作为转发服务器,可以根据需要更改
        forward only;
        // ...
    };

forwarders 行指定 DNS 转发服务器的 IP 地址,这里使用了 Google Public DNS 作为示例。你可以根据需要更改为其他 DNS 服务器的 IP 地址。

  • 重启 BIND 服务:

保存文件后,重启 BIND 服务以应用更改:

sudo systemctl restart named

network如何配置DNS服务

在CentOS一个相对低的版本里,是用network来管理网络服务的,那么在 network 服务中配置 DNS 服务需要编辑相应的网络配置文件,通常是 ifcfg 文件,例如 ifcfg-ens33(具体文件名可能因网络接口而异)。

我使用的是CentOS 7 ,安装后的网络接口名为 ens33。请注意,这里使用的是静态 IP 地址和手动配置 DNS 的示例。如果你的网络是动态分配 IP 地址(DHCP),那么 DNS 配置通常会由 DHCP 服务器提供。

打开 ifcfg-ens33 文件进行编辑:

bash 复制代码
sudo vi /etc/sysconfig/network-scripts/ifcfg-ens33

在文件中找到并编辑 DNS1 和 DNS2 行。添加或修改这些行以设置你的首选和备用 DNS 服务器的 IP 地址。示例:

ini 复制代码
DNS1=8.8.8.8 
DNS2=8.8.4.4

请将上述 IP 地址替换为你希望使用的 DNS 服务器的实际地址。

保存并关闭文件。

重启 network 服务以应用更改:

sudo systemctl restart network

以上步骤应该将指定的 DNS 服务器配置到你的网络接口。请记得根据实际情况修改 IP 地址,这里的示例使用的是 Google 的公共 DNS 服务器地址。如果你使用 DHCP,可能需要通过 DHCP 配置文件或网络管理器工具来配置 DNS。

写在最后

如果你觉得这篇文章对你有所帮助,不妨点击点赞按钮,让更多的人看到这篇优质的技术分享。同时,别忘了将这篇文章收藏起来,以备日后查阅。这样,你就能随时回顾和复习文章中的重要知识点,确保你的技术水平始终保持在最高水平。

相关推荐
keep__go1 小时前
Linux 批量配置互信
linux·运维·服务器·数据库·shell
矛取矛求1 小时前
Linux中给普通账户一次性提权
linux·运维·服务器
Fanstay9851 小时前
在Linux中使用Nginx和Docker进行项目部署
linux·nginx·docker
大熊程序猿1 小时前
ubuntu 安装kafka-eagle
linux·ubuntu·kafka
杨哥带你写代码2 小时前
网上商城系统:Spring Boot框架的实现
java·spring boot·后端
camellias_2 小时前
SpringBoot(二十一)SpringBoot自定义CURL请求类
java·spring boot·后端
背水2 小时前
初识Spring
java·后端·spring
晴天飛 雪2 小时前
Spring Boot MySQL 分库分表
spring boot·后端·mysql
weixin_537590452 小时前
《Spring boot从入门到实战》第七章习题答案
数据库·spring boot·后端