CentOS 上配置主 DNS 服务器的简易指南

发布于 2024-09-19 17:59:56 字数 8993 浏览 12 评论 0

任何运作中的域名至少有两台 DNS 服务器,一台称为主域名服务器(比如叫做 ns1),而另一台称为从域名服务器(比如叫做 ns2)。这些服务器通常用于故障转移:如果一台宕机,另外一台就激活成为 DNS 服务器(译注:此处译者有不同意见,事实上两个或更多的 DNS 服务器是共同工作的,并不是第一台停止服务后,第二台才接替工作。解析器是随机选择一个 DNS 服务器进行询问,如果超时则会询问下一个,这是多个 DNS 的故障容错机制)。也可以实现包括负载均衡、防火墙和集群在内的更为复杂的故障转移机制。

一个域的所有 DNS 条目都会被添加到主域名服务器,从服务器只会根据主服务器上的 SOA 记录的序列号参数从主服务器同步所有信息。

此教程将会讲述 如何创建一台在 CentOS 上运行的主 DNS 服务器 。请注意,本教程中提到的 DNS 服务器将会是一台开放 DNS 服务器,这也就是说该服务器将会回应来自任何 IP 地址的查询。对于 DNS 服务器的访问控制将在 此教程 中讨论(译注:开放的 DNS 服务器是一个安全隐患)。

在开始之前,我想要提一下的是,DNS 可以在 chroot 环境中配置,也可以在非 chroot 环境中配置。chroot 环境将 DNS 服务器限制在系统中某个特定目录中,以避免让服务器具有系统级的访问权限。在此环境中,任何 DNS 服务器的安全漏洞不会导致整个系统的破坏。将 DNS 服务器置于 chroot 环境中,对于部署测试也很有用。

目标

我们将在基于域名 example.tst 的测试环境中配置一台 DNS 服务器,这个域名是虚假的(并不真实存在的)。这样,我们就不会意外干扰到其它真实的域名。

在该域中,有以下三台服务器。

服务器IP 地址托管的服务完全限定域名(FQDN)
Server A172.16.1.1Mailmail.example.tst
Server B172.16.1.2Web, FTPwww.example.tst
ftp.example.tst
Server C172.16.1.3Primary DNS serverns1.example.tst

我们将会配置一台主域名服务器,并添加上表中必要的域和 DNS 记录。

设置主机名

所有的主机名必须以完全限定域名的方式正确定义,可以通过以下方法完成设置。

# vim /etc/sysconfig/network 

HOSTNAME=ns1.example.tst

注:该文件中指定的主机名参数在服务器启动后才会启用(译注:或者网络服务重启后),因此,该设置不会马上生效。下面的命令可以立刻临时性地修改主机名。

# hostname ns1.example.tst 

一旦设置,主机名可以通过以下命令验证。

# hostname 
ns1.example.tst

在进入下一步之前,请确保上述三台服务器上的主机名已经设置正确。

安装软件包

我们将使用 bind 来配置 DNS 服务,该软件可以很方便地通过 yum 来安装。

不使用 chroot 环境的:

# yum install bind bind-chroot 

使用 chroot 环境的:

# yum install bind bind-chroot 

准备配置文件

正如前面提到的,bind 可以在 chroot 环境下配置,或者在非 chroot 环境下配置,配置文件的路径会因为是否安装 chroot 包而不同。

 配置文件路径区域文件路径
不带有 chroot/etc//var/named/
带有 chroot/var/named/chroot/etc//var/named/chroot/var/named/

可以使用默认提供的 named.conf 配置文件,但是为了更方便使用,我们将使用另外一个简单的配置文件模板。

非 chroot 环境:

# cp /usr/share/doc/bind-9.8.2/sample/etc/named.rfc1912.zones /etc/named.conf

chroot 环境:

# cp /usr/share/doc/bind-9.8.2/sample/etc/named.rfc1912.zones /var/named/chroot/etc/named.conf

现在来备份并修改配置文件。

非 chroot 环境:

# vim /etc/named.conf 

chroot 环境:

# vim /var/named/chroot/etc/named.conf 

添加/修改以下行:

options {
## 区域文件存放目录 ##
directory "/var/named";

## 对于非本地权威域的请求转发到 Google 的公开 DNS 服务器 ##
forwarders { 8.8.8.8; };
};

## 申明一个本地域 example.tst ##
zone "example.tst" IN {
        type master;
        file "example-fz"; ## 存储文件名,放在 /var/named ##
        allow-update { none; };
};

## 为 IP 段 172.16.1.0 提供反向解析 ##
zone "1.16.172.in-addr.arpa" IN {
        type master;
        file "rz-172-16-1"; ## 存储文件名,放在 /var/named ##
        allow-update { none; };
};

准备区域文件

那些默认的区域文件会自动创建到/var/named 或者/var/named/chroot/var/named (chroot 环境)。如果在这些地方找不到这些文件,/usr/share/doc/bind 目录中提供了模板文件,可以从这里拷贝。

假设默认区域文件没有提供,我们可以从/usr 拷贝模板文件。

非 chroot 环境:

# cp /usr/share/doc/bind-9.8.2/sample/var/named/named.* /var/named/

chroot 环境:

# cp /usr/share/doc/bind-9.8.2/sample/var/named/named.* /var/named/chroot/var/named

很好!由于现在默认的区域文件已经准备好,我们可以为 example.tst 和 172.16.1.0 网络创建区域文件了,以下要点必须时刻谨记。

  • 区域文件中的特殊字符‘@’意味着空。(译注:意即代表本域。)
  • 所有的完全限定域名必须以点‘.’结束。如:example.tst.如果没有这个点,你会发生问题。(译注:即会被当做当前 @所代表的域的子域。)

1. 转发区域(本地权威域)

转发区域包含了名称到 IP 地址的映射。对于公开的域,域名托管提供商的 DNS 服务器存储了转发区域文件。(译注:转发区域即本地的权威域,由这个服务器自身提供权威的解析数据)

非 chroot 环境:

# vim /var/named/example-fz 

chroot 环境:

# vim /var/named/chroot/var/named/example-fz 

$TTL 1D
@       IN SOA  ns1.example.tst. sarmed.example.tst. (
                                        0       ; serial
                                        1D      ; refresh
                                        1H      ; retry
                                        1W      ; expire
                                        3H )    ; minimum
IN NS      ns1.example.tst.
IN A       172.16.1.3
mail        IN A        172.16.1.1
        IN MX 10    mail.example.tst.
www     IN A        172.16.1.2
ns1     IN A        172.16.1.3
ftp     IN CNAME    www.example.tst.

说明 :在区域文件中,SOA 是开始授权(Start Of Authority)的意思。它的值的第一段是授权名称服务器的完全限定域名。完全限定域名后面跟着的是电子邮件地址。由于不能在 sarmed@example.tst 这样的格式中使用‘@’符号(译注:@有特定意义,代表本域。),我们将电子邮件地址重写成 sarmed.example.tst.这样的格式。

以下是典型的常用 DNS 记录类型:

  • NS :域名服务器
  • A : 地址记录,记录主机名到 IP 地址的映射(译注,此处原文有误。)
  • MX : 邮件交换记录。这里我们只用了一个邮件交换记录,设置其优先级为 10。如果有多个邮件交换记录,我们可以使用多个数值优先级,数字小的优先级最高。例如,MX 0 比 MX 1 优先级更高。
  • CNAME : 标准名。如果在一台单一服务器上托管了多个服务,也很可能将多个名称解析到某个单一服务器。CNAME 指定了一台服务器可能有的其它名称,并且将它们指向具有实际 A 记录的名称。

2. 反向区域

反向区域包含了 IP 地址到名称的映射。这里,我们为 172.16.1.0 网络创建反向区域。在正式的域中,公共 IP 区块的拥有者拥有的 DNS 服务器存储反向区域文件。(某些服务,如邮件服务,要求 IP 地址具备正确的反向解析才能正常工作。而 IP 的反向解析,通常是由 IP 的拥有者如接入商或 IDC 来负责解析。)

非 chroot 环境:

# vim /var/named/rz-172-16-1 

chroot 环境:

# vim /var/named/chroot/var/named/rz-172-16-1 

