BIND软件: BIND软件的主要rpm包: bind:主程序包,包括: DNS服务程序(named) 解析库 检测工具; bind-libs:Bind软件的共享库程序包; bind-utils:通用工具包,包括各种服务测试工具,如:dig, host, nslookup等; bind-chroot:设置伪根,启用监牢模式;bind-9+版本中出现的安全功能实现;

应用层协议是DNS协议;DNS,Domain Name System;
DNS的应用程序实现:BIND;
BIND程序的服务主程序:named;
	53/TCP:完成区域传送;
	53/UDP:完成主机名的解析查询;
	953/TCP:rndc程序的监听端口;

IETF:dnssec标准;dnssec,DNS安全扩展插件;

Bind软件的组成:
	主配置文件:/etc/named.conf
	辅助配置文件:可以在主配置文件中利用include命令包含其他配置文件;
		/etc/named.rfc1912.zones:声明了区域;
	安全认证密钥文件:
		/etc/named.iscdlv.key
		/etc/named.root.key
	主程序:/usr/sbin/named
	远程管理程序:/usr/sbin/rndc
	配置文件检测工具:
		/usr/sbin/named-checkconf
	区域文件检测工具:
		/usr/sbin/named-checkzone
	日志文件:
		/var/log/named.log
	区域文件的存放目录:
		/var/named
	存放辅助区域文件的目录:
		/var/named/slaves

主配置文件:/etc/named.conf
	文件格式:
		格式特点:分段式配置格式;

	1.配置行的注释方式:
		//:单行注释;
		/*...*/:任意内容注释;
		#:单行注释;
	2.主配置文件中的常用配置段:
		1) 访问控制列表配置段:
			acl string { address_match_element; ... };
		2) 全局选项配置段:
			options { statements; ... };
		3) 日志配置段:
			logging { statements; ... };
		4) 区域配置段:
			zone string optional_class { statements; ... };
		5) 视图配置段:
			view string optional_class { statements; ... };
		6) include命令:
			include /PATH/TO/SOME_CONFIG_FILE;

全局配置段:
	options {
		listen-on port 53 { 127.0.0.1; 172.16.72.2; };
			//在启动DNS服务时,named进程所监听的套接字;
		directory   "/var/named";
			//定义解析库(区域数据库文件)的根目录;在主配置文件中添加此配置语句之后,可以在后面定义区域数据库时使用相对路径;
		allow-query     { localhost; };
			//访问控制语句,意思是允许本服务器处理哪些主机发送来的解析查询请求;默认为localhost,即:只允许本机以127.0.0.1发送查询请求;
		recursion yes;
			//允许本服务器为所有查询请求做递归查询;
		allow-recursion { 172.16.72.1/16; };
			访问控制指令,允许为哪些客户端做递归查询;
		pid-file "/run/named/named.pid";
			//定义存放主进程pid文件的路径;
	};

	rndc命令:Remote Name Domain Controller, 远程名称域控制器;
		953/TCP
		常用的子命令:
			status:查看服务器端的允许状态;
			reload:通知服务器重载配置文件和区域文件,无需重新启动服务;
			flush:清空服务器端的DNS缓存;
			stop:较安全的停止DNS服务;

区域配置段:
	zone "FQDN" IN {
		//声明一个区域名称;此名称要是有FQDN表示;如:qhdlink.com
		type master;
			区域的类型:
				master:主区域;
				slave:辅助区域;
				hint:提示区域,仅能在根域上设置;
				forward:转发区域;
		file "named.localhost";
			存放与该域有关的解析信息的数据库文件的路径;如果是相对路径,则相对于主配置文件的全局配置段中的"directory"指令所定义的目录而言;
			注意:文件的所有权和权限设置必须能够让named用户有读取权限;
		allow-update { none; };
			访问控制指令,允许哪些客户端对数据库内容进行动态更新;主要用于DDNS;
		allow-transfer { 172.16.72.1; };
			访问控制指令,允许哪些主机能够从当前服务器进行区域传送;
		allow-query { address_match_element; ... };
			访问控制指令,允许哪些主机进行区域内的解析查询;
		allow-notify { address_match_element; ... };
			访问控制指令,允许哪些主服务器向当前服务器发送区域变更通知;
	};

