如何在Ubuntu14.04上将BIND配置为专用网络DNS服务器

来自菜鸟教程
跳转至:导航、​搜索

介绍

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

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

本教程的 CentOS 版本可以在 这里 找到。

先决条件

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

  • 一些服务器在同一个数据中心运行并且启用了私有网络
  • 一个新的 VPS 作为主 DNS 服务器,ns1
  • 可选:作为辅助 DNS 服务器的新 VPS,ns2
  • 对以上所有内容的根访问(此处的步骤 1-4

如果您对 DNS 概念不熟悉,建议您至少阅读我们的 管理 DNS 简介 的前三部分。

示例主机

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

  • 我们有两个现有的 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

注意: 红色高亮的文字很重要! 它通常用于表示需要用您自己的设置替换或者应该修改或添加到配置文件中的内容。 例如,如果您看到类似 host1.nyc3.example.com 的内容,请将其替换为您自己服务器的 FQDN。 同样,如果您看到 host1_private_IP,请将其替换为您自己服务器的私有 IP 地址。

在两个 DNS 服务器 ns1ns2 上,更新 apt:

sudo apt-get update

现在安装 BIND:

sudo apt-get install bind9 bind9utils bind9-doc

IPv4 模式

在继续之前,让我们将 BIND 设置为 IPv4 模式。 在两台服务器上,编辑 bind9 服务参数文件:

sudo vi /etc/default/bind9

将“-4”添加到 OPTIONS 变量。 它应该如下所示:

/etc/default/bind9

OPTIONS="-4 -u bind"

保存并退出。

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

配置主 DNS 服务器

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

配置选项文件

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

sudo vi /etc/bind/named.conf.options

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

/etc/bind/named.conf.options - 1 of 3

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 块。 目前,块的开头如下所示:

/etc/bind/named.conf.options - 2 of 3

options {
        directory "/var/cache/bind";
...
}

directory 指令下方,添加突出显示的配置行(并替换为正确的 ns1 IP 地址),使其看起来像这样:

/etc/bind/named.conf.options - 3 of 3

options {
        directory "/var/cache/bind";
        
        recursion yes;                 # enables resursive queries
        allow-recursion { trusted; };  # allows recursive queries from "trusted" clients
        listen-on { 10.128.10.11; };   # ns1 private IP address - listen on private network only
        allow-transfer { none; };      # disable zone transfers by default

        forwarders {
                8.8.8.8;
                8.8.4.4;
        };
...
};

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

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

配置本地文件

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

sudo vi /etc/bind/named.conf.local

除了一些评论外,该文件应该是空的。 在这里,我们将指定我们的正向和反向区域。

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

/etc/bind/named.conf.local — 1 of 2

zone "nyc3.example.com" {
    type master;
    file "/etc/bind/zones/db.nyc3.example.com"; # zone file path
    allow-transfer { 10.128.20.12; };         # ns2 private IP address - secondary
};

假设我们的私有子网是 10.128.0.0/16,请使用以下行添加反向区域(请注意,我们的反向区域名称以“128.10”开头,这是“10.128”的八位字节反转):

/etc/bind/named.conf.local — 2 个,共 2 个

zone "128.10.in-addr.arpa" {
    type master;
    file "/etc/bind/zones/db.10.128";  # 10.128.0.0/16 subnet
    allow-transfer { 10.128.20.12; };  # ns2 private IP address - secondary
};

如果您的服务器跨越多个私有子网但位于同一个数据中心,请务必为每个不同的子网指定一个附加区域和区域文件。 添加完所有所需区域后,保存并退出 named.conf.local 文件。

现在我们的区域在 BIND 中指定,我们需要创建相应的正向和反向区域文件。

创建正向区域文件

正向区域文件是我们为正向 DNS 查找定义 DNS 记录的地方。 也就是说,当DNS收到一个名字查询,例如“host1.nyc3.example.com”时,它会在转发区域文件中查找host1对应的私有IP地址。

让我们创建区域文件所在的目录。 根据我们的 named.conf.local 配置,该位置应该是 /etc/bind/zones

sudo mkdir /etc/bind/zones

我们将基于示例 db.local 区域文件的前向区域文件。 使用以下命令将其复制到正确的位置:

cd /etc/bind/zones
sudo cp ../db.local ./db.nyc3.example.com

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

sudo vi /etc/bind/zones/db.nyc3.example.com

最初,它将如下所示:

/etc/bind/zones/db.nyc3.example.com — 原始

$TTL    604800
@       IN      SOA     localhost. root.localhost. (
                              2         ; Serial
                         604800         ; Refresh
                          86400         ; Retry
                        2419200         ; Expire
                         604800 )       ; Negative Cache TTL
;
@       IN      NS      localhost.      ; delete this line
@       IN      A       127.0.0.1       ; delete this line
@       IN      AAAA    ::1             ; delete this line

首先,您需要编辑 SOA 记录。 将第一个“localhost”替换为 ns1 的 FQDN,然后将“root.localhost”替换为“admin.nyc3.example.com”。 此外,每次编辑区域文件时,应在重新启动 named 进程之前增加 serial 值——我们将其增加到“3”。 它应该看起来像这样:

/etc/bind/zones/db.nyc3.example.com — 更新 1 of 3

@       IN      SOA     ns1.nyc3.example.com. admin.nyc3.example.com. (
                              3         ; Serial

现在删除文件末尾的三个记录(在 SOA 记录之后)。 如果您不确定要删除哪些行,它们会在上面标有“删除此行”注释。

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

/etc/bind/zones/db.nyc3.example.com — 更新 2 of 3

; name servers - NS records
    IN      NS      ns1.nyc3.example.com.
    IN      NS      ns2.nyc3.example.com.

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

/etc/bind/zones/db.nyc3.example.com — 更新了 3 个,共 3 个

; 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 文件。

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

/etc/bind/zones/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[ X187X]”在这种情况下。

ns1 上,为 named.conf.local 文件中指定的每个反向区域,创建一个反向区域文件。 我们将我们的反向区域文件基于示例 db.127 区域文件。 使用以下命令将其复制到正确的位置(替换目标文件名,使其与您的反向区域定义匹配):

cd /etc/bind/zones
sudo cp ../db.127 ./db.10.128

编辑与 named.conf.local 中定义的反向区域相对应的反向区域文件:

sudo vi /etc/bind/zones/db.10.128

最初,它将如下所示:

/etc/bind/zones/db.10.128 — 原始

$TTL    604800
@       IN      SOA     localhost. root.localhost. (
                              1         ; Serial
                         604800         ; Refresh
                          86400         ; Retry
                        2419200         ; Expire
                         604800 )       ; Negative Cache TTL
;
@       IN      NS      localhost.      ; delete this line
1.0.0   IN      PTR     localhost.      ; delete this line

以与转发区域文件相同的方式,您需要编辑 SOA 记录并增加 serial 值。 它应该看起来像这样:

/etc/bind/zones/db.10.128 — 更新 1 of 3

@       IN      SOA     ns1.nyc3.example.com. admin.nyc3.example.com. (
                              3         ; Serial

现在删除文件末尾的两条记录(在 SOA 记录之后)。 如果您不确定要删除哪些行,它们会在上面标有“删除此行”注释。

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

/etc/bind/zones/db.10.128 — 更新了 2 个,共 3 个

; 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 地址以匹配您的服务器:

/etc/bind/zones/db.10.128 — 更新了 3 个,共 3 个

; 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

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

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

/etc/bind/zones/db.10.128 — 更新

$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 db.nyc3.example.com

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

sudo named-checkzone 128.10.in-addr.arpa /etc/bind/zones/db.10.128

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

重启绑定

重启绑定:

sudo service bind9 restart

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

配置辅助 DNS 服务器

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

ns2 上,编辑 named.conf.options 文件:

sudo vi /etc/bind/named.conf.options

在文件顶部,添加具有所有受信任服务器的私有 IP 地址的 ACL:

/etc/bind/named.conf.options — 更新 1 of 2(次要)

acl "trusted" {
        10.128.10.11;   # ns1
        10.128.20.12;   # ns2 - can be set to localhost
        10.128.100.101;  # host1
        10.128.200.102;  # host2
};

directory 指令下方,添加以下行:

/etc/bind/named.conf.options — 更新 2 of 2(次要)

        recursion yes;
        allow-recursion { trusted; };
        listen-on { 10.128.20.12; };      # ns2 private IP address
        allow-transfer { none; };          # disable zone transfers by default

        forwarders {
                8.8.8.8;
                8.8.4.4;
        };

保存并退出named.conf.options。 这个文件应该看起来和 ns1named.conf.options 文件完全一样,除了它应该被配置为监听 ns2 的私有 IP 地址。

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

sudo vi /etc/bind/named.conf.local

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

/etc/bind/named.conf.local — 更新(次要)

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

签出后,重新启动绑定

sudo service bind9 restart

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

配置 DNS 客户端

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

Ubuntu 客户端

在 Ubuntu 和 Debian Linux VPS 上,您可以编辑 head 文件,该文件在启动时添加到 resolv.conf 之前:

sudo vi /etc/resolvconf/resolv.conf.d/head

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

/etc/resolvconf/resolv.conf.d/head

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 服务器。

CentOS 客户端

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

sudo vi /etc/resolv.conf

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

/etc/resolv.conf

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 服务器。

测试客户

使用 nslookup 测试您的客户端是否可以查询您的名称服务器。 您应该能够在您已配置且位于“受信任”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.comdb.10.128)。

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

维护 DNS 记录

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

将主机添加到 DNS

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

主域名服务器

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

然后重新加载 BIND:

sudo service bind9 reload

二级域名服务器

  • 将新主机的私有 IP 地址添加到“可信”ACL (named.conf.options)

然后重新加载 BIND:

sudo service bind9 reload

配置新主机以使用您的 DNS

  • 配置 resolv.conf 以使用您的 DNS 服务器
  • 使用 nslookup 进行测试

从 DNS 中删除主机

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

结论

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

一旦您设置了内部 DNS,并且您的配置文件使用私有 FQDN 来指定网络连接,那么正确维护您的 DNS 服务器是 关键。 如果它们都变得不可用,则依赖它们的服务和应用程序将停止正常运行。 这就是为什么建议您使用至少一台辅助服务器设置您的 DNS,并维护所有这些服务器的工作备份。