Fork me on GitHub

Ubuntu 20.04上配置BIND作为私有网络DNS服务器

准备及说明

假设某公司有多个数据中心,数据中心1以内部使用idc1.meeleet.com,数据中心2使用idc2.meeleet.com,数据中心3使用idc3.meeleet.com。我们这里以数据中心3内部需要搭建私网DNS服务器为例来讲,idc3.meeleet.com(具体实施过程中,按读者实际情况进行修改)

  • DNS服务器
私网IP地址 简称 是否为主DNS服务器
10.1.80.220 ns1 是(主DNS服务器)
10.1.80.221 ns2 否(备DNS服务器)
  • DNS客户端
私网IP地址 简称
10.1.80.91 s91
10.1.80.92 s92

步骤1 在DNS服务器上安装Bind

在主DNS服务器及备DNS服务器上安装BIND

ON ns1 ns2

1
sudo apt install bind9 bind9utils bind9-doc

修改启动参数

1
sudo vi /etc/default/named

OPTIONS参数最后添加-4,使用Ipv4模式

1
2
3
4
5
6
#
# run resolvconf?
RESOLVCONF=no

# startup options for the server
OPTIONS="-u bind -4"

重启bind

1
sudo systemctl restart bind9

步骤2 配置主DNS服务器

on ns1

配置Options文件

打开named.conf.options并修改

1
sudo vi /etc/bind/named.conf.options
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
acl "trusted" {
10.1.80.220; # ns1
10.1.80.221; # ns2
10.1.80.0/24; # trusted DNS clients network
};

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

recursion yes; # enables recursive queries
allow-recursion { trusted; }; # allows recursive queries from "trusted" clients
allow-query { trusted; }; # allows queries from "trusted" clients
listen-on { 10.1.80.220; }; # ns1 private IP address - listen on private network only
allow-transfer { none; }; # disable zone transfers by default

forwarders {
223.5.5.5;
223.6.6.6;
114.114.114.114;
};

dnssec-validation auto;

listen-on-v6 { any; };
};

注意forwards配置块,有三个ip地址,其中223.5.5.5,223.6.6.6是阿里云公共DNS,114.114.114.114是电信提供公共的DNS。forwards可以为无法直接连接到外网的机器提供域名解析服务。

完成之后,保存并关闭named.conf.options文件。上面的配置指定只有您自己的服务器(受信任”trusted”的服务器)能够查询您的DNS服务器的外部域。

配置named.conf.local

on ns1

打开named.conf.local,用vi来编辑

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

正向、反向解析,指定配置文件路径

1
2
3
4
5
6
7
8
9
10
11
12

zone "idc3.meeleet.com" {
type primary;
file "/etc/bind/zones/db.idc3.meeleet.com"; # zone file path
allow-transfer { 10.1.80.221; }; # ns2 private IP address - secondary
};

zone "80.1.10.in-addr.arpa" {
type primary;
file "/etc/bind/zones/db.10.1.80"; # 10.1.80.0/24 subnet
allow-transfer { 10.1.80.221; }; # ns2 private IP address - secondary
};

创建正向zone文件

on ns1

创建转发区域文件存放目录

1
mkdir -p /etc/bind/zones

复制db.local并修改

1
sudo cp /etc/bind/db.local /etc/bind/zones/db.idc3.meeleet.com
1
2
3
4
5
6
7
8
9
10
11
12
13
14
;
; BIND data file for local loopback interface
;
$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

localhost替换为idc3.meeleet.com,删除含delete this line标记的行

文件最后添加上DNS服务器NS记录

1
2
3
4
5
6

...

; name servers - NS records
IN NS ns1.idc3.meeleet.com.
IN NS ns2.idc3.meeleet.com.

给这个域内的主机添加A记录

1
2
3
4
5
6
7
8
9
...

; name servers - A records
ns1.idc3.meeleet.com. IN A 10.1.80.220
ns2.idc3.meeleet.com. IN A 10.1.80.221

