前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >如何在CentOS 7上将BIND配置为专用网络DNS服务器

如何在CentOS 7上将BIND配置为专用网络DNS服务器

原创
作者头像
乌鸦
修改2018-09-25 10:23:07
2.5K0
修改2018-09-25 10:23:07
举报

介绍

管理服务器配置和基础架构的一个重要部分包括通过设置适当的域名系统(DNS),维护一种通过名称查找网络接口和IP地址的简便方法。使用完全限定的域名(FQDN)而不是IP地址来指定网络地址可以简化服务和应用程序的配置,并提高配置文件的可维护性。为您的专用网络设置自己的DNS是改善服务器管理的好方法。

在本教程中,我们将讨论如何使用CentOS 7上的BIND名称服务器软件(BIND9)设置内部DNS服务器,虚拟专用服务器(VPS)可以使用它来解析专用主机名和专用IP地址。这提供了一种管理内部主机名和私有IP地址的核心方法,当您的环境扩展到多个主机时,这是必不可少的。

准备

要完成本教程,您需要以下内容:

  • 某些服务器在同一数据中心运行并启用了专用网络
  • 作主 DNS服务器ns1的新VPS
  • 可选:用作辅助DNS服务器ns2的新VPS
  • 访问以上所有内容的Root权限
  • (你可能需要一台已经设置好可以使用sudo命令的非root账号的CentOS服务器,并且已开启防火墙。没有服务器的同学可以在这里购买,不过我个人更推荐您使用免费的腾讯云开发者实验室进行试验,学会安装后再购买服务器

示例主机

出于示例目的,我们将假设以下内容:

  • 我们有两个现有的VPS叫做“host1”和“host2”
  • 两个VPS都存在于nyc3数据中心
  • 两个VPS都启用了专用网络(并且位于10.128.0.0/16子网上)
  • 两个VPS都与我们在“example.com”上运行的Web应用程序有某种关联

根据这些假设,我们认为使用使用“nyc3.example.com”的命名方案来引用我们的私有子网或区域是有意义的。因此,host1的私有完全限定域名(FQDN)将为“host1.nyc3.example.com”。请参阅下表中的相关详细信息:

主机

角色

私人FQDN

私有IP地址

主机1

通用主机1

host1.nyc3.example.com

10.128.100.101

主机2

通用主机2

host2.nyc3.example.com

10.128.200.102

注意:您现有的设置将有所不同,但示例名称和IP地址将用于演示如何配置DNS服务器以提供正常运行的内部DNS。您应该能够通过用您自己的主机名替换主机名和私有IP地址,轻松地将此设置适应您自己的环境。在命名方案中没有必要使用数据中心的区域名称,但我们在此处使用它来表示这些主机属于特定数据中心的专用网络。如果您使用多个数据中心,则可以在每个相应的数据中心内设置内部DNS。

我们的目标

在本教程结束时,我们将有一个主DNS服务器ns1,以及可选的辅助DNS服务器ns2,它将用作备份。

这是一个包含示例名称和IP地址的表:

主机

角色

私人FQDN

私有IP地址

NS1

主DNS服务器

ns1.nyc3.example.com

10.128.10.11

NS2

辅助DNS服务器

ns2.nyc3.example.com

10.128.20.12

让我们开始安装我们的主DNS服务器ns1。

在DNS服务器上安装BIND

在两个DNS服务器ns1ns2上,使用yum安装BIND:

代码语言:javascript
复制
sudo yum install bind bind-utils

输入确认提示y

现在已经安装了BIND,让我们配置主DNS服务器。

配置主DNS服务器

BIND的配置包含多个文件,这些文件包含在主配置named.conf文件中。这些文件名以“named”开头,因为这是BIND运行的进程的名称。我们将从配置选项文件开始。

配置绑定

BIND的过程称为命名。因此,许多文件引用“命名”而不是“BIND”。

ns1上,打开named.conf文件进行编辑:

代码语言:javascript
复制
sudo vi /etc/named.conf

在现有options块上方,创建一个名为“trusted”的新ACL块。这是我们将定义客户端列表的地方,我们将允许递归DNS查询(即与ns1在同一数据中心的服务器)。使用我们的示例私有IP地址,我们将ns1ns2host1host2添加到可信客户端列表中:

代码语言:javascript
复制
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行进行注释:

/etc/named.conf - 2 of 4

代码语言:javascript
复制
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” 更改为“trusted”:

/etc/named.conf - 4 of 4

代码语言:javascript
复制
...
options {
...
        allow-transfer { 10.128.20.12; };      # disable zone transfers by default
...
        allow-query { trusted; };  # allows queries from "trusted" clients
...

在文件末尾,添加以下行:

代码语言:javascript
复制
include "/etc/named/named.conf.local";

现在保存并退出named.conf。上述配置指定只有您自己的服务器(“可信”服务器)才能查询您的DNS服务器。

接下来,我们将配置本地文件,以指定我们的DNS区域。

配置本地文件

ns1上,打开named.conf.local文件进行编辑:

代码语言:javascript
复制
sudo vi /etc/named/named.conf.local

该文件应为空。在这里,我们将指定前向和反向区域。

使用以下行添加前向区域(用您自己的区域名称替换区域名称):

代码语言:javascript
复制
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”的八位字节反转):

代码语言:javascript
复制
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

代码语言:javascript
复制
sudo chmod 755 /etc/named
sudo mkdir /etc/named/zones

现在让我们编辑我们的前向区域文件:

代码语言:javascript
复制
sudo vi /etc/named/zones/db.nyc3.example.com

首先,您需要添加SOA记录。将突出显示的ns1 FQDN替换为您自己的FQDN,然后将第二个“nyc3.example.com”替换为您自己的域。每次编辑区域文件时,都应该在重新启动named进程之前递增序列值- 我们将其增加到“3”。它应该看起来像这样:

代码语言:javascript
复制
@       IN      SOA     ns1.nyc3.example.com. admin.nyc3.example.com. (
                              3         ; Serial
             604800     ; Refresh
              86400     ; Retry
            2419200     ; Expire
             604800 )   ; Negative Cache TTL

之后,使用以下行添加您的名称服务器记录(用您自己的名称替换名称)。请注意,第二列指定这些是“NS”记录:

代码语言:javascript
复制
; name servers - NS records
    IN      NS      ns1.nyc3.example.com.
    IN      NS      ns2.nyc3.example.com.

然后为属于此区域的主机添加A记录。这包括我们希望以“.nyc3.example.com”结尾的名称的任何服务器(替换名称和私有IP地址)。使用我们的示例名称和私有IP地址,我们将为ns1ns2host1host2添加A记录,如下所示:

代码语言:javascript
复制
; 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文件。

我们的最终示例前向区域文件如下所示:

代码语言:javascript
复制
$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定义的反向区域对应的反向区域文件:

代码语言:javascript
复制
sudo vi /etc/named/zones/db.10.128

以与前向区域文件相同的方式,将突出显示的ns1 FQDN替换为您自己的FQDN,然后将第二个“nyc3.example.com”替换为您自己的域。每次编辑区域文件时,都应该在重新启动named进程之前递增序列值- 我们将其增加到“3”。它应该看起来像这样:

代码语言:javascript
复制
@       IN      SOA     ns1.nyc3.example.com. admin.nyc3.example.com. (
                              3         ; Serial
                         604800         ; Refresh
                          86400         ; Retry
                        2419200         ; Expire
                         604800 )       ; Negative Cache TTL

之后,使用以下行添加您的名称服务器记录(用您自己的名称替换名称)。请注意,第二列指定这些是“NS”记录:

代码语言:javascript
复制
; name servers - NS records
      IN      NS      ns1.nyc3.example.com.
      IN      NS      ns2.nyc3.example.com.

然后PTR为所有服务器添加记录,这些服务器的IP地址位于您正在编辑的区域文件的子网上。在我们的示例中,这包括我们所有的主机,因为它们都在10.128.0.0/16子网上。请注意,第一列包含服务器私有IP地址的最后两个八位字节,顺序相反。请务必替换名称和私有IP地址以匹配您的服务器:

代码语言:javascript
复制
; 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

保存并退出反向区域文件(如果需要添加更多反向区域文件,请重复此部分)。

我们的最终示例反向区域文件如下所示:

代码语言:javascript
复制
$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*文件的语法:

代码语言:javascript
复制
sudo named-checkconf

如果您的命名配置文件没有语法错误,您将返回到shell提示符并且看不到任何错误消息。如果配置文件有问题,请查看错误消息,然后重试named-checkconf

named-checkzone命令可用于检查区域文件的正确性。它的第一个参数指定一个区域名称,第二个参数指定相应的区域文件,它们都是在named.conf.local中被定义的。

例如,要检查“ nyc3.example.com ”前向区域配置,请运行以下命令(更改名称以匹配前向区域和文件):

代码语言:javascript
复制
sudo named-checkzone nyc3.example.com /etc/named/zones/db.nyc3.example.com

要检查“ 128.10 .in-addr.arpa”反向区域配置,请运行以下命令(更改数字以匹配反向区域和文件):

代码语言:javascript
复制
sudo named-checkzone 128.10.in-addr.arpa /etc/named/zones/db.10.128

当所有配置和区域文件都没有错误时,您应该准备好重新启动BIND服务。

开始BIND

开始BIND:

代码语言:javascript
复制
sudo systemctl start named

现在你想要启用它,所以它将在启动时启动:

代码语言:javascript
复制
sudo systemctl enable named

您的主DNS服务器现已设置好并准备好响应DNS查询。让我们继续创建辅助DNS服务器。

配置备用DNS服务器

在大多数环境中,最好设置辅助DNS服务器,以便在主服务器不可用时响应请求。幸运的是,辅助DNS服务器更容易配置。

ns2上,编辑named.conf文件:

代码语言:javascript
复制
sudo vi /etc/named.conf

注意:如果您希望跳过这些说明,可以复制ns1named.conf文件并对其进行修改以侦听ns2的私有IP地址,并且不允许传输。

在现有options块上方,创建一个名为“trusted”的新ACL块。这是我们将定义客户端列表的地方,我们将允许递归DNS查询(即与ns1在同一数据中心的服务器)。使用我们的示例私有IP地址,我们将ns1ns2host1host2添加到可信客户端列表中:

代码语言:javascript
复制
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指令中,并j将该listen-on-v6行进行注释:

代码语言:javascript
复制
options {
        listen-on port 53 { 127.0.0.1; 10.128.20.12; };
#        listen-on-v6 port 53 { ::1; };
...

allow-query指令从“localhost” 更改为“trusted”:

代码语言:javascript
复制
...
options {
...
        allow-query { trusted; }; # allows queries from "trusted" clients
...

在文件末尾,添加以下行:

代码语言:javascript
复制
include "/etc/named/named.conf.local";

现在保存并退出named.conf。上述配置指定只有您自己的服务器(“可信”服务器)才能查询您的DNS服务器。

接下来,我们将配置本地文件,以指定我们的DNS区域。

保存并退出named.conf

现在编辑named.conf.local文件:

代码语言:javascript
复制
sudo chmod 755 /etc/named
sudo vi /etc/named/named.conf.local

定义与主DNS服务器上的主区域对应的从属区域。请注意,类型是“slave”,文件不包含路径,并且有一个masters指令应该设置为主DNS服务器的专用IP。如果您在主DNS服务器中定义了多个反向区域,请确保在此处全部添加它们:

代码语言:javascript
复制
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

运行以下命令以检查配置文件的有效性:

代码语言:javascript
复制
sudo named-checkconf

签出后,启动BIND:

代码语言:javascript
复制
sudo systemctl start named

启用BIND以在启动时启动:

代码语言:javascript
复制
sudo systemctl enable named

现在,您拥有用于专用网络名称和IP地址解析的主DNS服务器和辅助DNS服务器。现在,您必须配置服务器以使用您的私有DNS服务器。

配置DNS客户端

在“受信任”ACL中的所有服务器都可以查询DNS服务器之前,必须将每个服务器配置为使用ns1ns2作为名称服务器。此过程因操作系统而异,但对于大多数Linux发行版,它涉及将名称服务器添加到/etc/resolv.conf文件中。

CentOS客户

在CentOS,RedHat和Fedora Linux VPS上,只需编辑resolv.conf文件:

代码语言:javascript
复制
sudo vi /etc/resolv.conf

然后将以下行添加到文件的顶部(替换您的专用域,以及ns1ns2专用IP地址):

代码语言:javascript
复制
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文件在开机时会被添加到:

代码语言:javascript
复制
sudo vi /etc/resolvconf/resolv.conf.d/head

将以下行添加到文件中(替换您的专用域,以及ns1ns2专用IP地址):

代码语言:javascript
复制
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文件:

代码语言:javascript
复制
sudo resolvconf -u

您的客户端现在配置为使用您的DNS服务器。

测试客户端

使用included“bind-utils”包包含的nslookup来测试您的客户端是否可以查询您的名称服务器。您应该能够在已配置且位于“可信”ACL中的所有客户端上执行此操作。

正向查找

例如,我们可以通过运行以下命令来执行正向查找以检索host1.nyc3.example.com的IP地址:

代码语言:javascript
复制
nslookup host1

查询“host1”扩展为“host1.nyc3.example.com”,因为该search选项设置为您的私有子域,DNS查询将尝试查找该子域,然后在其他位置查找主机。上面命令的输出将显示如下:

代码语言:javascript
复制
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服务器:

代码语言:javascript
复制
nslookup 10.128.100.101

您应该看到如下所示的输出:

代码语言:javascript
复制
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.comdb.10.128)。

恭喜!您的内部DNS服务器现已正确设置!现在我们将介绍如何维护您的区域记录。

维护DNS记录

既然您有一个有效的内部DNS,您需要维护您的DNS记录,以便它们准确反映您的服务器环境。

将主机添加到DNS

每当您向环境添加主机(在同一数据中心中)时,您都希望将其添加到DNS。以下是您需要采取的步骤列表:

主名称服务器
  • 转发区文件:为新主机添加“A”记录,增加“Serial”的值
  • 反向区域文件:为新主机添加“PTR”记录,增加“Serial”的值
  • 将新主机的专用IP地址添加到“可信”ACL(named.conf.options

然后重新加载BIND:

代码语言:javascript
复制
sudo systemctl reload named
辅助名称服务器
  • 将新主机的专用IP地址添加到“可信”ACL(named.conf.options

然后重新加载BIND:

代码语言:javascript
复制
sudo systemctl reload named
配置新主机以使用您的DNS
  • 配置resolv.conf以使用您的DNS服务器
  • 测试使用 nslookup

从DNS中删除主机

如果从环境中删除主机或者想要将其从DNS中取出,只需删除将服务器添加到DNS时添加的所有内容(即上述步骤的相反步骤)。

结论

现在,您可以按名称而不是IP地址来引用服务器的专用网络接口。这使得服务和应用程序的配置更加容易,因为您不再需要记住私有IP地址,并且文件将更易于阅读和理解。此外,现在您可以将配置更改为指向单个位置的新服务器(主DNS服务器),而不必编辑各种分布式配置文件,从而简化维护。

设置内部DNS并且配置文件使用专用FQDN指定网络连接后,正确维护DNS服务器至关重要。如果它们都不可用,那么依赖它们的服务和应用程序将无法正常运行。这就是为什么建议使用至少一个辅助服务器设置DNS,并维护所有辅助服务器的工作备份的原因。

更多CentOS教程请前往腾讯云+社区学习更多知识。

参考文献:《How To Configure BIND as a Private Network DNS Server on CentOS 7》

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 准备
    • 示例主机
    • 我们的目标
    • 在DNS服务器上安装BIND
    • 配置主DNS服务器
      • 配置绑定
        • 配置本地文件
          • 创建转发区文件
            • 创建反向区域文件
              • 检查BIND配置语法
                • 开始BIND
                • 配置备用DNS服务器
                • 配置DNS客户端
                  • CentOS客户
                    • Ubuntu客户端
                    • 测试客户端
                      • 正向查找
                        • 反向查找
                        • 维护DNS记录
                          • 将主机添加到DNS
                            • 主名称服务器
                            • 辅助名称服务器
                            • 配置新主机以使用您的DNS
                          • 从DNS中删除主机
                          • 结论
                          相关产品与服务
                          云开发 CloudBase
                          云开发(Tencent CloudBase,TCB)是腾讯云提供的云原生一体化开发环境和工具平台,为200万+企业和开发者提供高可用、自动弹性扩缩的后端云服务,可用于云端一体化开发多种端应用(小程序、公众号、Web 应用等),避免了应用开发过程中繁琐的服务器搭建及运维,开发者可以专注于业务逻辑的实现,开发门槛更低,效率更高。
                          领券
                          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档