正向查找区域声明示例:

zone "ytc.com" IN { type master; file "ytc.zone"; allow-update { none; }; allow-transfer { none; }; };

创建数据库文件,修改权限并添加相应资源记录;
	/var/named/ytc.zone

检测区域文件的语法格式:
	named-checkzone FQDN /PATH/TO/ZONE_FILE
例:# named-checkzone ytc.com /var/named/ytc.zone

对主配置文件或区域数据库文件进行修改之后,并不会立即生效;只有在重载配置文件和区域文件之后,配置才生效;重载配置文件的方法:
	1.systemctl reload named.service
	2.rndc reload
	3.systemctl restart named.service(不推荐)
	4.service named reload(CentOS 6-)

注意:对于应用程序服务进程重载配置文件的操作,如果能使用reload,就使用reload,不要轻易执行restart命令;

客户端测试工具:dig, host, nslookup dig命令: dig - DNS lookup utility 格式: dig [@server] [-t type] [-x addr] [queryopt...]

		@server:表示此次查询请求使用指定的DNS服务器,而不使用/etc/resolve.conf文件中定义的nameserver;
		-t RR_type:指定此次查询的资源记录的类型;
		-x addr:进行反向解析查询时,用于指定IP地址;
		queryopt:查询选项:
			+[no]recurse:要求目标服务器必须[不]以递归方式进行查询;
			+[no]trace:[不]跟踪显示整个查询请求的解析过程;

		模拟区域传送:
			dig -t axfr|ixfr DOMAIN_NAME_FQDN

host命令:
	host - DNS lookup utility
	格式:
		host [-t RR_type] {name} [server]
		示例:
			~]# host -t A www.ytc.com 172.16.1.12

nslookup命令:
	交互式命令;
		server IP_ADDR:指定使用哪个DNS服务器进行查询;
		set q=RR_type:指定此次查询的资源记录的类型及相关答案;
		set type=RR_type:功能同set q=RR_type;
		FQDN | IP_ADDR:根据FQDN进行正向查询解析或根据IP_ADDR进行反向查询解析;
	命令行工具;
		nslookup FQDN NS_SRV
		示例:
			~]# nslookup www.ytc.com 172.16.72.2

配置反向解析区域:
	反向域的FQDN:172.16.0.0/16网段的反向域名:
		16.172.in-addrp.arpa.
	反向查找区域示例:

zone "16.172.in-addr.arpa" IN { type master; file "172.16.local"; allow-transfer { none; }; };

正向区域库文件配置示例: $ORIGIN ytc.com. $TTL 86400 @ IN SOA ns1.ytc.com. root.ytc.com. ( 2018041101; 1H; 20M; 2W; 1D); IN NS ns1.ytc.com.
IN MX 10 mail.ytc.com. ns1 IN A 172.16.1.11 mail IN A 172.16.1.11 www IN A 172.16.100.100 www IN A 172.16.100.101 web.ytc.com. IN CNAME www.ytc.com. ftp.ytc.com. IN CNAME web.ytc.com.

反向区域配置示例: $ORIGIN 16.172.in-addr.arpa. $TTL 86400 @ IN SOA ns1.ytc.com. root.ytc.com. ( 2018041102; 2H; 10M; 2W; 5H); IN NS ns1.ytc.com.
11.1 IN PTR ns1.ytc.com. 11.1 IN PTR mail.ytc.com. 50.50 IN PTR www.ytc.com. 51.50 IN PTR www.ytc.com.

主从DNS服务器:(主辅) 注意: 1.主服务器和辅助服务器都是域级别的概念; 2.必须保证主辅服务器之间的网络通信的顺畅以及时间同步; 3.为了确保所有的名称服务器都能被识别和使用,需要在区域数据库中为所有的名称服务器添加NS资源记录; 4.区域数据库中每条NS资源记录都必须有A记录与之对应; 5.从服务器上可以默认将复制而来的数据库文件保存至/var/name/slaves目录中; 6.在主服务器上应该通过访问控制指令允许从服务器进行区域传送;同时从服务器要指定主服务器;