; 10.1.80.0/24 - A records
s91.idc3.meeleet.com. IN A 10.1.80.91
s92.idc3.meeleet.com. IN A 10.1.80.92

每次编辑区域文件时,需要在重新启动命名进程之前增加Serial值。在这里,将其增加为3,注意增加Serial值非常重要!非常重要!非常重要!最终zone配置文件内容如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27

; BIND data file for local loopback interface
;
$TTL 604800
@ IN SOA idc3.meeleet.com. root.idc3.meeleet.com. (
3 ; Serial
604800 ; Refresh
86400 ; Retry
2419200 ; Expire
604800 ) ; Negative Cache TTL
;

; name servers - NS records
IN NS ns1.idc3.meeleet.com.
IN NS ns2.idc3.meeleet.com.





; name servers - A records
ns1.idc3.meeleet.com. IN A 10.1.80.220
ns2.idc3.meeleet.com. IN A 10.1.80.221

; 10.1.80.0/24 - A records
s91.idc3.meeleet.com. IN A 10.1.80.91
s92.idc3.meeleet.com. IN A 10.1.80.92

保存/etc/bind/zones/db.idc3.meeleet.com

创建反向zone文件

1
sudo cp /etc/bind/db.127 /etc/bind/zones/db.10.1.80
1
2
3
4
5
6
7
8
9
10
$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

删除含delete this line标记的行

最终

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
$TTL    604800
@ IN SOA ns1.idc3.meeleet.com. root.idc3.meeleet.com. (
3 ; Serial
604800 ; Refresh
86400 ; Retry
2419200 ; Expire
604800 ) ; Negative Cache TTL
;


; name servers - NS records
IN NS ns1.idc3.meeleet.com.
IN NS ns2.idc3.meeleet.com.

; PTR Records
220 IN PTR ns1.idc3.meeleet.com. ; 10.1.80.220
221 IN PTR ns2.idc3.meeleet.com. ; 10.1.80.221
91 IN PTR s91.idc3.meeleet.com. ; 10.1.80.91
92 IN PTR s92.idc3.meeleet.com. ; 10.1.80.92

检查配置文件是否正确

1
2
3
4
sudo named-checkzone idc3.meeleet.com /etc/bind/zones/db.idc3.meeleet.com

zone idc3.meeleet.com/IN: loaded serial 2
OK
1
2
3
sudo named-checkzone 80.1.10.in-addr.arpa /etc/bind/zones/db.10.1.80
zone 80.1.10.in-addr.arpa/IN: loaded serial 2
OK

检查没问题,可以重启bind9

1
sudo systemctl restart bind9

如果有使用ufw,则需要让ufw允许bind9(如果有启用ufw的话)

1
sudo ufw allow Bind9

步骤3 配置备DNS服务器

多数情况下搞一套主备DNS服务器还是很有必要的,这样的话当主备DNS服务器不可用时,备DNS服务器也可以接受DNS查询请求并作出响应。幸运的是,配置一个备DNS服务器比配置主DNS服务器简单多了。

on ns2

编辑named.conf.options文件

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

在文件的顶部,添加包含所有受信任服务器的私有IP地址的ACL。(也支持添加单独的ip,这里我为了方便,直接用网段来表示,这样就不用一个个IP写出来了)

1
2
3
4
5
6
7
8
9
acl "trusted" {
10.1.80.220; # ns1
10.1.80.221; # ns2
10.1.80.0/24; # trusted DNS clients network
};

