博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
dns 服务器 linux_在Linux上构建自己的DNS服务器
阅读量:2528 次
发布时间:2019-05-11

本文共 14449 字,大约阅读时间需要 48 分钟。

dns 服务器 linux

在这个分为两部分的系列的上一篇文章中, ,我描述了DNS数据库的结构以及如何在客户端上配置名称服务。 我还列出并描述了一些在构建名称服务器或尝试解释dig命令结果时可能会遇到的更常见的DNS记录。

在本文中,我将向您展示如何使用 (伯克利Internet名称域)来构建自己的名称服务器。 这并不像您想的那么困难,尤其是因为您可以分两个阶段进行。

在本文中,您将首先学习如何创建缓存名称服务器,然后继续学习如何将其升级到网络的完整主(主)域名服务器,并带有正向和反向区域文件。

使用BIND设置DNS服务器

使用BIND设置名称服务器非常简单,因此,我将向您展示如何在可能进行实验的任何计算机上进行此操作。 这个小实验项目将向您展示如何在计算机上将BIND安装和配置为缓存名称服务器,对其进行测试,然后将其设置为带有区域文件的主要名称服务器,该区域文件可用作网络或网络的名称解析器。仅用于测试。

从技术上讲,可以在任何可用的GNU / Linux计算机上设置名称服务器,因为它不会干扰网络上的其他主机或它们的操作。 但是,除非您有明确的许可,否则您可能不应该在非您拥有或有权修改的计算机上执行此操作。

我的设定

您只需要一台计算机即可执行此实验室项目中的所有任务,但其中一项任务除外。 我在功能更强大的ThinkPad上使用此设置,因为当我使用有线或无线连接连接到非家庭网络时,由DHCP(动态主机配置协议)提供的名称服务器有时可能不可靠。 为了证明几乎所有主机都可以充当名称服务器,我已经在旧的上网本上测试了此项目。

在此项目中,我将使用华硕的专用IP地址,但您应使用所用主机的IP地址。

主机文件

首先,让我们看一下/ etc / hosts文件。 在默认状态下,hosts文件中应该只有两行,下面的清单1中看到了前两行。

127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4     
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
# Lab hosts
192.168.25.1        server
192.168.25.21      host1
192.168.25.22      host2
192.168.25.23      host3
192.168.25.24      host4

清单1:您可以维护一个简单的hosts文件,以在小型网络中执行解析器的功能。

尽管可以如清单1所示添加主机名及其各自的IP地址,但这并不是名称服务的最佳解决方案,尤其是在旅行时。 如果您的主机文件中还有其他条目,则在它们影响命名或IP地址的情况下,您可能需要在本项目进行期间将它们注释掉。 除了两条默认行外,大多数人将没有其他条目。

制备

