介绍
DNS,或域名系统,在学习如何配置网站和服务器时往往是一个困难的组成部分,虽然大多数人可能会选择使用他们的托管公司或域名注册商提供的DNS服务器,但创建自己的DNS服务器有一些优势。
在本指南中,我们将讨论如何在 Ubuntu 16.04 机器上安装和配置 Bind9 DNS 服务器作为缓存或转发 DNS 服务器。
前提和目标
要完成本指南,您首先需要熟悉一些常见的DNS术语。 查看 此指南 了解我们将在本指南中实施的一些概念。
我们将展示实现类似目标的两个独立配置:缓存和转发DNS服务器。
要跟进,你需要访问两个计算机(其中至少一个应该是Ubuntu 16.04服务器)。一个将作为客户端,另一个将被配置为DNS服务器。
我们的示例配置的细节是:
密码地址: 密码地址: 密码地址: 密码地址: 密码地址: 密码地址: 密码地址: 密码地址: 密码地址: 密码地址: 密码地址: 密码地址: 密码地址: 密码地址: 密码地址: 密码地址: 密码地址: 密码地址: 密码地址: 密码地址: 密码地址: 密码地址: 密码地址: 密码地址: 密码地址: 密码地址: 密码地址: 密码地址: 密码地址: 密码地址: 密码地址: 密码地址: 密码地址: 密码地址: 密码地址: 密码地址: 密码地址: 密码地址: 密码地址: 密码
我们将向您展示如何将客户端机器配置为使用DNS服务器进行查询,我们将向您展示如何根据您的需求将DNS服务器配置为两种不同的配置。
缓存 DNS 服务器
此类服务器也被称为解析器,因为它处理回复性查询,并且通常可以处理从其他服务器追踪DNS数据的残酷工作。
当缓存 DNS 服务器追踪客户端查询的答案时,它会返回客户端的答案,但它还会将答案存储在其缓存中,直到记录的 TTL 值允许的时间。
几乎所有您在网络配置中可能拥有的 DNS 服务器都将是缓存 DNS 服务器 。 这弥补了大多数客户机上实施的DNS解析器库不足. 缓存 DNS 服务器是很多情况下的好选择 。 如果您不想依赖您的 ISPs DNS 或其他可公开获取的 DNS 服务器, 让您自己的缓存服务器是一个很好的选择 。 如果在物理上接近客户机,也极有可能改善DNS查询时间.
DNS 服务器转发
我们将演示的第二个配置是 ** forwarding** DNS 服务器. 从客户端的角度来看,一个 forwarding DNS 服务器将看起来几乎与缓存服务器相同,但机制和工作负载完全不同。
转发的 DNS 服务器提供了维持缓存的相同优势,以改善客户端的 DNS 解析时间. 然而,它实际上没有做复发性查询本身。
这让转发服务器从其缓存中回复,同时不要求它完成递归查询的全部工作. 这使得服务器只能提出单项请求(已转发客户端请求),而不必通过整个重现程序. 在外部带宽传输成本高、您的缓存服务器可能需要经常更换、或者您希望将本地查询转发给一个服务器和外部查询给另一个服务器的情况下,这可能是一个优势.
在 DNS 服务器上安装 Bind
无论您想要使用哪种配置选择,实施Bind DNS服务器的第一步是安装实际的软件。
Bind软件在Ubuntu的默认存储库中可用,所以我们只需要更新本地包索引并使用apt
安装该软件。
1sudo apt-get update
2sudo apt-get install bind9 bind9utils bind9-doc
现在已经安装了Bind组件,我们可以开始配置服务器,转发服务器将使用缓存服务器配置作为一个跳出点,所以无论你的最终目标如何,先将服务器配置为缓存服务器。
配置为缓存 DNS 服务器
首先,我们将介绍如何将Bind配置为缓存DNS服务器,这种配置将迫使服务器在客户端发出查询时从其他DNS服务器回复寻找答案。
Bind 配置文件默认地保存在 /etc/bind
中的目录中。
1cd /etc/bind
我们不会担心这个目录中的大多数文件,主要的配置文件叫做named.conf
(named
和bind
是同一个应用程序的两个名称)。
对于一个缓存的 DNS 服务器,我们只会修改 named.conf.options
文件. 用 sudo 特权在文本编辑器中打开:
1sudo nano named.conf.options
随着评论被剥夺了可读性,文件看起来像这样:
1[label /etc/bind/named.conf.options]
2options {
3 directory "/var/cache/bind";
4
5 dnssec-validation auto;
6
7 auth-nxdomain no; # conform to RFC1035
8 listen-on-v6 { any; };
9};
要配置缓存,第一步是设置访问控制列表或ACL。
作为一个用于解决复发性查询的 DNS 服务器,我们不希望 DNS 服务器被恶意用户滥用. 被称为 DNS 放大攻击 的攻击特别麻烦,因为它可能会导致您的服务器参与分布式拒绝服务攻击。
DNS强化攻击是恶意用户试图击落互联网上的服务器或网站的一种方式。为了做到这一点,他们试图找到能够解决复发性查询的公共DNS服务器。他们伪造了受害者的IP地址,并发送了一项查询,该查询将返回DNS服务器的大响应。
要避免您的服务器被用于恶意目的的可能性,我们将配置一个我们信任的IP地址或网络范围列表。
在选项
块上方,我们将创建一个名为acl
的新块,为您正在配置的 ACL 组创建一个标签。
1[label /etc/bind/named.conf.options]
2acl goodclients {
3};
4
5options {
6 . . .
在这个区块中,列出应该允许使用这个DNS服务器的IP地址或网络,因为我们的服务器和客户端都在同一个 /24子网中运行,在我们的示例中,我们会将示例限制在这个网络中。
1[label /etc/bind/named.conf.options]
2acl goodclients {
3 192.0.2.0/24;
4 localhost;
5 localnets;
6};
7
8options {
9 . . .
现在我们有一个我们想要解决请求的客户端ACL,我们可以在选项
块中配置这些功能。
1[label /etc/bind/named.conf.options]
2. . .
3
4options {
5 directory "/var/cache/bind";
6
7 recursion yes;
8 allow-query { goodclients; };
9 . . .
我们明确启用了重复,然后配置了允许查询
参数以使用我们的ACL规格。我们可以使用不同的参数,例如允许重复
来参考我们的ACL组。
但是,如果没有设置允许重复
,那么Bind会回到允许查询缓存
列表,然后回到允许查询
列表,最后只设置了本地网络
和本地主机
的默认值。
完成这些更改后,保存并关闭文件。
如果你决定这是你想要使用的服务器类型,请自由跳过前来学习如何检查配置文件,重新启动服务,并实施客户端配置。
否则,继续阅读以了解如何设置转发DNS服务器。
配置为先发 DNS 服务器
如果转发DNS服务器更适合您的基础设施,我们可以轻松地设置它。
我们将从我们在缓存服务器配置中丢弃的配置开始,‘named.conf.options’文件应该是这样的:
1[label /etc/bind/named.conf.options]
2acl goodclients {
3 192.0.2.0/24;
4 localhost;
5 localnets;
6};
7
8options {
9 directory "/var/cache/bind";
10
11 recursion yes;
12 allow-query { goodclients; };
13
14 dnssec-validation auto;
15
16 auth-nxdomain no; # conform to RFC1035
17 listen-on-v6 { any; };
18};
我们将使用相同的ACL列表来将我们的DNS服务器限制在特定客户端列表中,但我们需要更改配置,以便服务器不再试图执行复发性查询。
要做到这一点,我们将回归
变更为不
。转发服务器仍然提供回归服务,通过回答对它不具有权威性的区域的查询,相反,我们需要建立一个缓存服务器列表来传递我们的请求。
首先,我们在内部创建一个被称为转发器
的区块,其中包含我们想要转发请求的重复性名称服务器的IP地址。
1[label /etc/bind/named.conf.options]
2. . .
3
4options {
5 directory "/var/cache/bind";
6
7 recursion yes;
8 allow-query { goodclients; };
9
10 forwarders {
11 8.8.8.8;
12 8.8.4.4;
13 };
14 . . .
之后,我们应该将前进
指令设置为仅限
,因为这个服务器会转发所有请求,不应该试图自行解决请求。
配置文件将在你完成后看起来像这样:
1[label /etc/bind/named.conf.options]
2. . .
3
4options {
5 directory "/var/cache/bind";
6
7 recursion yes;
8 allow-query { goodclients; };
9
10 forwarders {
11 8.8.8.8;
12 8.8.4.4;
13 };
14 forward only;
15
16 dnssec-validation auto;
17
18 auth-nxdomain no; # conform to RFC1035
19 listen-on-v6 { any; };
20};
我们应该做的最后一个变化是对 dnssec
参数. 随着当前的配置,取决于转发的 DNS 服务器的配置,您可能会在日志中看到一些类似于此的错误:
1Jun 25 15:03:29 cache named[2512]: error (chase DS servers) resolving 'in-addr.arpa/DS/IN': 8.8.8.8#53
2Jun 25 15:03:29 cache named[2512]: error (no valid DS) resolving '111.111.111.111.in-addr.arpa/PTR/IN': 8.8.4.4#53
要避免这种情况,请将dnssec验证
设置更改为是
并明确启用dnssec:
1[label /etc/bind/named.conf.options]
2. . .
3
4forward only;
5
6dnssec-enable yes;
7dnssec-validation yes;
8
9auth-nxdomain no; # conform to RFC1035
10. . .
当你完成时,保存并关闭文件. 现在你应该有一个转发DNS服务器。 继续到下一节来验证配置文件并重新启动Demon。
测试您的配置并重新启动绑定
现在,您已经将 Bind 服务器配置为缓存 DNS 服务器或转发 DNS 服务器,我们已经准备好实施我们的更改。
在我们下沉并在我们的系统上重新启动Bind服务器之前,我们应该使用Bind提供的工具来检查我们的配置文件的语法。
我们可以通过键入简单地做到这一点:
1sudo named-checkconf
如果您的配置中没有语法错误,壳提示将立即返回,而不会显示任何输出。
如果您在配置文件中出现语法错误,您将被告知错误和发生错误的行号码。
当您确认配置文件没有语法错误时,请重新启动 Bind daemon 以实现更改:
1sudo systemctl restart bind9
如果您遵循初始服务器设置指南,则您的服务器上启用了 UFW 防火墙,我们需要允许 DNS 流量到我们的服务器以响应客户端请求。
通过键入启用Bind的防火墙策略的例外:
1sudo ufw allow Bind9
之后,在设置客户端机器时,请关注服务器日志,以确保一切顺利进行。
1sudo journalctl -u bind9 -f
现在,打开一个新的终端窗口来配置您的客户端机器。
配置客户端机器
现在你有你的服务器运行,你可以配置你的客户端机器使用这个DNS服务器查询。
登录您的客户端机器. 确保您正在使用的客户端已在您为 DNS 服务器设置的 ACL 组中指定,否则 DNS 服务器将拒绝为客户端提供请求。
我们需要编辑 /etc/resolv.conf
文件,将我们的服务器指向名称服务器. 这里所做的更改只会持续到重新启动,这对于测试来说是很棒的。
在文本编辑器中打开 sudo 特权文件:
1sudo nano /etc/resolv.conf
该文件将列出用于解决查询的 DNS 服务器,通过设置nameserver
指令。 评论所有当前的条目并添加一个nameserver
行,指向您的 DNS 服务器:
1[label /etc/resolv.conf]
2nameserver 192.0.2.2
3# nameserver 8.8.4.4
4# nameserver 8.8.8.8
5# nameserver 209.244.0.3
保存并关闭文件。
现在,您可以通过使用一些常见的工具来测试,以确保查询可以正确地解决。
您可以使用ping
来测试可以连接到域:
1ping -c 1 google.com
1[secondary_label Output]
2PING google.com (173.194.33.1) 56(84) bytes of data.
364 bytes from sea09s01-in-f1.1e100.net (173.194.33.1): icmp_seq=1 ttl=55 time=63.8 ms
4
5--- google.com ping statistics ---
61 packets transmitted, 1 received, 0% packet loss, time 0ms
7rtt min/avg/max/mdev = 63.807/63.807/63.807/0.000 ms
这意味着我们的客户端可以使用我们的DNS服务器连接到google.com
。
我们可以通过使用DNS特定的工具获得更详细的信息,例如挖掘
。
1dig linuxfoundation.org
1[secondary_label Output]
2; <<>> DiG 9.9.5-3-Ubuntu <<>> linuxfoundation.org
3;; global options: +cmd
4;; Got answer:
5;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 35417
6;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
7
8;; OPT PSEUDOSECTION:
9; EDNS: version: 0, flags:; udp: 4096
10;; QUESTION SECTION:
11;linuxfoundation.org. IN A
12
13;; ANSWER SECTION:
14linuxfoundation.org. 6017 IN A 140.211.169.4
15
16;; Query time: 36 msec
17;; SERVER: 192.0.2.2#53(192.0.2.2)
18;; WHEN: Wed Jun 25 15:45:57 EDT 2014
19;; MSG SIZE rcvd: 64
如果我们再次提出请求,服务器应该从其缓存中提取数据,减少响应时间:
1dig linuxfoundation.org
1[secondary_label Output]
2; <<>> DiG 9.9.5-3-Ubuntu <<>> linuxfoundation.org
3;; global options: +cmd
4;; Got answer:
5;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 18275
6;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
7
8;; OPT PSEUDOSECTION:
9; EDNS: version: 0, flags:; udp: 4096
10;; QUESTION SECTION:
11;linuxfoundation.org. IN A
12
13;; ANSWER SECTION:
14linuxfoundation.org. 6012 IN A 140.211.169.4
15
16;; Query time: 1 msec
17;; SERVER: 192.0.2.2#53(192.0.2.2)
18;; WHEN: Wed Jun 25 15:46:02 EDT 2014
19;; MSG SIZE rcvd: 64
正如你所看到的,缓存响应要快得多。
我们还可以通过使用我们发现的IP地址(‘140.211.169.4’在我们的情况下)测试反向搜索,使用挖掘的‘-x’选项:
1dig -x 140.211.169.4
1[secondary_label Output]
2; <<>> DiG 9.9.5-3-Ubuntu <<>> -x 140.211.169.4
3;; global options: +cmd
4;; Got answer:
5;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 61516
6;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1
7
8;; OPT PSEUDOSECTION:
9; EDNS: version: 0, flags:; udp: 4096
10;; QUESTION SECTION:
11;4.169.211.140.in-addr.arpa. IN PTR
12
13;; ANSWER SECTION:
144.169.211.140.in-addr.arpa. 3402 IN CNAME 4.0-63.169.211.140.in-addr.arpa.
154.0-63.169.211.140.in-addr.arpa. 998 IN PTR load1a.linux-foundation.org.
16
17;; Query time: 31 msec
18;; SERVER: 192.0.2.2#53(192.0.2.2)
19;; WHEN: Wed Jun 25 15:51:23 EDT 2014
20;; MSG SIZE rcvd: 117
正如你所看到的,逆转也成功了。
在您的 DNS 服务器上,您应该查看测试期间是否有任何错误。
1[secondary_label Output from sudo journalctl -u bind9 -f]
2. . .
3Jun 25 13:16:22 cache named[2004]: error (network unreachable) resolving 'ns4.apnic.net/A/IN': 2001:dc0:4001:1:0:1836:0:140#53
4Jun 25 13:16:22 cache named[2004]: error (network unreachable) resolving 'ns4.apnic.com/A/IN': 2001:503:a83e::2:30#53
5Jun 25 13:16:23 cache named[2004]: error (network unreachable) resolving 'sns-pb.isc.org/AAAA/IN': 2001:500:f::1#53
6Jun 25 13:16:23 cache named[2004]: error (network unreachable) resolving 'ns3.nic.fr/A/IN': 2a00:d78:0:102:193:176:144:22#53
这表明服务器正在尝试解决IPv6信息,但服务器未配置为IPv6。
要做到这一点,我们可以修改开始 Bind9 的 systemd 单元文件:
1sudo systemctl edit --full bind9
在出现的文件中,在ExecStart
行末尾添加4
,以限制服务器对IPv4请求:
1[label Editing bind9 systemd unit file]
2[Unit]
3Description=BIND Domain Name Server
4Documentation=man:named(8)
5After=network.target
6
7[Service]
8ExecStart=/usr/sbin/named -f -u bind -4
9ExecReload=/usr/sbin/rndc reload
10ExecStop=/usr/sbin/rndc stop
11
12[Install]
13WantedBy=multi-user.target
保存并关闭文件,当你完成。
重新加载 systemd daemon 以将更改的单元文件读入 init 系统:
1sudo systemctl daemon-reload
重启 Bind9 服务以实现这些更改:
1sudo systemctl restart bind9
您不应该在日志中再次看到这些错误。
使客户端 DNS 设置永久化
如前所述,将客户端机器指向我们的 DNS 服务器的 /etc/resolv.conf
设置不会在重新启动时存活下来。
如果客户机运行 Debian 或 Ubuntu,请打开具有 sudo 特权的 `/etc/network/interfaces' 文件:
1sudo nano /etc/network/interfaces
你可以删除现有条目,并用你的DNS服务器替换它们,或者只是添加你的DNS服务器作为一个选项:
1[label /etc/network/interfaces]
2. . .
3
4iface eth0 inet static
5 address 192.168.2.100
6 netmask 255.255.255.0
7 gateway 192.168.2.1
8 dns-nameservers 192.0.2.2
9
10. . .
保存并关闭文件,当你完成下一次启动,你的设置将被应用。
如果客户端运行 CentOS 或 Fedora,则需要打开 /etc/sysconfig/network/network-scripts/ifcfg-eth0
文件:
1sudo nano /etc/sysconfig/network-scripts/ifcfg-eth0
在内部,寻找以DNS
开头的行。 将DNS1
更改为您的DNS服务器. 如果您不希望使用其他DNS服务器作为回溯,请删除其他条目:
1[label /etc/sysconfig/network-scripts/ifcfg-eth0]
2. . .
3DNS1=192.0.2.2
4. . .
完成后保存并关闭文件. 您的客户端应在下次启动时使用这些设置。
结论
您现在应该有一个缓存或转发的 DNS 服务器配置为您的客户端服务,这可以是一个很好的方式来加快您管理的机器的 DNS 查询。