介绍
DNS,或域名系统,在学习如何配置网站和服务器时往往是一个困难的组成部分,虽然大多数人可能会选择使用他们的托管公司或域名注册商提供的DNS服务器,但创建自己的DNS服务器有一些优势。
在本指南中,我们将讨论如何在 Ubuntu 14.04 机器上安装和配置 Bind9 DNS 服务器作为唯一权威的 DNS 服务器。
前提和目标
要完成本指南,您首先需要熟悉一些常见的DNS术语。 查看 此指南 了解我们将在本指南中实施的概念。
您还需要至少两个服务器. 一个将用于主要
DNS服务器,我们的域的区域文件将来自其中,一个将是次要
服务器,该服务器将通过转移接收区域数据,并在其他服务器崩溃的情况下可用。
与缓存或转发 DNS 服务器 或多用途 DNS 服务器不同,权威服务器只对它们权威的区域响应迭代查询,这意味着如果服务器不知道答案,它只会告诉客户端(通常是某种解决 DNS 服务器)它不知道答案,并向可能知道更多信息的服务器提供参考。
专有权限的DNS服务器通常是高性能的良好配置,因为它们没有解决客户端回复性查询的权限,他们只关心他们设计的区域。
对于本指南的目的,我们实际上将引用 三个 服务器. 上面提到的两个名称服务器,加上一个我们希望在我们的区域内配置为主机的Web服务器。
我们将在本指南中使用example.com
域名,您应该将其替换为您正在配置的域名,这是我们将配置的机器的详细信息:
密码: 密码: 密码: 密码: 密码: 密码: 密码: 密码: 密码: 密码: 密码: 密码: 密码: 密码: 密码: 密码: 密码: 密码: 密码: 密码: 密码: 密码: 密码: 密码: 密码: 密码: 密码: 密码: 密码: 密码: 密码: 密码: 密码: 密码: 密码: 密码: 密码: 密码: 密码: 密码: 密码: 密码: 密码: 密码: 密码: 密码: 密码: 密码: 密码: 密
完成本指南后,您应该为您的域区配置两个专属的名称服务器. 上表中的中心列中的名称可用于访问您的各种主机。
在名称服务器上设置主机名称
在我们进入我们的名称服务器配置之前,我们必须确保我们的主机名称在我们的主要和次要DNS服务器上正确配置。
首先,请检查 /etc/hosts
文件,然后在文本编辑器中打开 sudo 特权文件:
1sudo nano /etc/hosts
我们需要将此配置为正确识别每个服务器的主机名和FQDN。
1127.0.0.1 localhost
2127.0.1.1 ns1 ns1
3. . .
我们应该修改第二行以参考我们的特定主机和域组合,并将其指向我们的公共静态IP地址,然后我们可以将不合格的名称添加为对称。
1127.0.0.1 localhost
2192.0.2.1 ns1.example.com ns1
3. . .
保存并关闭文件,当你完成。
我们还应该修改 /etc/hostname
文件以包含我们的不合格主机名:
1sudo nano /etc/hostname
1ns1
我们可以通过键入此值读入当前运行的系统:
1sudo hostname -F /etc/hostname
我们希望在我们的二级服务器上完成相同的程序。
开始使用 /etc/hosts
文件:
1sudo nano /etc/hosts
1127.0.0.1 localhost
2192.0.2.2 ns2.example.com ns2
保存并关闭文件,当你完成。
然后,修改 /etc/hostname
文件. 请记住只使用实际主机(在我们的例子中只使用 ns2
)为此文件:
1sudo nano /etc/hostname
1ns2
再次阅读文件以更改当前系统:
1sudo hostname -F /etc/hostname
您的服务器现在应该正确设置其主机定义。
在两个名称服务器上安装Bind
在您的每个名称服务器上,您现在可以安装Bind,我们将使用的DNS服务器。
Bind软件在Ubuntu的默认存储库中可用,所以我们只需要更新本地包索引并使用apt
安装该软件。
1sudo apt-get update
2sudo apt-get install bind9 bind9utils bind9-doc
在您的主要和次要 DNS 服务器上运行此安装命令,以获取相应的文件。
配置主要绑定服务器
现在我们已经安装了软件,我们可以开始在主服务器上配置我们的DNS服务器。
配置选项文件
我们将配置的第一件事是named.conf.options
文件。
Bind DNS服务器也被称为命名
。主要配置文件位于/etc/bind/named.conf
。
在您的编辑器中打开 sudo 特权的选项文件:
1sudo nano /etc/bind/named.conf.options
下面,大多数评论的行被删除为简短,但一般来说,安装后文件应该是这样的:
1options {
2 directory "/var/cache/bind";
3
4 dnssec-validation auto;
5
6 auth-nxdomain no; # conform to RFC1035
7 listen-on-v6 { any; };
8};
我们需要在这个文件中配置的主要事情是回归. 由于我们正在尝试设置一个仅限权威的服务器,我们不想在这个服务器上启用回归。
我们也将默认不允许转移,我们将在稍后的个别区域规格中排除这一点:
1options {
2 directory "/var/cache/bind";
3 recursion no;
4 allow-transfer { none; };
5
6 dnssec-validation auto;
7
8 auth-nxdomain no; # conform to RFC1035
9 listen-on-v6 { any; };
10};
完成后,保存并关闭文件。
配置本地文件
我们需要采取的下一步是指定我们想要控制这个服务器的区域. 一个区域是域的任何部分,它被委托管理到一个名称服务器,而不是被分配到其他服务器。
我们正在配置example.com
域名,我们不会将域名任何部分的责任分配给其他服务器,因此该区域将涵盖我们的整个域名。
要配置我们的区域,我们需要打开与 sudo 特权的 /etc/bind/named.conf.local
文件:
1sudo nano /etc/bind/named.conf.local
除了评论之外,这个文件最初将是空的. 还有其他区域,我们的服务器知道一般的管理,但这些区域在named.conf.default-zones
文件中指定。
要开始,我们需要为我们的example.com
域配置前进区。前进区是我们大多数人在讨论DNS时想到的常规名称对IP分辨率。
1zone "example.com" {
2};
许多DNS工具、配置文件和文档都使用主
和奴隶
一词,而DigitalOcean通常更喜欢替代的描述器,以避免混淆,我们选择使用主要
和次要
一词来表示服务器之间的关系,并且只使用主
或奴隶
在配置指令要求的情况下。
在这个区块中,我们添加了有关该区域的管理信息。我们指定了这个DNS服务器与该区域的关系。 这是类型大师;
在随后的示例区,因为我们正在将这个机器配置为我们所有区域的主要名称服务器。
我们将在Bind配置目录中将我们的主要区域文件保存在一个名为区域
的子目录中,我们将把我们的文件称为db.example.com
,以便从Bind目录中的其他区域文件中借用协议。
1zone "example.com" {
2 type master;
3 file "/etc/bind/zones/db.example.com";
4};
我们希望允许这个区域转移到我们的次要服务器,我们需要添加这样的行:
1zone "example.com" {
2 type master;
3 file "/etc/bind/zones/db.example.com";
4 allow-transfer { 192.0.2.2; };
5};
接下来,我们将为我们的域界定义反向区域。
关于反向区域的一点点
如果提供您的IP地址的组织没有为您提供网络范围,并将该范围的责任分配给您,那么您的反向区域文件将不会被引用,并由组织本身处理。
例如,在DigitalOcean中,如果在控制面板中使用机器的FQDN作为服务器名称,则会自动创建服务器的反向映射。
在此类情况下,由于您未被分配一小部分地址来管理,您应该使用此策略. 下面描述的策略涵盖了完整性,并使其适用,如果您已授权对较大的连接地址组的控制。
反向区域用于将 IP 地址连接到域名,但是,域名系统最初是为前向映射而设计的,因此需要一些思考来适应这一点,以允许反向映射。
您需要记住了解反向映射的信息是:
- 在域中,地址的最具体部分位于左侧。对于 IP 地址,最具体的部分位于右侧。 * 域规格的最具体部分是子域或主机名称。
所有反向区域地图都被定义为由互联网分配号码管理局(IANA)控制的特殊域名in-addr.arpa
。在这个域名下,有一棵树使用子域来绘制IP地址中的每个 octet,以确保IP地址的特性反映正常域的特性,IP地址的 octets实际上被逆转。
因此,我们的主要DNS服务器,具有192.0.2.1
的IP地址,会被转换成1.2.0.192
。当我们将这个主机规格添加为在in-addr.arpa
域内存在的等级,具体的主机可以被称为1.2.0.192.in-addr.arpa
。
由于我们在使用DNS时在区域文件中定义了个别主机(如这里的主要1
)时,我们将配置的区域是2.0.192.in-addr.arpa
。
现在你知道如何指定反向区域名称,实际定义与前向区域完全相同. 在example.com
区域定义下,为你给出的网络创建反向区域。
1zone "2.0.192.in-addr.arpa" {
2 type master;
3 file "/etc/bind/zones/db.192.0.2";
4};
我们选择将文件命名为db.192.0.2 这是关于该区域配置的具体情况,并且比反向标注更易读。
保存并关闭文件,当你完成。
创建前置区域文件
我們已經告訴Bind我們的前進和逆轉區域,但我們尚未建立定義這些區域的檔案。
如果你还记得,我们将文件位置指定为名为zones
的子目录中。
1sudo mkdir /etc/bind/zones
现在,我们可以使用Bind目录中一些现有的区域文件作为我们想要创建的区域文件的模板。 对于前进区域,db.local文件将接近我们需要的文件。
1sudo cp /etc/bind/db.local /etc/bind/zones/db.example.com
当我们这样做时,我们也可以复制反向区域的模板,我们会使用 db.127
文件,因为它对我们所需的内容非常接近:
1sudo cp /etc/bind/db.127 /etc/bind/zones/db.192.0.2
现在,在文本编辑器中打开 sudo 特权的 forward zone 文件:
1sudo nano /etc/bind/zones/db.example.com
文件将看起来像这样:
1$TTL 604800
2@ IN SOA localhost. root.localhost. (
3 2 ; Serial
4 604800 ; Refresh
5 86400 ; Retry
6 2419200 ; Expire
7 604800 ) ; Negative Cache TTL
8;
9@ IN NS localhost.
10@ IN A 127.0.0.1
11@ IN AAAA ::1
我们需要做的第一件事是修改SOA
(权限开始)记录,该记录从第一个@
符号开始,一直持续到关闭符号。
我们需要用这台机器的FQDN名称代替本地主机
。这个记录部分被用来定义任何名称服务器,该名称服务器将为定义的区域作出权威性响应。这将是我们现在配置的机器,在我们的情况下,ns1.example.com。
我们也希望更改下一个部分,这实际上是一个特别格式化的电子邮件地址,用@
取代一个点. 我们希望我们的电子邮件去一个域管理员,所以传统的电子邮件是[email protected]
。
1@ IN SOA ns1.example.com. admin.example.com. (
我们需要编辑的下一个部分是序列号,序列号的值是Bind如何告诉它是否需要向次要服务器发送更新信息。
** 注意** :未能增加序列号是导致区域更新问题最常见的错误之一. 每次编辑时,您必须打击序列号。
一种方法是使用YYYYMMDD格式的日期,以及对日期添加的修订号码,所以2014年6月5日进行的第一次修订可能会有序号为2014060501,而当天晚些时候进行的更新可能会有序号为2014060502。
为了方便使用,值得采用一种惯例,但为了使事情变得简单,我们现在只会把我们的设置为5
:
1@ IN SOA ns1.example.com. admin.example.com. (
2 5 ; Serial
接下来,我们可以摆脱文件中的最后三行(底部以@
开头的行),因为我们将自己制作。
我们首先想要建立SOA记录后的是我们区域的名称服务器,我们指定域名,然后我们的两个名称服务器为该区域授权,以名称为准。
对于我们的指南,它将看起来像这样。再次,注意结尾点!:
1; Name servers
2example.com. IN NS ns1.example.com.
3example.com. IN NS ns2.example.com.
由于区域文件的目的是主要地图主机名和服务到特定地址,我们还没有完成,任何读取这个区域文件的软件都想知道ns1
和ns2
服务器的位置,以便访问权威区域。
接下来,我们需要创建A
记录,将这些名称服务器名称与我们的名称服务器的实际IP地址相关联:
1; A records for name servers
2ns1 IN A 192.0.2.1
3ns2 IN A 192.0.2.2
现在我们有 A 记录以成功解决我们的名称服务器到他们的正确的 IP 地址,我们可以添加任何额外的记录. 记住,我们有一个网页服务器在我们的主机中,我们希望使用它来服务我们的网站。
1; Other A records
2@ IN A 192.0.2.3
3www IN A 192.0.2.3
您可以通过创建额外的A
记录来添加您需要定义的任何额外的主机。
当你完成时,你的文件应该看起来像这样:
1$TTL 604800
2@ IN SOA ns1.example.com. admin.example.com. (
3 5 ; Serial
4 604800 ; Refresh
5 86400 ; Retry
6 2419200 ; Expire
7 604800 ) ; Negative Cache TTL
8;
9
10; Name servers
11example.com. IN NS ns1.example.com.
12example.com. IN NS ns2.example.com.
13
14; A records for name servers
15ns1 IN A 192.0.2.1
16ns2 IN A 192.0.2.2
17
18; Other A records
19@ IN A 192.0.2.3
20www IN A 192.0.2.3
保存并关闭文件,当你完成。
创建反向区域文件
现在,我们已经配置了前进区域,但我们需要设置我们在配置文件中指定的反向区域文件。
在 sudo 特权的文本编辑器中打开文件:
1sudo nano db.192.0.2
檔案應該是這樣的:
1$TTL 604800
2@ IN SOA localhost. root.localhost. (
3 1 ; Serial
4 604800 ; Refresh
5 86400 ; Retry
6 2419200 ; Expire
7 604800 ) ; Negative Cache TTL
8;
9@ IN NS localhost.
101.0.0 IN PTR localhost.
首先,调整域名、管理员电子邮件和序列号,以准确匹配你上个文件中的内容(序列号可能不同,但应该增加):
1@ IN SOA example.com. admin.example.com. (
2 5 ; Serial
再次,擦除SOA
记录的关闭方针下的行。我们将采取我们网络范围内的每个IP地址的最后一个八分之一,并使用一个PTR
记录将其复制到该主机的FQDN。
例如,如果您设置了邮件服务器,您可能希望将反向映射设置为邮件名称,因为许多系统使用反向映射来验证地址。
首先,我们需要重新设置我们的名称服务器:
1; Name servers
2 IN NS ns1.example.com.
3 IN NS ns2.example.com.
接下来,您将使用您正在引用的 IP 地址的最后一个八分之一,并将其指向您想要返回的完全合格域名。
1; PTR Records
21 IN PTR ns1.example.com.
32 IN PTR ns2.example.com.
43 IN PTR www.example.com.
当你完成时,文件应该看起来像这样:
1$TTL 604800
2@ IN SOA example.com. admin.example.com. (
3 5 ; Serial
4 604800 ; Refresh
5 86400 ; Retry
6 2419200 ; Expire
7 604800 ) ; Negative Cache TTL
8;
9
10; Name servers
11 IN NS ns1.example.com.
12 IN NS ns2.example.com.
13
14; PTR records
151 IN PTR ns1.example.com.
162 IN PTR ns2.example.com.
173 IN PTR www.example.com.
保存并关闭文件,当你完成。
测试文件并重新启动服务
主服务器的配置现在已经完成,但我们仍然需要实施我们的更改。
在重新启动我们的服务之前,我们应该测试所有配置文件,以确保它们正确配置,我们有一些工具可以检查我们每个文件的语法。
首先,我们可以通过使用命令named-checkconf
检查named.conf.local
和named.conf.options
文件,因为这两个文件都是由骨骼文件named.conf
源,它将测试我们修改的文件的语法。
1sudo named-checkconf
如果返回没有任何消息,则意味着named.conf.local
和named.conf.options
文件是语法有效的。
接下来,您可以通过将区域处理的域和区域文件位置传递到命名检查区域
命令来检查您的个别区域文件,因此,对于我们的指南,您可以通过键入以下方式检查前进区域文件:
1sudo named-checkzone example.com /etc/bind/zones/db.example.com
如果你的文件没有问题,它应该告诉你它加载了正确的序列号,并给出OK
消息;
1zone example.com/IN: loaded serial 5
2OK
如果你遇到任何其他消息,这意味着你有问题与你的区域文件. 通常,该消息是相当描述什么部分是无效的。
您可以通过输入in-addr.arpa
地址和文件名来检查反向区域。
1sudo named-checkzone 2.0.192.in-addr.arpa /etc/bind/zones/db.192.0.2
再次,这应该为您提供有关加载正确的序列号的类似信息:
1zone 2.0.192.in-addr.arpa/IN: loaded serial 5
2OK
如果您的所有文件正在检查,您可以重新启动绑定
服务:
1sudo service bind9 restart
你应该通过键入检查日志:
1sudo tail -f /var/log/syslog
仔细观察此日志,以确保没有错误。
配置二级绑定服务器
现在我们已经配置了主服务器,我们可以继续进行并设置二级服务器,这将比主服务器更容易。
配置选项文件
再次,我们将从named.conf.options
文件开始,用 sudo 特权在文本编辑器中打开它:
1sudo nano /etc/bind/named.conf.options
我们将对这个文件进行相同的修改,我们将对我们的主要服务器的文件进行修改。
1options {
2 directory "/var/cache/bind";
3 recursion no;
4 allow-transfer { none; };
5
6 dnssec-validation auto;
7
8 auth-nxdomain no; # conform to RFC1035
9 listen-on-v6 { any; };
10};
保存并关闭文件,当你完成。
配置本地配置文件
接下来,我们将在二级服务器上配置 named.conf.local
文件. 在文本编辑器中使用 sudo 特权打开它:
1sudo nano /etc/bind/named.conf.local
在这里,我们将创建每个区域规格,就像我们在我们的主要服务器上一样。
首先,我们将工作在前进区域. 启动它,就像你在主文件一样:
1zone "example.com" {
2};
这一次,我们将类型
设置为奴隶
,因为这个服务器是该区域的次要服务器,这只是意味着它通过传输而不是本地系统上的文件接收该区域文件。
原因在于,对于次要区域,Bind存储了文件 /var/cache/bind
.Bind已经配置为在这个目录位置查看,所以我们不需要指定路径。
对于我们的前方区域,这些细节将看起来像这样:
1zone "example.com" {
2 type slave;
3 file "db.example.com";
4};
最后,而不是允许传输
指令,我们将根据IP地址指定主要服务器,该服务器将接受区域传输。
1zone "example.com" {
2 type slave;
3 file "db.example.com";
4 masters { 192.0.2.1; };
5};
这完成了我们的前方区域规格,我们可以使用相同的格式来处理我们的反向区域规格:
1zone "2.0.192.in-addr.arpa" {
2 type slave;
3 file "db.192.0.2";
4 masters { 192.0.2.1; };
5};
当你完成时,你可以保存和关闭文件。
测试文件并重新启动服务
我们实际上不需要在二级机器上创建任何实际的区域文件,因为正如我们之前提到的,这个服务器将从主服务器接收区域文件。
再次,我们应该检查配置文件语法. 由于我们没有任何区域文件来检查,我们只需要使用命名-checkconf
工具:
1sudo named-checkconf
如果返回没有任何错误,则意味着您修改的文件没有语法错误。
如果是这样的情况,您可以重新启动您的Bind服务:
1sudo service bind9 restart
检查主要和次要服务器上的日志,使用:
1sudo tail -f /var/log/syslog
您应该看到一些条目,表明区域文件已正确传输。
向您的名称服务器授权权
您的专有名称服务器现在应该完全配置,但您仍然需要将域名权限授权给您的名称服务器。
要做到这一点,您将不得不访问您购买域名的网站. 界面和可能的术语将因您使用的域名注册器而有所不同。
在您的域设置中,寻找一个选项,允许您指定您想要使用的名称服务器. 由于我们的名称服务器是 within 我们的域,这是一个特殊的案例。
而不是注册商简单地通过使用NS记录授权该区域的权限,它将需要创建一个 glue记录 . 粘贴记录是一个A记录,在指定它授权的名称服务器后指定名称服务器的IP地址。
通常,代表团只列出将处理域权威的名称服务器,但当名称服务器位于域本身时,对于母域中的名称服务器需要一个A记录。
因此,您需要在域名注册器的控制面板中找到一个部分,允许您指定名称服务器和他们的IP地址。
作为示范,注册器 Namecheap有两个不同的名称服务器部分。
有一个名为名称服务器注册
的部分,允许您在您的域内指定名称服务器的IP地址:
在内部,您将能够输入域内存在的名称服务器的IP地址:
这将创建 A 记录,它将作为您在母区文件中需要的粘贴记录。
完成此操作后,您应该能够将活跃的域名服务器更改为您的域名服务器. 在 NameCheap 中,您可以使用域名服务器设置
菜单选项:
在这里,您可以告诉它使用您添加的名称服务器作为您的网站的权威服务器:
这些更改可能需要一段时间才能传播,但您应该看到您的名称服务器的数据在接下来的24至48小时内用于大多数注册商。
结论
您现在应该有两个权威的DNS服务器配置为您的域服务器. 这些可以用来存储额外的域信息,因为您获得更多。
配置和管理自己的 DNS 服务器为您提供了对 DNS 记录处理方式的最大控制权. 您可以进行更改,并确保所有相关的 DNS 数据在源头上都是最新的。