CentOS 7如何配置BIND作为私网DNS服务器
介绍
管理服务器配置和基础设施的一个重要部分包括通过设置适当的域名系统 (DNS) 维护一种按名称查找网络接口和 IP 地址的简单方法。使用完全限定的域名 (FQDN) 而不是 IP 地址来指定网络地址可以简化服务和应用程序的配置,并提高配置文件的可维护性。为您的专用网络设置您自己的 DNS 是改进服务器管理的好方法。
在本教程中,我们将介绍如何在 CentOS 7 上使用 BIND 名称服务器软件 (BIND9) 设置内部 DNS 服务器,您的虚拟专用服务器 (VPS) 可以使用它来解析私有主机名和私有 IP地址。这提供了一种管理内部主机名和私有 IP 地址的集中方式,当您的环境扩展到多个主机时,这是必不可少的。
可以在此处找到本教程的 Ubuntu 版本。
先决条件
要完成本教程,您需要具备以下条件:
- 一些服务器在同一个数据中心运行并启用了私有网络
- 用作主 DNS 服务器的新 VPS,ns1
- 可选:用作辅助 DNS 服务器的新 VPS,ns2
- 对上述所有内容的根访问权限(此处为第 1-4 步)
如果您不熟悉 DNS 概念,建议您至少阅读我们的 DNS 管理简介的前三部分。
示例主机
出于示例目的,我们将假设以下内容:
- 我们有两个现有的 VPS,分别称为“host1”和“host2”
- 两个 VPS 都存在于 nyc3 数据中心
- 两个 VPS 都启用了私有网络(并且都在 10.128.0.0/16 子网上)
- 这两个 VPS 都以某种方式与我们在 \example.com 上运行的 Web 应用程序相关
有了这些假设,我们决定使用使用 \host1.nyc3.example.com 的命名方案是有意义的。请参阅下表相关详细信息:
Host | Role | Private FQDN | Private IP Address |
---|---|---|---|
host1 | Generic Host 1 | host1.nyc3.example.com | 10.128.100.101 |
host2 | Generic Host 2 | host2.nyc3.example.com | 10.128.200.102 |
注意:您现有的设置会有所不同,但示例名称和 IP 地址将用于演示如何配置 DNS 服务器以提供正常运行的内部 DNS。通过将主机名和私有 IP 地址替换为您自己的,您应该能够轻松地使此设置适应您自己的环境。在您的命名方案中没有必要使用数据中心的区域名称,但我们在这里使用它来表示这些主机属于特定数据中心的专用网络。如果您使用多个数据中心,则可以在每个数据中心内设置一个内部 DNS。
我们的目标
到本教程结束时,我们将拥有一个主 DNS 服务器 ns1 和一个可选的辅助 DNS 服务器 ns2,它将用作备份。
这是一个包含示例名称和 IP 地址的表格:
Host | Role | Private FQDN | Private IP Address |
---|---|---|---|
ns1 | Primary DNS Server | ns1.nyc3.example.com | 10.128.10.11 |
ns2 | Secondary DNS Server | ns2.nyc3.example.com | 10.128.20.12 |
让我们开始安装我们的主 DNS 服务器 ns1。
在 DNS 服务器上安装 BIND
注意:以红色 突出显示的文本很重要!它通常用于表示需要用您自己的设置替换的东西,或者应该修改或添加到配置文件中的东西。例如,如果您看到类似 host1.nyc3.example.com 的内容,请将其替换为您自己服务器的 FQDN。同样,如果您看到 host1_private_IP,请将其替换为您自己服务器的私有 IP 地址。
在两个 DNS 服务器上,ns1 和 ns2,使用 yum 安装 BIND:
- sudo yum install bind bind-utils
输入 y
确认提示。
现在已经安装了 BIND,让我们配置主 DNS 服务器。
配置主 DNS 服务器
BIND 的配置由多个文件组成,这些文件来自主配置文件 named.conf
。这些文件名以 \named 开头,因为这是 BIND 运行的进程的名称。我们将从配置选项文件开始。
配置绑定
BIND 的进程被称为命名。因此,许多文件指的是 \named 而不是 \BIND。
在 ns1 上,打开 named.conf
文件进行编辑:
- sudo vi /etc/named.conf
在现有的 options
块之上,创建一个名为 \trusted 的新 ACL 块。我们将在此处定义我们将允许递归 DNS 查询的客户端列表(即您的服务器位于相同的数据中心作为 ns1)。使用我们的示例私有 IP 地址,我们将添加 ns1、ns2、host1 和 host2 到我们值得信赖的客户名单:
acl "trusted" {
10.128.10.11; # ns1 - can be set to localhost
10.128.20.12; # ns2
10.128.100.101; # host1
10.128.200.102; # host2
};
现在我们有了受信任的 DNS 客户端列表,我们将要编辑 options
块。将ns1的私有IP地址添加到listen-on port 53
指令,并注释掉listen-on-v6
行:
options {
listen-on port 53 { 127.0.0.1; 10.128.10.11; };
# listen-on-v6 port 53 { ::1; };
...
在这些条目下方,将 allow-transfer
指令从 \none” 更改为 ns2 的私有 IP 地址。同时,将 allow-query
指令从 \localhost” 更改为\“信任”:
...
options {
...
allow-transfer { 10.128.20.12; }; # disable zone transfers by default
...
allow-query { trusted; }; # allows queries from "trusted" clients
...
在文件末尾,添加以下行:
include "/etc/named/named.conf.local";
现在保存并退出 named.conf
。上面的配置指定只有您自己的服务器(“受信任的”服务器)才能查询您的 DNS 服务器。
接下来,我们将配置本地文件,以指定我们的 DNS 区域。
配置本地文件
在 ns1 上,打开 named.conf.local
文件进行编辑:
- sudo vi /etc/named/named.conf.local
该文件应该是空的。在这里,我们将指定我们的正向和反向区域。
使用以下行添加前向区域(用您自己的区域名称替换):
zone "nyc3.example.com" {
type master;
file "/etc/named/zones/db.nyc3.example.com"; # zone file path
};
假设我们的私有子网是10.128.0.0/16,通过以下几行添加反向区域(注意我们的反向区域名称以\128.10开头,这是\10.128的八位字节反转”):
zone "128.10.in-addr.arpa" {
type master;
file "/etc/named/zones/db.10.128"; # 10.128.0.0/16 subnet
};
如果您的服务器跨越多个私有子网但位于同一数据中心,请务必为每个不同的子网指定一个额外的区域和区域文件。添加完所有所需区域后,保存并退出 named.conf.local
文件。
现在我们的区域在 BIND 中指定了,我们需要创建相应的正向和反向区域文件。
创建前向区文件
正向区域文件是我们为正向 DNS 查找定义 DNS 记录的地方。也就是说,当 DNS 收到名称查询时,例如“host1.nyc3.example.com”,它会在正向区域文件中查找以解析 host1 对应的私有 IP 地址。
让我们创建区域文件所在的目录。根据我们的 named.conf.local 配置,该位置应该是 /etc/named/zones
:
- sudo chmod 755 /etc/named
- sudo mkdir /etc/named/zones
现在让我们编辑我们的前向区域文件:
- sudo vi /etc/named/zones/db.nyc3.example.com
首先,您需要添加 SOA 记录。将突出显示的 ns1 FQDN 替换为您自己的 FQDN,然后将第二个 \nyc3.example.com 替换为您自己的域。每次编辑区域文件时,您都应该在修改之前递增 serial 值重新启动 named
进程——我们将把它递增到 \3。它应该看起来像这样:
@ IN SOA ns1.nyc3.example.com. admin.nyc3.example.com. (
3 ; Serial
604800 ; Refresh
86400 ; Retry
2419200 ; Expire
604800 ) ; Negative Cache TTL
之后,使用以下行添加您的名称服务器记录(用您自己的名称替换名称)。请注意,第二列指定这些是 \NS 记录:
; name servers - NS records
IN NS ns1.nyc3.example.com.
IN NS ns2.nyc3.example.com.
然后为属于该区域的主机添加 A 记录。这包括名称以“.nyc3.example.com”结尾的任何服务器(替换名称和私有 IP 地址)。使用我们的示例名称和私有 IP 地址,我们将为 ns1 添加 A 记录、ns2、host1 和 host2 像这样:
; name servers - A records
ns1.nyc3.example.com. IN A 10.128.10.11
ns2.nyc3.example.com. IN A 10.128.20.12
; 10.128.0.0/16 - A records
host1.nyc3.example.com. IN A 10.128.100.101
host2.nyc3.example.com. IN A 10.128.200.102
保存并退出 db.nyc3.example.com
文件。
我们的最终示例前向区域文件如下所示:
- $TTL 604800
- @ IN SOA ns1.nyc3.example.com. admin.nyc3.example.com. (
- 3 ; Serial
- 604800 ; Refresh
- 86400 ; Retry
- 2419200 ; Expire
- 604800 ) ; Negative Cache TTL
- ;
- ; name servers - NS records
- IN NS ns1.nyc3.example.com.
- IN NS ns2.nyc3.example.com.
-
- ; name servers - A records
- ns1.nyc3.example.com. IN A 10.128.10.11
- ns2.nyc3.example.com. IN A 10.128.20.12
-
- ; 10.128.0.0/16 - A records
- host1.nyc3.example.com. IN A 10.128.100.101
- host2.nyc3.example.com. IN A 10.128.200.102
现在让我们转到反向区域文件。
创建反向区域文件
反向区域文件是我们为反向 DNS 查找定义 DNS PTR 记录的地方。也就是说,当 DNS 收到 IP 地址查询时,例如“10.128.100.101”,它将在反向区域文件中查找以解析相应的 FQDN,“host1.nyc3.example.com”这个案例。
在 ns1 上,为 named.conf.local
文件中指定的每个反向区域创建一个反向区域文件。
编辑与 named.conf.local
中定义的反向区域相对应的反向区域文件:
- sudo vi /etc/named/zones/db.10.128
以与前向区域文件相同的方式,将突出显示的 ns1 FQDN 替换为您自己的 FQDN,然后将第二个 \nyc3.example.com 替换为您自己的域。每次编辑区域文件时,您应该增加 <serial 值,然后再重新启动 named
进程——我们会将其递增到 \3。它应该看起来像这样:
@ IN SOA ns1.nyc3.example.com. admin.nyc3.example.com. (
3 ; Serial
604800 ; Refresh
86400 ; Retry
2419200 ; Expire
604800 ) ; Negative Cache TTL
之后,使用以下行添加您的名称服务器记录(用您自己的名称替换名称)。请注意,第二列指定这些是 \NS 记录:
; name servers - NS records
IN NS ns1.nyc3.example.com.
IN NS ns2.nyc3.example.com.
然后为其 IP 地址位于您正在编辑的区域文件的子网上的所有服务器添加 PTR
记录。在我们的示例中,这包括我们所有的主机,因为它们都位于 10.128.0.0/16 子网上。请注意,第一列由倒序排列的服务器私有 IP 地址的最后两个八位字节组成。请务必替换名称和私有 IP 地址以匹配您的服务器:
; PTR Records
11.10 IN PTR ns1.nyc3.example.com. ; 10.128.10.11
12.20 IN PTR ns2.nyc3.example.com. ; 10.128.20.12
101.100 IN PTR host1.nyc3.example.com. ; 10.128.100.101
102.200 IN PTR host2.nyc3.example.com. ; 10.128.200.102
保存并退出反向区域文件(如果您需要添加更多反向区域文件,请重复此部分)。
我们的最终示例反向区域文件如下所示:
- $TTL 604800
- @ IN SOA nyc3.example.com. admin.nyc3.example.com. (
- 3 ; Serial
- 604800 ; Refresh
- 86400 ; Retry
- 2419200 ; Expire
- 604800 ) ; Negative Cache TTL
- ; name servers
- IN NS ns1.nyc3.example.com.
- IN NS ns2.nyc3.example.com.
-
- ; PTR Records
- 11.10 IN PTR ns1.nyc3.example.com. ; 10.128.10.11
- 12.20 IN PTR ns2.nyc3.example.com. ; 10.128.20.12
- 101.100 IN PTR host1.nyc3.example.com. ; 10.128.100.101
- 102.200 IN PTR host2.nyc3.example.com. ; 10.128.200.102
检查 BIND 配置语法
运行以下命令来检查 named.conf*
文件的语法:
- sudo named-checkconf
如果您命名的配置文件没有语法错误,您将返回到您的 shell 提示符并且看不到任何错误消息。如果您的配置文件有问题,请查看错误消息和配置主 DNS 服务器部分,然后重试 named-checkconf
。
named-checkzone
命令可用于检查区域文件的正确性。它的第一个参数指定一个区域名称,第二个参数指定相应的区域文件,这两个参数都在 named.conf.local
中定义。
例如,要检查 \nyc3.example.com 前向区域配置,请运行以下命令(更改名称以匹配您的前向区域和文件):
- sudo named-checkzone nyc3.example.com /etc/named/zones/db.nyc3.example.com
并检查 \128.10.in-addr.arpa” 反向区域配置,运行以下命令(更改数字以匹配您的反向区域和文件):
- sudo named-checkzone 128.10.in-addr.arpa /etc/named/zones/db.10.128
当您的所有配置和区域文件都没有错误时,您应该准备好重新启动 BIND 服务。
开始绑定
启动绑定:
- sudo systemctl start named
现在您将要启用它,因此它将在启动时启动:
- sudo systemctl enable named
您的主 DNS 服务器现已设置并准备好响应 DNS 查询。让我们继续创建辅助 DNS 服务器。
配置辅助 DNS 服务器
在大多数环境中,最好设置一个辅助 DNS 服务器,以便在主服务器不可用时响应请求。幸运的是,辅助 DNS 服务器更容易配置。
在 ns2 上,编辑 named.conf
文件:
- sudo vi /etc/named.conf
注意:如果您希望跳过这些说明,您可以复制 ns1 的 named.conf
文件并修改它以监听 ns2 的私有 IP 地址,并且不允许传输。
在现有的 options
块之上,创建一个名为 \trusted 的新 ACL 块。我们将在此处定义我们将允许递归 DNS 查询的客户端列表(即您的服务器位于相同的数据中心作为 ns1)。使用我们的示例私有 IP 地址,我们将添加 ns1、ns2、host1 和 host2 到我们值得信赖的客户名单:
acl "trusted" {
10.128.10.11; # ns1 - can be set to localhost
10.128.20.12; # ns2
10.128.100.101; # host1
10.128.200.102; # host2
};
现在我们有了受信任的 DNS 客户端列表,我们将要编辑 options
块。将ns1的私有IP地址添加到listen-on port 53
指令,并注释掉listen-on-v6
行:
options {
listen-on port 53 { 127.0.0.1; 10.128.20.12; };
# listen-on-v6 port 53 { ::1; };
...
将 allow-query
指令从“localhost”更改为“trusted”:
...
options {
...
allow-query { trusted; }; # allows queries from "trusted" clients
...
在文件末尾,添加以下行:
include "/etc/named/named.conf.local";
现在保存并退出 named.conf
。上面的配置指定只有您自己的服务器(“受信任的”服务器)才能查询您的 DNS 服务器。
接下来,我们将配置本地文件,以指定我们的 DNS 区域。
保存并退出 named.conf
。
现在编辑 named.conf.local
文件:
- sudo chmod 755 /etc/named
- sudo vi /etc/named/named.conf.local
定义与主 DNS 服务器上的主区域相对应的从属区域。注意类型是\slave,文件中没有路径,还有一个masters
指令,应该设置为主DNS服务器的私有IP。如果定义了多个reverse zone主 DNS 服务器,请确保将它们全部添加到此处:
- zone "nyc3.example.com" {
- type slave;
- file "slaves/db.nyc3.example.com";
- masters { 10.128.10.11; }; # ns1 private IP
- };
-
- zone "128.10.in-addr.arpa" {
- type slave;
- file "slaves/db.10.128";
- masters { 10.128.10.11; }; # ns1 private IP
- };
现在保存并退出 named.conf.local
。
运行以下命令来检查配置文件的有效性:
- sudo named-checkconf
检查完毕后,启动 BIND:
- sudo systemctl start named
启用 BIND 以在引导时启动:
sudo systemctl enable named
现在您拥有用于专用网络名称和 IP 地址解析的主要和次要 DNS 服务器。现在您必须配置您的服务器以使用您的私有 DNS 服务器。
配置 DNS 客户端
在“受信任的”ACL 中的所有服务器都可以查询您的 DNS 服务器之前,您必须将它们中的每一个配置为使用 ns1 和 ns2 作为名称服务器。此过程因人而异在 OS 上,但对于大多数 Linux 发行版,它涉及将您的名称服务器添加到 /etc/resolv.conf
文件中。
CentOS 客户端
在 CentOS、RedHat 和 Fedora Linux VPS 上,只需编辑 resolv.conf
文件:
- sudo vi /etc/resolv.conf
然后将以下行添加到文件的顶部(替换为您的私有域,以及 ns1 和 ns2 私有 IP 地址):
search nyc3.example.com # your private domain
nameserver 10.128.10.11 # ns1 private IP address
nameserver 10.128.20.12 # ns2 private IP address
现在保存并退出。您的客户端现已配置为使用您的 DNS 服务器。
Ubuntu 客户端
在 Ubuntu 和 Debian Linux VPS 上,您可以编辑 head
文件,该文件在启动时添加到 resolv.conf
之前:
- sudo vi /etc/resolvconf/resolv.conf.d/head
将以下行添加到文件中(替换为您的私有域,以及 ns1 和 ns2 私有 IP 地址):
search nyc3.example.com # your private domain
nameserver 10.128.10.11 # ns1 private IP address
nameserver 10.128.20.12 # ns2 private IP address
现在运行 resolvconf
生成一个新的 resolv.conf
文件:
- sudo resolvconf -u
您的客户端现已配置为使用您的 DNS 服务器。
测试客户端
使用 nslookup
(包含在 \bind-utils” 包中)来测试您的客户端是否可以查询您的名称服务器。您应该能够在您已配置和正在使用的所有客户端上执行此操作在“受信任的”ACL 中。
正向查找
例如,我们可以通过运行以下命令执行正向查找以检索 host1.nyc3.example.com 的 IP 地址:
- nslookup host1
查询 \host1 扩展为 host1.nyc3.example.com,因为 search
选项设置为您的私有子域,DNS 查询将尝试在该子域上查找,然后再在其他地方查找主机.上面命令的输出如下所示:
Output:Server: 10.128.10.11
Address: 10.128.10.11#53
Name: host1.nyc3.example.com
Address: 10.128.100.101
反向查找
要测试反向查找,请使用 host1 的私有 IP 地址查询 DNS 服务器:
- nslookup 10.128.100.101
您应该看到如下所示的输出:
Output:Server: 10.128.10.11
Address: 10.128.10.11#53
11.10.128.10.in-addr.arpa name = host1.nyc3.example.com.
如果所有名称和 IP 地址都解析为正确的值,则意味着您的区域文件配置正确。如果您收到意外值,请务必检查您的主 DNS 服务器上的区域文件(例如 db.nyc3.example.com
和 db.10.128
)。
恭喜!您的内部 DNS 服务器现已正确设置!现在我们将介绍如何维护您的区域记录。
维护 DNS 记录
既然您有一个可用的内部 DNS,您需要维护您的 DNS 记录,以便它们准确地反映您的服务器环境。
将主机添加到 DNS
每当您将主机添加到您的环境(在同一数据中心)时,您都需要将其添加到 DNS。以下是您需要执行的步骤列表:
主名称服务器
- 正向区域文件:为新主机添加“A”记录,增加“Serial”的值
- 反向区域文件:为新主机添加“PTR”记录,增加“Serial”的值
- 将新主机的私有 IP 地址添加到“受信任的”ACL (
named.conf.options
)
然后重新加载 BIND:
- sudo systemctl reload named
二级域名服务器
- 将新主机的私有 IP 地址添加到“受信任的”ACL (
named.conf.options
)
然后重新加载 BIND:
- sudo systemctl reload named
配置新主机以使用您的 DNS
- 配置 resolv.conf 以使用您的 DNS 服务器
- 使用
nslookup
进行测试
从 DNS 中删除主机
如果您从您的环境中删除主机或只想将其从 DNS 中删除,只需删除您将服务器添加到 DNS 时添加的所有内容(即上述步骤的反向操作)。
结论
现在您可以通过名称而不是 IP 地址来引用服务器的专用网络接口。这使得服务和应用程序的配置更加容易,因为您不再需要记住私有 IP 地址,并且文件将更易于阅读和理解。此外,现在您可以更改您的配置以指向一个单一位置的新服务器,即您的主要 DNS 服务器,而不必编辑各种分布式配置文件,从而简化了维护。
一旦您设置了内部 DNS,并且您的配置文件使用私有 FQDN 来指定网络连接,正确维护您的 DNS 服务器就很重要了。如果它们都变得不可用,则依赖它们的服务和应用程序将停止正常运行。这就是为什么建议使用至少一台辅助服务器设置您的 DNS,并维护所有这些服务器的工作备份。