options {

. . .

directory指令下方,添加如下行

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
. . .

recursion yes; # enables recursive queries
allow-recursion { trusted; }; # allows recursive queries from "trusted" clients
allow-query { trusted; }; # allows queries from "trusted" clients
listen-on { 10.1.80.221; }; # ns2 private IP address
allow-transfer { none; }; # disable zone transfers by default

forwarders {
223.5.5.5;
223.6.6.6;
114.114.114.114;
};

. . .

保存并关闭named.conf.options文件。这个文件应该与ns1的named.conf.options文件相同,只是它应该被配置为监听ns2的私有IP地址。

最终named.conf.options文件内容如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
acl "trusted" {
10.1.80.220; # ns1
10.1.80.221; # ns2
10.1.80.0/24; # trusted DNS clients network
};
options {
directory "/var/cache/bind";

recursion yes; # enables recursive queries
allow-recursion { trusted; }; # allows recursive queries from "trusted" clients
allow-query { trusted; }; # allows queries from "trusted" clients
listen-on { 10.1.80.221; }; # ns2 private IP address
allow-transfer { none; }; # disable zone transfers by default

forwarders {
223.5.5.5;
223.6.6.6;
114.114.114.114;
};

dnssec-validation auto;

listen-on-v6 { any; };
};

现在编辑named.conf.loca文件

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13


zone "idc3.meeleet.com" {
type slave;
file "db.idc3.meeleet.com";
masters { 10.1.80.220; }; # ns1 private IP
};

zone "80.1.10.in-addr.arpa" {
type slave;
file "db.10.1.80";
masters { 10.1.80.220; }; # ns1 private IP
};

注意:考虑到它们的负面含义,DigitalOcean倾向于尽可能避免使用“主人”和“奴隶”等术语。在Bind的最新版本中,可以使用primaries而不是masters,并将备服务器的类型定义为secondary服务器而不是slave服务器。然而,从默认的Ubuntu 20.04存储库中安装的BIND版本(如步骤1中所述)将无法识别这些选项,这意味着除非升级,否则您将不得不使用包含较少的术语。

保存并关闭named.conf.local文件
运行以下命令检查配置文件有效性

1
sudo named-checkconf

如果命令执行反回没有任何错误,那么就可以重启bind

1
sudo systemctl restart bind9

然后通过修改防火墙规则使得允许DNS客户端的连接到此DNS服务器

1
sudo ufw allow Bind9

到现在为止,DNS主备服务器就搭建好了

从ns1传输到ns2的区域文件放在 ns2的/var/cache/bind/目录

1
2
ls /var/cache/bind/
db.10.1.80 db.idc3.meeleet.com managed-keys.bind managed-keys.bind.jnl

步骤4 配置DNS客户端

在受信任ACL中的所有服务器都可以查询您的DNS服务器之前,必须将每个服务器配置为使用ns1和ns2作为DNS服务器。

假设您的客户端服务器运行Ubuntu,您需要找到与您的专用网络相关联的设备。可以使用ip address命令查询私有子网。在每台客户机上运行以下命令,将突出显示的子网替换为您自己的子网。

1
2
3
4
5
ip address show to 10.1.80.0/24

2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
inet 10.1.80.91/24 brd 10.1.80.255 scope global enp0s3
valid_lft forever preferred_lft forever

本例中私网网卡名为enp0s3。本节中的示例将把enp0s3作为私有网络(10.1.80.0/24网段)网卡,不过您应该根据您的实际情况更改这些示例,以反映您自己的服务器的私有网卡。

修改/etc/netplan/00-installer-config.yaml给s91,s92的相应网卡设置ns1和ns2 DNS服务器的地址,以及search域

1
vi /etc/netplan/00-installer-config.yaml

s91

1
2
3
4
5
6
7
8
9
10
11
12
network:
ethernets:
enp0s3:
addresses:
- 10.1.80.91/24
gateway4: 10.1.80.254
nameservers:
addresses: [10.1.80.220,10.1.80.221]
search: [idc3.meeleet.com]
enp0s8:
dhcp4: true
version: 2

s92

1
2
3
4
5
6
7
8
9
10
11
12
13
14
network:
ethernets:
enp0s3:
addresses:
- 10.1.80.92/24
gateway4: 10.1.80.254
nameservers:
addresses:
- 10.1.80.220
- 10.1.80.221
search: [idc3.meeleet.com]
enp0s8:
dhcp4: true
version: 2

DNS服务器列表network->ethernets->enp0s3->nameservers->addresses两种配置方式都可以。search的作用就是就去ping s91时,原来当访问的域名(s91)不能被DNS解析时,resolver会将该域名加上search指定的参数,也就是s91.idc3.meeleet.com,重新请求DNS,直到被正确解析或试完search指定的列表为止。

保存并关闭

使用netplan try尝试新配置,如果有问netplay会在倒计时后自动回滚配置。

现在,检查系统的DNS解析器,以确定您的DNS配置是否已应用:

1
sudo systemd-resolve --status

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
Global
LLMNR setting: no
MulticastDNS setting: no
DNSOverTLS setting: no
DNSSEC setting: no
DNSSEC supported: no
DNSSEC NTA: 10.in-addr.arpa
16.172.in-addr.arpa
168.192.in-addr.arpa
17.172.in-addr.arpa
18.172.in-addr.arpa
19.172.in-addr.arpa
20.172.in-addr.arpa
21.172.in-addr.arpa
22.172.in-addr.arpa
23.172.in-addr.arpa
24.172.in-addr.arpa
25.172.in-addr.arpa
26.172.in-addr.arpa
27.172.in-addr.arpa
28.172.in-addr.arpa
29.172.in-addr.arpa
30.172.in-addr.arpa
31.172.in-addr.arpa
corp
d.f.ip6.arpa
home
internal
intranet
lan
local
private
test

Link 3 (enp0s8)
Current Scopes: DNS
DefaultRoute setting: yes
LLMNR setting: yes
MulticastDNS setting: no
DNSOverTLS setting: no
DNSSEC setting: no
DNSSEC supported: no
Current DNS Server: 223.5.5.5
DNS Servers: 223.5.5.5
223.6.6.6

Link 2 (enp0s3)
Current Scopes: DNS
DefaultRoute setting: yes
LLMNR setting: yes
MulticastDNS setting: no
DNSOverTLS setting: no
DNSSEC setting: no
DNSSEC supported: no
Current DNS Server: 223.5.5.5
DNS Servers: 223.5.5.5
223.6.6.6
10.1.80.200
10.1.80.201
DNS Domain: idc3.meeleet.com

步骤5 测试客户端

步骤6 维护DNS记录

现在你已拥有了工作在内网的DNS服务器,你需要维护DNS记录以便支持你的服务器环境。

添加新主机DNS记录

任何时候你要添加新主机到你的服务器环境(在同一个数据中心),添加一个新主机的DNS记录,需要以下步骤:

主域名服务器

  • 正向区域文件:为新主机添加A记录,并增加Serial值

  • 反向区域文件:为新主机增加PTR记录,并增加Serial值

  • 添加新的主机私网IP地址到受信任的ACL列表(named.conf.options)

测试配置文件:

1
2
3
sudo named-checkconf
sudo named-checkzone idc3.meeleet.com /etc/bind/zones/db.idc3.meeleet.com
sudo named-checkzone 80.1.10.in-addr.arpa /etc/bind/zones/db.10.1.80

辅域名服务器

  • 添加新的主机私网IP地址到受信任的ACL列表(named.conf.options)

检查配置文件语法是否正确

1
sudo named-checkconf

然后重载bind:

1
sudo systemctl reload bind9

删除主机DNS记录

如果你要删除某个主机的DNS记录,只需要删除之前添加的该主机的DNS记录信息(就是与之前添加主机DNS记录的步骤相反)

参考

How To Configure BIND as a Private Network DNS Server on Ubuntu 20.04

如何在CentOS-7上将BIND配置为专用网络DNS服务器

ISC BIND9 - 最详细、最认真的从零开始的 BIND 9 - DNS服务搭建及其原理讲解

Bind9安装设置指南