从服务器配置示例: zone "ytc.com" IN { type slave; masters { 172.16.1.12; }; file "slaves/ytc.slave.zone"; allow-transfer { none; }; };

zone "16.172.in-addr.arpa" IN { type slave; masters { 172.16.1.12; }; file "slaves/172.16.slave.local"; allow-transfer { none; }; };

转发器: 全局转发: 对于凡是不能由本服务器管理的域的请求,全部以转发的方式由指定的服务器进行递归查询;

	在bind的主配置文件的全局配置段中定义;

	options {
		forward first;
		forwarders { FORWARD_SERVER_IP_ADDR; };
	};

在A服务器上定义ytc.com域; zone "ytc.com" IN { type master; file "ytc.zone"; allow-transfer { 172.16.1.12; } ; };

配置库文件: $ORIGIN ytc.com. $TTL 86400 @ IN SOA ns1.ytc.com. root.ytc.com.( 2018041111; 1H; 10M; 3D; 4H); IN NS ns1 ns1 IN A 172.16.1.11 www IN A 1.1.1.2

在B服务器上,仅仅在全局配置段添加转发器; zone "ytc.com" IN { type forward; forward only; forwarders { 172.16.1.11; }; };

再用客户端测试: dig @172.16.1.12 -t A www.ytc.com

区域转发:
	专门针对于某个特定的域的请求,如果不能给出权威答案,则转发至指定的服务器进行递归查询;

	在bind的主配置文件的区域配置段中定义;

	区域转发配置示例:

在A服务器上定义ytc.com.cn域; zone "ytc.com.cn" IN { type master; file "ytc.cn.zone"; allow-transfer { none; }; };

还需要定义该域的区域数据库:/var/name/ytc.cn.zone

在B服务器上定义qhdlink.com.cn域的区域转发器: zone "ytc.com.cn" IN { type forward; forward only; forwarders { 172.16.1.11; }; };

forward first|only;
	first:首先转发,当转发器中指定的服务器无响应时,再自行迭代查找;
	only:只使用转发器中指定的服务器进行递归查询,如果无法获得答案,则直接返回否定答案;自身不再迭代查找;

注意:任何形式的请求转发,都必须依靠被指定的服务器允许自身做递归查询;

子域委派授权: 将子域的管理权授权给子域中的名称服务器;父域中不保存任何子域数据库中资源记录;但为了能够成功授权,需要添加一条NS记录,指向子域的名称服务器;

子域委派授权的示例: 在A服务器上维护父域ytc.org域; 在A服务器上的ytc.org域的数据库中添加NS记录,以实现委派授权;

$ORIGIN ytc.org. $TTL 86400 @ IN SOA ns1.ytc.org. root.ytc.org. ( 2018041103; 2H; 5M; 5D; 1D); IN NS ns1.ytc.org. qhd.ytc.org. IN NS ns1.qhd.ytc.org. ns1 IN A 172.16.1.11 ns1.qhd.ytc.org. IN A 172.16.1.12 www IN A 1.2.1.1

在B服务器上维护子域qhd.ytc.org域;
	在B服务器上声明子域并创建数据库文件:

zone "qhd.ytc.org" IN { type master; file "qhd.ytc.org.zone"; allow-transfer { none; }; };

$ORIGIN qhd.ytc.org. $TTL 86400 @ IN SOA ns1.ytc.org. root.qhd.ytc.org. ( 201801104; 2H; 2M; 5D; 10H); IN NS ns1 ns1 IN A 172.16.1.12 www IN A 11.11.22.22

注意:子域的委派授权,实际上是为客户端提供迭代查询机制;

