CentOS 7 使用 bind 配置私有网络的 DNS

前言

CentOS 7 使用 bind 配置私有网络的 DNS,记录一下大致的安装和配置过程。

DNS (Domain Name Service) 域名服务是计算机网络很基础的服务,一般如果局域网内计算机多了,可以考虑搭建一个内网 DNS,将 IP 地址转换为名字,这样记起来更容易。

参考 How To Configure BIND as a Private Network DNS Server on CentOS 7

环境说明

CentOS 7(Minimal Install)

样例说明

本例需要 4 台服务器

10.11.0.199 ns1
10.11.0.209 ns2
10.11.0.101 host1
10.11.0.102 host2

ns1 为主 DNS,ns2 为次 DNS,host1,host2 分别为注册的主机(注意: host1, host2 不是机器名,因为机器名跟 DNS 没关系,host1, host2 是 DNS 里配置的

具体说明如下:

  • 我们使用 2 个服务器 host1 和 host2
  • 服务器在一个机房内,本例为北京机房(bj1 datacenter)
  • 机房内的服务器网络是相互联通的(本例都在 10.11.0.0/16 子网内)
  • 本机房使用 example.com 这个域名(实际情况请自行更改,注意最好使用自己的域名,这样可以保障不会出现重复等冲突
Host Role Private FQDN Private IP Address
host1 Host host1.bj1.example.com 10.11.0.101
host2 Host host2.bj1.example.com 10.11.0.102

注意:请根据实际情况更改域名和 IP 。

目的说明

我们最终搭建主 DNS 服务器 ns1 和次 DNS服务器 ns2。

列表如下:

Host Role Private FQDN Private IP Address
ns1 Primary DNS ns1.bj1.example.com 10.11.0.199
ns2 Secondary DNS ns2.bj1.example.com 10.11.0.209

安装和配置

更新系统

$ sudo yum update

版本如下

$ cat /etc/redhat-release
CentOS Linux release 7.3.1611 (Core)

安装 bind

DNS 服务器都需要安装 bind。

$ sudo yum install bind bind-utils

安装之后,开始配置主 DNS 服务器。

配置主 DNS 服务器

BIND 包含很多配置文件,在 named.conf 中配置。这些配置文件都是以 “named” 开头,这样 BIND 程序要求的。

配置 bind

BIND 进程名叫 named。 所以,很多文件名都是 named 而不是 bind。

进入 ns1 服务器,编辑 named.conf

$ sudo vi /etc/named.conf

在 options 块前面,创建一个 ACL(Access Control List) 块,名称为 “trusted”。我们使用这个控制局域网内哪些计算机可以使用我们这个域名服务进行递归域名查询。本例将添加 ns1, ns2, host1, host2作为信任的客户机。

acl "trusted" {
	10.11.0.199;  # ns1 - can be set to localhost
	10.11.0.209;  # ns2
	10.11.0.101;  # host1
	10.11.0.102;  # host2
};

现在我们有了信任列表,需要修改 options 块,添加 ns1 的私有 IP 地址到 listen-on port 53,注释掉 listen-on-v6 这行.

options {
	listen-on port 53 { 127.0.0.1; 10.11.0.199; };
#	 listen-on-v6 port 53 { ::1; };
...

在下面的条目下,我们还要添加 allow-transfer 条目,设置为 ns2 的地址。修改 allow-query 从 localhost 改为 trusted。

...
options {
...
	allow-transfer { 10.11.0.209; };      # disable zone transfers by default
...
	allow-query { trusted; };  # allows queries from "trusted" clients
...

在文件的最后,添加这一行

include "/etc/named/named.conf.local";

保存 :wq 之后,看起来是这样的

acl "trusted" {
	10.11.0.199;    # ns1 - can be set to localhost
	10.11.0.209;    # ns2
	10.11.0.101;    # host1
	10.11.0.102;    # host2
};
options {
	listen-on port 53 { 127.0.0.1; 10.11.0.199; };
	# listen-on-v6 port 53 { ::1; };
	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-transfer	{ 10.11.0.209; }; # disable zone transfers by default
	allow-query     { trusted; }; # allows queries from "trusted" clients

	recursion yes;
	dnssec-enable yes;
	dnssec-validation yes;
	bindkeys-file "/etc/named.iscdlv.key";

	managed-keys-directory "/var/named/dynamic";

	pid-file "/run/named/named.pid";
	session-keyfile "/run/named/session.key";
};

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";
include "/etc/named/named.conf.local";

接下来,我们需要新建 named.conf.local 配置 DNS 域

配置本地文件

在 ns1 服务器,配置 named.conf.local

$ sudo vi /etc/named/named.conf.local

我们将本地配置都放到 /etc/named 文件夹下,在这个配置中指定正向和反向的域。

添加正向域

zone "bj1.example.com" {
	type master;
	file "/etc/named/zones/db.bj1.example.com"; # zone file path
};

假设我们的私有子网为 10.11.0.0/16 则需要添加如下反向配置(注意 我们的反向域的名称以 11.10 开始,这正好是 10.11 八进制反过来)

zone "11.10.in-addr.arpa" {
    type master;
    file "/etc/named/zones/db.10.11";  # 10.11.0.0/16 subnet
};

保存 :wq 之后,这个文件看起来是这样的

zone "bj1.example.com" {
    type master;
    file "/etc/named/zones/db.bj1.example.com"; # zone file path
};
zone "11.10.in-addr.arpa" {
    type master;
    file "/etc/named/zones/db.10.11";  # 10.11.0.0/16 subnet
};

如果还有其他子网,则将每个网段都加入到这个文件中,在添加其他域 zone 的配置。

现在域文件指定了,我们就按照这个配置,新建正向域和反向域的文件。

创建正向域文件

正向域文件会定义正向的 DNS 查找(即:根据域名查找 IP, 如 DNS 收到查找 host1.bj1.example.com 的请求,进行查找,之后返回 host1 的 IP 地址)。

根据配置文件,需要新建 /etc/named/zones 文件夹

$ sudo chmod 755 /etc/named
$ sudo mkdir /etc/named/zones

我们开始编辑正向域文件

$ sudo vi /etc/named/zones/db.bj1.example.com

首先,要添加一条 SOA 记录 (起始授权机构)。注意替换为您自己的域名,每次编辑文件,请增加 Serial 的值,之后再重启 named 服务,因为如果数字不增加,次 DNS 不会同步更新配置,本例中 Serial 的值为 3 (RFC1912 2.2建议的格式为YYYYMMDDnn 其中nn为修订号;)。

$TTL	604800
@       IN      SOA     ns1.bj1.example.com. admin.bj1.example.com. (
		      3     ; Serial
		 604800     ; Refresh
		  86400     ; Retry
		2419200     ; Expire
		 604800 )   ; Negative Cache TTL

之后,我们需要添加 NS 记录。

; name servers - NS records
	IN      NS      ns1.bj1.example.com.
	IN      NS      ns2.bj1.example.com.

之后,我们添加 A 记录,进行域名和 IP 地址的映射

; name servers - A records
ns1.bj1.example.com.          IN      A      10.11.0.199
ns2.bj1.example.com.          IN      A      10.11.0.209

; 10.11.0.0/16 - A records
host1.bj1.example.com.        IN      A      10.11.0.101
host2.bj1.example.com.        IN      A      10.11.0.102

保存 :wq 之后,这个文件 db.bj1.example.com 看起来是这样的

$TTL	604800
@       IN      SOA     ns1.bj1.example.com. admin.bj1.example.com. (
		      3     ; Serial
		 604800     ; Refresh
		  86400     ; Retry
		2419200     ; Expire
		 604800 )   ; Negative Cache TTL

; name servers - NS records
		IN      NS      ns1.bj1.example.com.
		IN      NS      ns2.bj1.example.com.

; name servers - A records
ns1.bj1.example.com.          IN      A      10.11.0.199
ns2.bj1.example.com.          IN      A      10.11.0.209

; 10.11.0.0/16 - A records
host1.bj1.example.com.        IN      A      10.11.0.101
host2.bj1.example.com.        IN      A      10.11.0.102

创建反向域文件

反向域文件,主要是 DNS 中的 PTR 记录进行 DNS 查找(即通过 IP 查找域名, 如本例中,DNS 收到查找 10.11.0.101 的请求,进行查找,返回 host1.bj1.example.com 这个域名)

本例在 named.conf.local 配置文件中,只配置了一个 IP 地址段,所以,只建立一个反向域文件示例。

$ sudo vi /etc/named/zones/db.10.11

与正向域文件一样,要添加一条 SOA 记录 (起始授权机构)。注意替换为您自己的域名,每次编辑文件,请增加 Serial 的值,之后再重启 named 服务。

$TTL	604800
@       IN      SOA     ns1.bj1.example.com. admin.bj1.example.com. (
		      3         ; Serial
		 604800         ; Refresh
		  86400         ; Retry
		2419200         ; Expire
		 604800 )       ; Negative Cache TTL

之后,添加 NS 记录

; name servers - NS records
      IN      NS      ns1.bj1.example.com.
      IN      NS      ns2.bj1.example.com.

之后,添加 PTR 记录,注意第一列的 2 个字节是内网地址后两位的反向顺序。

; PTR Records
199.0 IN      PTR     ns1.bj1.example.com.    ; 10.11.0.199
209.0 IN      PTR     ns2.bj1.example.com.    ; 10.11.0.209
101.0 IN      PTR     host1.bj1.example.com.  ; 10.11.0.101
102.0 IN      PTR     host2.bj1.example.com.  ; 10.11.0.102

保存 :wq 之后,这个文件 db.10.11 看起来是这样的

$TTL	604800
@       IN      SOA     ns1.bj1.example.com. admin.bj1.example.com. (
	      3         ; Serial
	 604800         ; Refresh
	  86400         ; Retry
	2419200         ; Expire
	 604800 )       ; Negative Cache TTL

; name servers - NS records
			IN      NS      ns1.bj1.example.com.
			IN      NS      ns2.bj1.example.com.

; PTR Records
199.0 IN      PTR     ns1.bj1.example.com.    ; 10.11.0.199
209.0 IN      PTR     ns2.bj1.example.com.    ; 10.11.0.209
101.0 IN      PTR     host1.bj1.example.com.  ; 10.11.0.101
102.0 IN      PTR     host2.bj1.example.com.  ; 10.11.0.102

检查 bind 配置

使用 named-checkconf 命令检查 named.conf* 文件

$ sudo named-checkconf

如果有错误,会返回错误的提示,请根据提示进行查找问题和修正。

使用 named-checkzone 命令检查域文件语法是否错误

例如,检查正向域文件配置

$ sudo named-checkzone bj1.example.com /etc/named/zones/db.bj1.example.com

检查反向域文件配置

$ sudo named-checkzone 11.10.in-addr.arpa /etc/named/zones/db.10.11

如果检查没有问题,可以重启 bind 服务

启动 bind 服务

启动

$ sudo systemctl start named

设置开机启动

$ sudo systemctl enable named

防火墙开放端口

BIND 默认使用 53 端口,使用 TCP 和 UDP 协议,我们需要再防火墙开放这两个端口。

$ sudo firewall-cmd --zone=public --permanent --add-port=53/tcp
$ sudo firewall-cmd --zone=public --permanent --add-port=53/udp
$ sudo firewall-cmd --reload

查看端口开放

$ sudo firewall-cmd --list-ports
53/udp 53/tcp

到此为止,主 DNS 服务器已经配置完成,我们开始配置次 DNS 服务器

配置次 DNS 服务器

大多数情况下,如果主 DNS 不可用,次 DNS 负责响应,会很好的保障网络稳定性。次 DNS 非常容易配置。

在 ns2 服务器上,编辑 named.conf 配置文件

在 options 块前,插入 ACL 块进行访问控制。

acl "trusted" {
	10.11.0.199;  # ns1 - can be set to localhost
	10.11.0.209;  # ns2
	10.11.0.101;  # host1
	10.11.0.102;  # host2
};

之后,编辑 options 块,添加 ns2 的 IP 地址,注释掉 IP v6 的条目。

options {
	listen-on port 53 { 127.0.0.1; 10.11.0.209; };
# 	 listen-on-v6 port 53 { ::1; };
...

更改 allow-query 条目,由 localhost 改为 trusted。

...
options {
...
	allow-query { trusted; }; # allows queries from "trusted" clients
...

在配置最后,添加本地配置文件

include "/etc/named/named.conf.local";

保存 :wq 之后,编辑 named.conf.local 文件

$ sudo chmod 755 /etc/named
$ sudo vi /etc/named/named.conf.local

设置 slave 类型,主 DNS 服务的 IP 地址,如果设置了多个反向域,需要全部添加在这里。

zone "bj1.example.com" {
    type slave;
    file "slaves/db.bj1.example.com";
    masters { 10.11.0.199; };  # ns1 private IP
};

zone "11.10.in-addr.arpa" {
    type slave;
    file "slaves/db.10.11";
    masters { 10.11.0.199; };  # ns1 private IP
};

保存 :wq 之后,校验一下 named.conf.local

$ sudo named-checkconf

如果没问题,开始启动服务

$ sudo sudo systemctl start named

设置开机启动

$ sudo systemctl enable named

开启防火墙端口

$ sudo firewall-cmd --zone=public --permanent --add-port=53/tcp
$ sudo firewall-cmd --zone=public --permanent --add-port=53/udp
$ sudo firewall-cmd --reload

现在已经设置好了 DNS 服务,还需要在 host1 host2 上配置上这些 DNS 地址,才能使用私有的域名服务。

配置 DNS 客户端

在 CentOS, RedHat, and Fedora Linux VPS, 编辑 resolv.conf 文件。

在 host1 host2 服务器上分别设置:

$ sudo vi /etc/resolv.conf

添加如下配置

search bj1.example.com  # your private domain
nameserver 10.11.0.199  # ns1 private IP address
nameserver 10.11.0.209  # ns2 private IP address

保存 :wq 之后, host1 host2 可以使用域名服务访问内网 IP 地址了。

测试

使用 nslookup 工具,在 CentOS 7 中,这个工具在 bind-utils 内。本例测试对 host2 进行正向查找和反向查找。

在 host1 上安装 bind-utils

$ sudo yum install bind-utils

正向查找

例如根据 host2 查找到该服务器的 IP 地址为 10.11.0.102

$ sudo nslookup host2
Server:		10.11.0.199
Address:	10.11.0.199#53

Name:	host2.bj1.example.com
Address: 10.11.0.102

输入的是 host2 会扩展为 host2.bj1.example.com 其中 bj1.example.com 是在 resolv.conf 中 search 设置的。

也可以查找 FQDN (Fully-Qualified Domain Name)

$ sudo nslookup host2.bj1.example.com
Server:		10.11.0.199
Address:	10.11.0.199#53

Name:	host2.bj1.example.com
Address: 10.11.0.102

反向查找

例如根据 host2 的 IP 地址 10.11.0.102,查找出对应的域名

$ nslookup 10.11.0.102
Server:		10.11.0.199
Address:	10.11.0.199#53

102.0.11.10.in-addr.arpa	name = host2.bj1.example.com.

这表示 DNS 服务配置正常,恭喜!

维护 DNS 记录

如果使用私有 DNS 服务,难免需要增加,修改和删除机器,那么也要相应的维护 DNS 中的记录。

添加主机到 DNS 中

主 DNS 服务器设置

  • 正向域添加 A 记录,增加 Serial 的值
  • 反向域添加 PTR 记录,增加 Serial 的值
  • 添加新主机的 IP 地址到 trusted ACL 中,在 named.conf 配置文件中添加

重启 bind 服务

$ sudo systemctl reload named

次 DNS 服务器设置

  • 添加新主机的 IP 地址到 trusted ACL 中,在 named.conf 配置文件中添加

重启 bind 服务

$ sudo systemctl reload named

配置新主机的 DNS

  • 配置 resolv.conf
  • 使用 nslookup 工具测试

从 DNS 中移除主机

  • 从信任列表删除
  • 删除正向域的 A 记录,增加 Serial 的值
  • 删除反向域的 PTR 记录,增加 Serial 的值

重启 bind 服务

$ sudo systemctl reload named

转发

有时,需要访问外网服务,这就需要用到 bind 的转发功能,在 named.conf 配置的 options 块中,添加 forwarders 条目

...
options {
...
	forwarders {
		8.8.8.8; # 本例使用 Google 的DNS,配置外网的 DNS,请根据实际情况配置
		8.8.4.4;
	};
...

这样,内网 DNS 查找可以使用,也可以进行外网 DNS 正向查找跟反向查找了。

结束语

本例使用 bind 安装和配置主 DNS 服务器和次 DNS 服务器。

  • 配置主 DNS 服务器
  • 配置次 DNS 服务器
  • 测试 DNS 服务
  • 维护 DNS 服务

参考资料

How To Configure BIND as a Private Network DNS Server on CentOS 7

分类: Linux | 评论

blog comments powered by Disqus