$TTL 1D
@       IN SOA  ns1.example.tst. sarmed.example.tst. (
                                        0       ; serial
                                        1D      ; refresh
                                        1H      ; retry
                                        1W      ; expire
                                        3H )    ; minimum
IN NS      ns1.example.tst.
1       IN PTR  mail.example.tst.
2       IN PTR  www.example.tst.
3       IN PTR  ns1.example.tst.

说明 :除了下面的参数外,反向区域文件中的大多数参数和转发区域文件中的相同。

  • PTR: IP 反向解析记录,指向一个反向限定域名。

结束工作

既然区域文件已经准备好,我们接下来调整它们的权限。

非 chroot 环境:

# chgrp named /var/named/* 

chroot 环境:

# chgrp named /var/named/chroot/var/named/* 

现在,我们为 DNS 服务器设置 IP 地址。

# vim /etc/resolv.conf 

nameserver 172.16.1.3

最后,我们可以启动 DNS 服务,并确保将它添加到启动服务中。

# service named restart
# chkconfig named on 

DNS 服务器起动后,建议关注一下日志文件/var/log/messages,这里头包含了后台运行的一些有用信息。如果没有发现错误,我们可以开始测试 DNS 服务器。

测试 DNS

我们可以使用 dig 或者 nslookup 来测试 DNS。首先,我们需要安装必要的软件包。

# yum install bind-utils 

1. 使用 dig 测试转发区域

使用 dig 来测试时,必须时刻关注状态信息:“NOERROR”,任何其它值都表明存在问题。

# dig example.tst 

;; ->>HEADER<<- opcode: QUERY,  status: NOERROR, id: 31184

;; QUESTION SECTION:
;example.com.                   IN      A

;; ANSWER SECTION:
example.com.            86400   IN      A       172.16.1.3

;; AUTHORITY SECTION:
example.com.            86400   IN      NS      ns1.example.com.

;; ADDITIONAL SECTION:
ns1.example.com.        86400   IN      A       172.16.1.3

2. 使用 dig 测试 PTR 记录

使用 dig 来测试时,必须时刻关注状态信息:“NOERROR”,任何其它值都表明存在问题。(译注,也可用 dig 1.1.16.172.in-addr.arpa. ptr 来测试。)

# dig -x 172.16.1.1 

;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 27415

;; QUESTION SECTION:
;1.1.17.172.in-addr.arpa.       IN      PTR

;; ANSWER SECTION:
1.1.16.172.in-addr.arpa. 86400  IN      PTR     mail.example.tst.

;; AUTHORITY SECTION:
1.16.172.in-addr.arpa.  86400   IN      NS      ns1.example.tst.

;; ADDITIONAL SECTION:
ns1.example.tst.        86400   IN      A       172.16.1.3

3. 使用 dig 测试 MX 记录

# dig example.tst mx 

;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 35405

;; QUESTION SECTION:
;example.tst.                        IN      MX

;; ANSWER SECTION:
example.tst.         14366   IN      MX     10  mail.example.tst.

排错提示

  1. 我已经把 SELinux 关闭。
  2. 保证防火墙没有阻挡 UDP 53 端口
  3. 万一出错,可在/var/log/messages 中查看到有用的信息
  4. 确保区域文件的属主为‘named’
  5. 确保 DNS 服务器的 IP 地址是/etc/resolv.conf 中的第一条目
  6. 如果你使用 example.tst 作为实验环境,确保将服务器从互联网断开,因为 example.tst 是一个不存在的域。

最后小结,该教程关注的是实验环境中配置 example.tst 域用作为演示。请注意,该教程中创建了一台公共 DNS 服务器,此服务器会回应来自任何源 IP 地址的查询。如果你是在配置 DNS 生产服务器,请确保检查与公共 DNS 相关的策略。其它教程涵盖了 创建从 DNS 服务器 , 限制对 DNS 服务器的访问 以及部署 DNSSEC。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

樱娆

暂无简介

0 文章
0 评论
24 人气
更多

推荐作者

johnliu

文章 0 评论 0

她如夕阳

文章 0 评论 0

17380058762

文章 0 评论 0

呆头

文章 0 评论 0

934062727

文章 0 评论 0

余生共白头

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文