Bind中的基础安全相关的配置: 1.访问控制列表: acl,Access Control List,将一个或多个IP地址,归并为一个集合,随后可以通过实现定义好的名称对集合中的多个IP地址进行统一调用或设置;

	bind内部有四个内置的acl:
		any:包括所有的IP地址,整个IP地址栈中的所有有效IP地址;
		none:不包括任何一个IP地址;
		local:仅包含本地已经配置生效的所有IP地址;
		localnet:包含本机所有已经配置并生效的IP地址所在的网段的IP地址;

	定义acl的语法格式:
		acl acl_name {
			[!] ip_addr;
			[!] network/prefix;
		};

	示例:
		acl myacl {
			172.16.0.0/16;
			! 172.16.100.100;
			172.17.100.101;
		};

	注意:
		1.在调用ACL之前,确保事先已经定义了指定的ACL;
		2.通常在主配置文件/etc/named.conf中定义ACL,建议将自定义的ACL放置在配置文件的最前面,以保证后面的操作可以成功调用到此ACL;

		所有的allow*语句,都是可以调用ACL的,包括:
			allow-update { acl_name; }; 
			allow-transfer { acl_name; };
			allow-recursion { acl_name; };
			allow-query { acl_name; };
			allow-notify { acl_name; };
			...

视图的配置:View; 实现智能DNS解析服务;根据客户端发送的请求报文中的某个封装信息,判断客户端的网络类型和服务类型,从而能够提供最适合此用户使用的解析结果;

定义视图:
	view VIEW_NAME {
		match_clients { acl; };
		zone "DOMAIN1" IN {
			...
		};
		zone "DOMAIN2" IN {
			...
		};
		...
	};

注意:一旦在Bind中启用视图功能,在所有的zone的声明必须都设置在视图中;

配置示例:
	1.给DNS服务器配置两个不同网段的IP地址;
		eno16777736:172.16.72.2/16
		eno16777736:0:100.100.100.1/24

	2.修改主配置文件:
		1) 创建一个intranet的ACL;

acl intranet { 172.16.0.0/16; 192.168.1.0/24; 10.1.1.0/24; }; 2) 定义视图:将所有的zone放置到视图中; view intranet { match-clients { intranet; }; zone "." IN { type hint; file "named.ca"; };

zone "ytc.com" IN { type master; file "ytc.intra.zone"; allow-update { none; }; allow-transfer { 172.16.1.11; }; }; };

view internet { match-clients { any; };

zone "ytc.com" IN { type master; file "ytc.inter.zone"; allow-update { none; }; allow-transfer { 172.16.1.11; }; }; };

/var/named/qhdlink.intra.zone

$ORIGIN ytc.com. $TTL 86400 @ IN SOA ns1.ytc.com. root.ytc.com. ( 2018040701;Serial 1H;Refresh 15M;Retry 1W;Expire 1D);Minimal TTL IN NS ns1.ytc.com. ns1 IN A 172.16.1.12 www IN A 172.16.100.100

/var/named/ytc.inter.zone

$ORIGIN ytc.com. $TTL 86400 @ IN SOA ns1.ytc.com. root.ytc.com. ( 2018040701;Serial 1H;Refresh 15M;Retry 1W;Expire 1D);Minimal TTL IN NS ns1.ytc.com. IN MX 10 mail.ytc.com. ns1 IN A 100.100.100.1 www IN A 61.72.178.82

利用不同的客户端进行测试: client1:172.16.1.11/16 --> www.ytc.com ==> 172.16.100.100 cleint2:100.100.100.100/24 --> www.ytc.com ==> 61.72.178.82

总结:www.ytc.com域名的解析过程: 客户端首选DNS服务器的名称解析过程: 1.客户端请求解析的内容是服务器管理和维护的内容: client --> First DNS --> client 答案:权威答案;

	2.客户端请求解析的内容不是服务器管理和维护的内容:
		1) 如果此服务器能够为客户端实施递归查询:
			client --> First DNS --> NS(.) --> FirstDNS {NS(com)}
								 First DNS --> NS(com) --> FirstDNS {NS(ytc)}
								 First DNS --> NS(ytc) --> Answer(www.ytc.com)
								 First DNS --> client
			迭代查询的过程;

		2) 如果此服务器不能为客户端实施递归查询:
			直接返回否定答案;