缓存名称服务器无法代替您对/ etc / hosts的使用来解析内部网络上的主机名。 但是,与使用ISP或其他公共名称服务器相比,缓存名称服务器在解析常用的外部名称(例如时可以提高性能。 最好的部分是,设置缓存名称服务器非常容易。

在开始之前,您应该通过执行以下步骤进行准备。

首先,制作文件/ etc / hosts/etc/ named.confresolv.conf/ etc / sysconfig / iptables的备份副本。

如果尚未安装它们,请使用发行版的软件包管理器来安装以下BIND RPM: bindbind-chrootbind-utils 。 要使您的实验室主机能够使用缓存名称服务器,必须在/etc/resolv.conf中添加一个名称服务器行以指向您自己的主机。 例如,如果您的实验室主机IP地址为192.168.0.203(如我的epc一样) ,则将以下行添加到/etc/resolv.conf中的名称服务器列表的顶部:

name server         192.168.0.203

确保使用您要在其上进行此项目的主机的IP地址。

您可以使用本地主机的IP地址127.0.0.1代替外部IP地址。 您还应该注释掉指向其他主机作为名称服务器的所有行。 确保保存修订后的resolv.conf文件。

这些更改将立即生效,不需要重新启动或重新启动服务。 现在尝试对不阻止ICMP(Internet控制消息协议)数据包的公共公用主机执行ping操作。 请随意使用我的防火墙,它是 。

ping wally2.both.org

您应该收到“未知主机”或“名称或服务未知”错误,因为您当前在resolv.conf文件中没有定义可用的DNS服务或解析器。 现在,使用dig命令查看名称服务是否正常运行。

dig wally2.both.com

您应该收到错误“连接超时;无法访问任何服务器”。

设置缓存名称服务器

缓存名称服务器不是任何域的权威来源。 它只是缓存来自网络的所有名称解析器请求的结果,以加快对同一远程主机的未来请求的响应。

注意: named.conf文件非常注重语法,尤其是标点符号。 分号用于描述条目的结尾,节的结尾以及行的结尾。 确保按照示例所示正确添加它们。

对于缓存名称服务器的初始设置,有必要对默认的/etc/named.conf文件进行一些修改,因此请使用您喜欢的编辑器来编辑该文件。 首先,将本地测试主机的IP地址添加到“ listen-on port 53”行,如下面的清单2所示。 这使named可以侦听主机的外部IP地址,以便其他计算机也可以将其用作名称服务器。

默认情况下,BIND引用Internet的根名称服务器来查找域的权威名称服务器。 可以指定BIND本地实例向其发送请求的其他服务器(称为“转发器”),而不是根服务器。 这确实增加了DNS劫持的可能性。

如下所示添加“转发器”行。 这将告诉您的缓存DNS服务器在本地尚未缓存IP地址时从何处获取IP地址。 下面列表中的IP地址用于您可以使用本地ISP或OpenDNS或其他一些公共名称服务器作为转发器。 不需要定义任何转发器,在这种情况下,如果未定义转发器,则BIND将使用文件/var/named/named.ca中定义的Internet根服务器来定位域的权威名称服务器。 但是对于本练习,请定义清单2中的转发器。

注释掉IPV6行,因为我们不在实验室环境中使用IPV6。 请注意,“ //”两个正斜杠表示named.conf文件中的注释。

//     
// named.conf
// Provided by Red Hat bind package to configure the ISC BIND named(8) DNS
// server as a caching only name server (as a localhost DNS resolver only).
// See /usr/share/doc/bind*/sample/ for example named configuration files.
//
//
options {
        listen-on port 53 { 127.0.0.1; 192.168.0.203; };
//      listen-on-v6 port 53 { ::1; };
        forwarders { 8.8.8.8; 8.8.4.4; };
        directory       "/var/named";
        dump-file       "/var/named/data/cache_dump.db";
        statistics-file "/var/named/data/named_stats.txt";
        memstatistics-file "/var/named/data/named_mem_stats.txt";
        allow-query     { localhost; 192.168.0.0/24; };
        recursion yes;
        dnssec-enable yes;
        dnssec-validation yes;
        dnssec-lookaside auto;
        /* Path to ISC DLV key */
        bindkeys-file "/etc/named.iscdlv.key";
        managed-keys-directory "/var/named/dynamic";
};
logging {
        channel default_debug {
                file "data/named.run";
                severity dynamic;
        };
};
zone "." IN {
        type hint;
        file "named.ca";
};
include "/etc/named.rfc1912.zones";
include "/etc/named.root.key";

清单2:/etc/named.conf文件提供了设置缓存名称服务器所需的简单配置。 需要添加或更改的行以粗体突出显示。

将本地网络地址192.168.0.0/24添加到allow-query行。 此行指定此DNS服务器将从其接受DNS查询的网络。

启动名称服务

现在启动命名服务,并将命名服务配置为在每次引导时启动。 我在Fedora 25主机上使用了systemctl命令,但是该命令在您的主机上可能有所不同,具体取决于您使用的发行版。 请注意,已命名BIND解析器服务的名称。

systemctl enable named     
systemctl start named

为了确保缓存名称服务器正常工作,可以执行的第一个测试是使用dig查找wally2.both.org的DNS数据库信息。 要进一步测试缓存名称服务器,请使用dig命令获取一些常见Internet网站的IP地址,例如 ,CNN,Wired以及您喜欢的任何其他网站。 现在,结果应显示您的主机为响应服务器。

此时,您的缓存名称服务器将正确解析Internet上的主机,这是因为对公用主机的那些DNS请求已转发到Google公用名称服务器-请参阅named.conf中的“ forwarders”行。 但是,内部名称服务仍然依赖于/ etc / hosts文件。 创建主要名称服务器可以解决该问题。

创建主要名称服务器

创建缓存名称服务器后,将其转换为成熟的主要名称服务器并不难。 主名称服务器是其代表的域的权威来源。

您需要再次更改named.conf并创建几个新文件。 您将创建一个名为Example.com的域,该域是在此类文档中保留用于示例目的的域名。 Example.com域的确在Internet上有一个IP地址,并且网站非常稀疏,但是您可以在实验项目的其余部分中使用该名称,而不会给任何人造成麻烦。 在本练习的其余部分中,将使用Example.com域作为内部域名。

您将创建的两个新文件是正向区域文件和反向区域文件,它们将放置在/ var / named目录中 。 该位置由named.conf配置文件中的“目录”指令指定。

创建前向区域文件

前向区域文件包含“ A”记录,该记录将区域(也称为域)中的主机名与它们各自的IP地址配对。 它还可能包含CNAME记录,这些记录是A记录中真实主机名的别名,以及邮件服务器的MX记录。

创建一个基本的前向区域文件/var/named/example.com.zone ,并在其中添加以下几行。 完成后,您的区域文件应类似于下面清单3中的示例区域文件。

; Authoritative data for example.com zone     
;
$TTL 1D
@   IN SOA  epc.example.com   root.epc.example.com. (
                                       2017031301      ; serial
                                       1D              ; refresh
                                       1H              ; retry
                                       1W              ; expire
                                       3H )            ; minimum
$ORIGIN         example.com.
example.com.            IN      NS      epc.example.com.
epc                     IN      A       127.0.0.1
server                  IN      A       192.168.25.1
www                     IN      CNAME   server
mail                    IN      CNAME   server
test1                   IN      A       192.168.25.21
t1                      IN      CNAME   test1
test2                   IN      A       192.168.25.22
test3                   IN      A       192.168.25.23
test4                   IN      A       192.168.25.24
; Mail server MX record
example.com.            IN      MX      10      mail.example.com.

清单3:Example.com域的转发区域文件包含此域的主机名及其IP地址。

清单3中的第一个非注释行是生存时间说明符,在这种情况下,对于没有另外指定的所有记录,它是一天。 D代表Day。 SOA(授权开始)行中的说明符也很明显。 SOA记录中参数的详细信息进行了详细描述。

NS记录必须具有您要在其上执行此实验室项目的主机的FQDN(完全合格域名)。 文件中还必须有一个A记录,其中包含主机的有效IP地址。 在这种情况下,您应该使用本地主机IP地址127.0.0.1。

上面显示的条目将为您提供一些用于试验的主机名。

确保使用今天的日期,并在序列号后附加一个从01开始的计数器。 上面的序列号是2017年3月4日的第一次更改。只要更改区域文件,序列号就会递增。 如果有辅助名称服务器使用该名称服务器作为主要服务器,则除非序列号增加,否则不会更新它们。

将转发区域文件添加到named.conf

但是,在DNS服务器开始工作之前,您需要在/etc/named.conf中创建一个条目,该条目将指向您的新区域文件。 将以下行添加到顶级提示区域的条目下方,但应在“包含”行之前。

zone "example.com" IN {     
        type master;
        file "example.com.zone";
};

清单4:将这些行添加到named.conf文件中,以将Example.com区域文件添加到解析器配置中。

现在重新启动, 使这些更改生效。 通过使用dignsloookup命令测试名称服务器,以获取在前向区域文件中配置的主机的IP地址。 请注意, dignslookup命令无需主机就可以在网络上返回IP地址。

dig test1.example.com     
dig t1.example.com
dig mx example.com
dig mail.example.com
nslookup test3.example.com
dig www.amazon.com

请注意,除非在/etc/resolv.conf文件中提供Example.com的域和搜索条目,否则除了nslookup命令外,还需要对这些命令使用FQDN。 在这种情况下,它们可能不是,所以只需使用FQDN进行该项目中的所有测试。

使用根名称服务器

请注意,根名称服务器被指定为Amazon.com查找的权威服务器。 但是请记住,您正在使用Google公共名称服务器作为转发器。 现在,注释掉named.conf中的转发器行,然后重新启动named 。 再次运行以上命令以比较返回的结果。 结果应类似于清单5中的结果。

# dig www.amazon.com          
; <<>> DiG 9.10.4-P6-RedHat-9.10.4-4.P6.fc25 <<>> www.amazon.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 65004
;; flags: qr rd ra; QUERY: 1, ANSWER: 6, AUTHORITY: 4, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;www.amazon.com.                        IN      A
;; ANSWER SECTION:
www.amazon.com.         1800    IN      CNAME   www.cdn.amazon.com.
www.cdn.amazon.com.     300     IN      CNAME   d3ag4hukkh62yn.cloudfront.net.
d3ag4hukkh62yn.cloudfront.net. 60 IN    A       52.85.147.120
d3ag4hukkh62yn.cloudfront.net. 60 IN    A       52.85.147.50
d3ag4hukkh62yn.cloudfront.net. 60 IN    A       52.85.147.92
d3ag4hukkh62yn.cloudfront.net. 60 IN    A       52.85.147.109
;; AUTHORITY SECTION:
d3ag4hukkh62yn.cloudfront.net. 1831 IN  NS      ns-1144.awsdns-15.org.
d3ag4hukkh62yn.cloudfront.net. 1831 IN  NS      ns-130.awsdns-16.com.
d3ag4hukkh62yn.cloudfront.net. 1831 IN  NS      ns-2021.awsdns-60.co.uk.
d3ag4hukkh62yn.cloudfront.net. 1831 IN  NS      ns-824.awsdns-39.net.
;; Query time: 3857 msec
;; SERVER: 192.168.0.203#53(192.168.0.203)
;; WHEN: Mon Mar 13 09:18:30 EDT 2017
;; MSG SIZE  rcvd: 306

清单5:在上的查找结果包含一些有趣的信息,包括各种记录类型的生存时间。

当我这样做时,在找到并返回数据时,第一次调用解析亚马逊的外部地址花费了3857毫秒。 执行相同查询的后续结果为1ms,这表明在本地缓存解析程序结果的优势。 请注意,答案部分行中的数字1800、300和60,权限部分行中的数字1831-这是TTL(生存时间),以秒为单位。 如果您多次执行查找,则这些数字将更改,显示记录保留在本地缓存中的剩余时间。

创建反向区域文件

域的反向区域将提供反向搜索的能力。 许多组织没有在内部进行这些操作,但是反向查找有助于确定问题。 许多反垃圾邮件配置(例如SpamAssassin)都在寻找反向查询来验证有效的电子邮件服务器。

创建反向区域文件/var/named/example.com.rev并添加以下内容。 确保使用适当的序列号。

; Authoritative data for example.com  reverse zone     
;
$TTL 1D
@   IN SOA  test1.example.com   root.test1.example.com. (
                                        2017031501      ; serial
                                        1D              ; refresh
                                        1H              ; retry
                                        1W              ; expire
                                        3H )            ; minimum
@       IN      NS      epc.example.com.
example.com.    IN      NS      epc.example.com.
1               IN      PTR     mail.example.com.
1               IN      PTR     server.example.com.
21              IN      PTR     test1.example.com.
22              IN      PTR     test2.example.com.
23              IN      PTR     test3.example.com.
24              IN      PTR     test4.example.com.

清单6:将此反向区域文件example.com.rev用于您的名称服务器。

您还可以将反向区域文件命名为/var/named/25.168.192.in-addr.arpa ,该文件遵循旧的约定。 实际上,您可以随意命名它,因为您将在named.conf文件中显式指向它,但是使用这两个约定之一将使其他约定更容易跟随您的工作。

将反向区域添加到named.conf

zone    "25.168.192.in-addr.arpa" IN {     
       type master;
       file "example.com.rev";
};

清单7:将此节添加到named.conf文件中将启用反向查找。

将清单7中的节添加到/etc/named.conf文件中,以指向新的反向区域。 现在,使用清单8中的命令重新加载named并测试您的反向区域。您的结果应该类似于下面的结果。

​systemctl reload named     
# dig -x 192.168.25.23
; <<>> DiG 9.10.4-P6-RedHat-9.10.4-4.P6.fc25 <<>> -x 192.168.25.23
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 48607
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;23.25.168.192.in-addr.arpa.    IN      PTR
;; ANSWER SECTION:
23.25.168.192.in-addr.arpa. 86400 IN    PTR     test3.example.com.
;; AUTHORITY SECTION:
25.168.192.in-addr.arpa. 86400  IN      NS      epc.example.com.
;; Query time: 21 msec
;; SERVER: 192.168.0.203#53(192.168.0.203)
;; WHEN: Wed Mar 15 16:18:59 EDT 2017
;; MSG SIZE  rcvd: 112

清单8:重新启动named之后,当您在反向区域中的IP地址上进行反向查找时,应该会看到与这些结果相似的结果。

确保测试网络中的一些其他反向条目,并尝试以下操作以及要尝试的其他反向查找。 -x选项表示反向查找。

dig -x 192.168.25.23     
dig -x 192.168.25.1

请注意,并非所有在正向区域中都有条目的主机都需要在反向区域中具有条目,但是如果这样做,确实可以提供更一致的结果。

至此,您已经有了使用BIND的工作名称服务器。 但是,外部主机尚不能使用此名称服务器,因为尚未将防火墙配置为允许DNS请求。

为DNS配置IPTable

如果希望本地网络上的其他主机将您的主机用作其名称服务器,则可以执行此步骤。

测试主机上的防火墙可能会阻止对主机的名称服务访问。 IPTables必须配置为允许名称服务器上的UDP(用户数据报协议)数据包入站,以便其他主机将其用于名称解析。 使用以下命令添加所需的条目并保存。

将规则添加到IPTables或防火墙防火墙,该规则允许端口53(域)上的传入数据包使用UDP,并保存新规则集。 确保在-A INPUT -m状态--state RELATED,ESTABLISHED -j ACCEPT行之后插入新规则,因此您必须计算过滤器表中INPUT行的数量。 以下命令中的数字7表示此规则将插入到现有INPUT规则中的位置7中。

iptables -t filter -I INPUT 7 -p udp -m conntrack --ctstate NEW -m udp --dport 53 -j ACCEPT

如果愿意,可以保存新的防火墙规则,也可以将其保存为永久安装而不是实验室项目。 然后使用下面的清单9中的命令从您的其他主机之一进行测试。 @epc参数告诉dig命令使用主机名为epc的指定名称服务器。 您应该替换刚刚创建的DNS服务器的IP地址,或者替换为网络上指向新名称服务器的可解析主机名。 当然,您总是可以将该主机名及其IP地址添加到用于远程测试的主机的/ etc / hosts文件中。

# dig @epc test1.example.com     
; <<>> DiG 9.10.4-P6-RedHat-9.10.4-4.P6.fc25 <<>> @epc test1.example.com
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 27957
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;test1.example.com.             IN      A
;; ANSWER SECTION:
test1.example.com.      86400   IN      A       192.168.25.21
;; AUTHORITY SECTION:
example.com.            86400   IN      NS      epc.both.org.
;; Query time: 0 msec
;; SERVER: 192.168.0.203#53(192.168.0.203)
;; WHEN: Mon Mar 13 08:45:34 EDT 2017
;; MSG SIZE  rcvd: 92

清单9:测试您从同一网络上的其他主机创建的名称解析器。

清理

为了进行清理,您应该使用适合您的发行版的工具执行以下任务。 如果您尚未为网络保留此名称服务器,则可能只希望保留它。

  1. 恢复原始的/ etc / hosts文件。
  2. 停止在用于此实验室项目的解析器主机上命名。
  3. 禁用命名服务。
  4. 删除区域文件。
  5. 恢复原始的named.conf文件。
  6. 恢复原始的resolv.conf文件。

最后的想法

在我实际上使用BIND为我的网络创建名称服务器之前,名称服务的功能对我来说似乎一直很模糊。 它非常简单,可以提高DNS查找性能。 拥有自己的名称服务器还可以防止由于维护不佳的ISP名称服务器而造成的许多相对较小但烦人的名称服务中断。

请注意,即使我的小型EeePC在 CPU使用率达到100%的情况下运行,它也对解析器的请求做出了非常快速的响应。 您应该能够在任何可用的Linux主机上尝试该项目,并且影响很小。 我希望你们中的许多人将尝试建立自己的名称服务器并进行试验。 名称服务器安装的详细信息将取决于主机和网络的详细信息。

资源资源

翻译自:

dns 服务器 linux

转载地址:http://vfjzd.baihongyu.com/

你可能感兴趣的文章
CentOS7 重置root密码
查看>>
Centos安装Python3
查看>>
PHP批量插入
查看>>
laravel连接sql server 2008
查看>>
Laravel框架学习笔记之任务调度(定时任务)
查看>>
Ubuntu菜鸟入门(五)—— 一些编程相关工具
查看>>
valgrind检测linux程序内存泄露
查看>>
Hadoop以及组件介绍
查看>>
1020 Tree Traversals (25)(25 point(s))
查看>>
第一次作业
查看>>
“==”运算符与equals()
查看>>
单工、半双工和全双工的定义
查看>>
Hdu【线段树】基础题.cpp
查看>>
时钟系统
查看>>
BiTree
查看>>
5个基于HTML5的加载动画推荐
查看>>
水平权限漏洞的修复方案
查看>>
静态链接与动态链接的区别
查看>>
Android 关于悬浮窗权限的问题
查看>>
如何使用mysql
查看>>