dns基本工作原理 dns: domain name service dns udp/53 tcp/53 udp 用于解析 tcp 用于区域传送

	 	 由域名服务器与域名解析器组成  用于域名和ip的相互转换
	 dns:分布式 倒置的树状结构
	 				最上方为根域 根域服务器世界一共有13台
	 					根域服务器下有多个组织服务器 如      .com .org .edu .net 等 也有如表示国家的域服务器 .cn .us等等 这些域名称为顶级域 或者为 一级域
	 						一级域下又有诸多二级域 
	 							二级域下又可以有诸多三级域 ...
	 dns服务器的类型
			 	1.主dns服务器
			 	2.从dns服务器
			 	3.唯缓存dns服务器
			 	4.转发器

原理:互联网主机通信都是通过ip,域名只不过是提供一个更易记的渠道

	客户端发起dns请求流程:

		client --> /etc/hosts --> local cache --> DNS server(recursive 递归查询) --> dns server local cache --> lterative(迭代查询) -->

	客户端请求域名解析 首先查看/etc/hosts 文件中是否有解析的内容 若无在查询缓存中时否还有上次解析的记录 若无则去查找 指定的dns服务器 (一般来说指定的dns服务器为唯缓存dns服务器)
	指定的dns服务器的缓存中若无相关缓存 则去找其他dns服务器(查找方式为自顶向下) 如 刚开始从根开始查找指定的域名 如查找 www.gaoleng.com
		1. 我们指派的dns服务器 去找根 根会告诉我们指派的dns 他不知道我们所说的域名是哪个ip 但是.com他知道 你应该去找.com查找 并告诉我们 .com的地址
		2. 我们指派的dns服务器又回去 找.com .com说 “我也不知道 你说的域名的 ip地址到底是多少 但是baidu.com应该知道 我跟你说他的ip是多少把 ”
		3. 接着dns服务器又会去找 baidu.com的dns服务器 我们所要查找的域名 确实是在baidu.com域中 baidu.com的dns服务器会说 “你要找的域名 我确实知道他的 ip是..  ” 
		4. 指派的dns服务器 会缓存这一信息 并且 将该域名对应的ip 返回给客户端 客户端 也会缓存这一信息 这样在缓存未到期之前 再次访问www.baidu.com 就不会再去找dns服务器 而是直接在缓存中取得

		客户端 只收取最终结果 其余工作都有指派的dns服务器完成

		递归查询:客户端请求一次 就可以得到最终的结果

				客户端不支持迭代查询 所以依靠唯缓存服务器来帮助查询

		迭代查询:服务器多次发送查找请求 多次返回

dig 命令查看dns搜寻过程

dig  www.yahoo.com +trace

	~]# dig www.yahoo.com +trace

				; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.62.rc1.el6_9.5 <<>> www.yahoo.com +trace
				;; global options: +cmd
				.			5	IN	NS	e.root-servers.net.
				.			5	IN	NS	m.root-servers.net.
				.			5	IN	NS	l.root-servers.net.
				.			5	IN	NS	g.root-servers.net.
				.			5	IN	NS	c.root-servers.net.
				.			5	IN	NS	k.root-servers.net.
				.			5	IN	NS	j.root-servers.net.
				.			5	IN	NS	h.root-servers.net.
				.			5	IN	NS	d.root-servers.net.
				.			5	IN	NS	i.root-servers.net.
				.			5	IN	NS	b.root-servers.net.
				.			5	IN	NS	f.root-servers.net.
				.			5	IN	NS	a.root-servers.net.
				;; Received 494 bytes from 192.168.117.2#53(192.168.117.2) in 228 ms

				com.			172800	IN	NS	e.gtld-servers.net.
				com.			172800	IN	NS	b.gtld-servers.net.
				com.			172800	IN	NS	j.gtld-servers.net.
				com.			172800	IN	NS	m.gtld-servers.net.
				com.			172800	IN	NS	i.gtld-servers.net.
				com.			172800	IN	NS	f.gtld-servers.net.
				com.			172800	IN	NS	a.gtld-servers.net.
				com.			172800	IN	NS	g.gtld-servers.net.
				com.			172800	IN	NS	h.gtld-servers.net.
				com.			172800	IN	NS	l.gtld-servers.net.
				com.			172800	IN	NS	k.gtld-servers.net.
				com.			172800	IN	NS	c.gtld-servers.net.
				com.			172800	IN	NS	d.gtld-servers.net.
				;; Received 507 bytes from 198.41.0.4#53(198.41.0.4) in 481 ms

				yahoo.com.		172800	IN	NS	ns1.yahoo.com.
				yahoo.com.		172800	IN	NS	ns5.yahoo.com.
				yahoo.com.		172800	IN	NS	ns2.yahoo.com.
				yahoo.com.		172800	IN	NS	ns3.yahoo.com.
				yahoo.com.		172800	IN	NS	ns4.yahoo.com.
				;; Received 285 bytes from 192.31.80.30#53(192.31.80.30) in 304 ms

				www.yahoo.com.		1800	IN	CNAME	atsv2-fp.wg1.b.yahoo.com.
				wg1.b.yahoo.com.	172800	IN	NS	yf2.yahoo.com.
				wg1.b.yahoo.com.	172800	IN	NS	yf4.a1.b.yahoo.net.
				wg1.b.yahoo.com.	172800	IN	NS	yf3.a1.b.yahoo.net.
				wg1.b.yahoo.com.	172800	IN	NS	yf1.yahoo.com.
				;; Received 178 bytes from 68.142.255.16#53(68.142.255.16) in 311 ms


dns 解析答案

	1.肯定答案 : 肯定 有的域名解析答案
	2.否定答案 : 请求不存在等原因导致的 无法返回结果  
		
		注意 :(肯定答案和否定答案在dns服务器中都会有缓存 本地没有的答案即为否定答案 这样每次请求不存在的主机就不用让主机所在区域的dns服务器每次都响应 占用资源)

	3.权威答案 :由主机所在dns服务器解析出的直接得到的答案 
	4.非权威答案 : 不是由主机所在dns服务器解析返回的答案 而是从其他dns服务器缓存中获取的答案

区域解析库 资源记录:resource record (RR) 记录类型 SOA NS PTR A AAAA CNAME MX

SOA: 起始授权记录 一个解析库只能有一个 soa记录 并且 soa记录要在第一条
NS:专门表明当前区域的dns服务器
CNAME: 别名记录
MX: 邮件交换器
PTR: 反向解析 IP --> FQDN 
A:FQDN --> IP
AAAA: FQDN -->IPv6

	注意 :1. TTL可以全局继承
		   2. @可用于表示当前区域的名字
		   3. 同一个名字可以通过多个记录 定义不同的值 此时dns服务器会以轮询的方式响应
		   4. 同一个值也可以定义不同的名字 通过不同的名字指向同一个值 仅表示通过不同的名字可以找到一个主机而已		

SOA:
	name :当前区域名称如 gaoleng.com
	value : 多个部分组成
		1.当前区域的dns服务器的FQDN或者当前区域名称 可用@简写
		2.当前管理员的邮箱地址,但地址中不可有@符号 一般用. 号代替 如 admin.gaoleng.com
		3.主服务器协调属性的定义 以及否定答案的TTL
	例:
		daniu.com.      IN      SOA     dns.daniu.com.  root.daniu.com. (2017120902 1H 15M 1W 1D)

NS:
	name : 当前区域名
	value : 当前区域名的 dns服务器名称 如 “ns1.gaoleng.com”

	例如:
		    @	 IN      NS      ns1.gaoleng.com

CNAME :
	name : 别名FQDN
	value : 正式的FQDN

	例如:
		web.gaoleng.com IN CNAME www.gaoleng.com

PTR :
	name:ip 的特定格式 如 1.2.3.4 要写成 4.3.2.1 并且加上后缀.in-addr.arpa.

	例:4.3.2.1 IN PTR ns1.gaoleng.com.

A :
	name: 某主机的FQDN
	value:主机对应的ip
	例如:
		www.gaoleng.com     IN      A       192.168.117.131   ---------------------
							IN 		A 		192.168.117.130	  ---------------------    (注意第三条 轮询 )
		*.gaoleng.com		IN 	 	A 		192.168.117.131	 ----------------------------------------------------(泛域名解析 避免用户写错主机名而给错误答案 )

AAAA : 
	name: 某主机的FQDN
	value:主机对应的ipv6

MX :
	name:当前区域名
	value:当前区域名的服务器(smtp服务器)的主机名
			一个区域内MX记录可有多个,但每个记录前都应该有一个数字(0-99表示其优先级) 数越小表示其优先级越高
	例如:
		    @    	IN      MX 10   mx1.gaoleng.com

bind

主配置文件 /etc/named.conf /etc.named.rfc1912.zones /etc/rndc.key
解析库文件 /var/named/ZONE_NAME.zone


注意 : 
	(1). 一台物理服务器 可以同时给多个区域提供解析
	(2). 必须要有根区域文件
	(3). 应该至少有两个(如果包括ipv6 应该更多) 实现localhost 和本地回环地址 127.0.0.1 的解析库

rndc : 默认与bind 安装在同一主机 只能通过127.0.0.1 连接named进程 监听在 953/tcp端口

主配置文件
	全局配置	option{}
	日志子系统配置	logging{}
	区域定义:本机能为哪些zone进行解析 就要定义哪些zone
		zone "ZONE_NAME.ZONE" IN {}

	注意 : 任何服务程序 想要能过通过网络与其他主机访问 至少要监听在一个能与外部主机通信的ip上 
				option中默认指定的监听地址为回环地址

缓存名称服务器 
		只需要监听在一个外部地址上即可

主dns服务器
	1.定义zone区域
		
		zone"ZONE_NAME.zone"  IN {
				type {master|slave|hind|forword} ;
				file "..." ;
		};

	2.定义解析库
		定义内容 如  $TTL $ORIGIN (可加可不加 用于省略当前区域名字 ) 在SOA中一般不省略当前区域名字 或FQDN 在后面省略时要注意 省略后不可有点
																		如 ns1.gaoleng.com 不可为写 ns1. 应写成 ns1 ;加 oridin时 用法 如 $ORIGIN gaoleng.com 
		资源记录 

	注意 : 定义完之后一般 将写的文件的 权限定为 640 其他人不可读 并且设置 named为文件的属组 因为named程序 是由named用户引导 在读取配置文件 时若为其他人 无法读取文件
			chmod 640 zone_name 											chown :named zone_name

测试命令:
	dig命令
		dig [-t type ] name [@server] [query option]

			指定资源类型  域名  指定临时dns服务器 不加则为/etc/resolv.conf定义的dns 后接可加选项
	查询选项 
		+[no] trace :跟踪解析过程
		+[no] recurse :进行递归解析

	测试反向dns解析
		dig -x ip @server


	模拟区域传送	
			区域传送:
					  1. 全量传送 :	传送整个解析库
					  2. 增量传送 :	传送解析库变化的部分
			dig -t axfr zone_name @server
		如
			dig -t axfr gaoleng.com @192.168.117.129

	host 命令
		
		host [-t type] name server

	nslookup 命令
		nslookup [-option] [name|-] [sercer]
		nslookup 
			>server 指定dns服务器
			>set q=rr_type 设定类型
			>NAME 要查询的域名

检查区域文件和解析库文件格式是否正确

		检查区域
	1. named-checkconf 
		检查解析库文件
	2.named-checkzone "解析库名ZONE_NAME" 解析库文件名
		如 named-checkzone "gaoleng.com" gaoleng.com.zone

	测试时建议将dnssec设置成no 不然对一些测试实施会有影响


反向区域:
	区域名为网络地址的反写 后接.in-addr.arpa.
		192.168.117 ---> 117.168.192.in-addr.arpa.

	1.定义区域
		
		
			zone "ZONE_NAME" IN {	
				type {master|slave|forword};
				file"ip.zone";
			};

		例如

			zone "117.168.192.in-addr.arpa" IN {
			         type master;
			         file "192.168.117.zone";
			 };


	2.区域解析库文件

		注意:反向解析库不需要 MX A AAAA 

		示例
			$TTL 1D
			$ORIGIN 117.168.192.in-addr.arpa.
			@       IN SOA  ns1.gaoleng.com.        root.gaoleng.com ( 2018020501 1D 1H 1W 1D )
			        IN NS   ns1.gaoleng.com.
			        IN NS   ns2.gaoleng.com.
			131     IN PTR ns1.gaoleng.com.
			129     IN PTR ns2.gaoleng.com.
			129     IN PTR mx1.gaoleng.com.
			131     IN PTR www.gaoleng.com.
			        IN PTR gaoleng.com.

主从复制: 1.从服务器应该为一台独立的服务器 2.主服务器的区域解析库必须有一条NS记录是指向从服务器 --- IN ns2.gaoleng.com ns2 IN A 192.168.117.131 3.从服务器只需要定义区域 而无需提供 解析库文件 库文件应该放置于/var/named/slaves目录中 4.主服务器允许进行做区域传送 5.主从服务器 时间应该同步 可通过ntp进行 6.bind 程序的版本应该一致 若不一致 应该主服务器版本低 从服务器版本高

从服务器

只需要 定义区域
		zone "ZONE_NAME" IN {
			type slave;
			masters{master_ip ;};
			file "slaves/ZONE_NAME.ZONE";
		};

rndc:

rndc COMMAND 
	COMMAND:
		reload:重载主配置文件和区域解析库文件
		reload zone:重载区域解析库文件
		status:查看bind状态信息
		retransfer zone:手动启动传送过程,而不管序列号是否增加
		notify zone :重新对区域传送发起通知
		querylog : 开启或关闭查询日志
		trace:传递debug级别
		trace LEVEL :设定debug级别

子域授权

1. 在父区域中定义子区域
	

	shuai.gaoleng.com	IN 		NS 		ns1.shuai.gaoleng.com
						IN 		NS 		ns2.shuai.gaoleng.com
	ns1.shuai.gaoleng.com 	 	IN 		A 		192.168.117.131
	ns2.shuai.gaoleng.com 		IN 		A 		192.168.117.132

2. 在相应主机上定义子区域解析库文件
	
	$TTL 1d
	$ORIGIN shuai.gaoleng.com.

	@	IN	SOA	ns1.shuai.gaoleng.com.	admin.shuai.gaoleng.com. ( 2018020601 1H 5M 1W 1D )
		IN	NS	ns1
		IN	NS	ns2
	ns1	IN	A	192.168.117.131
	ns2	IN	A	192.168.117.132
	www	IN	A	192.168.117.129

定义转发服务器

注意:1.被指定的转发服务器需要为请求做递归,否则转发请求不进行
	  2.forward中 first和only	first 表示若转发的服务器 不允许查询时 那自己还会去做查询操作 only表示 若转发的服务器不允许查询时 那自己也就放弃查询
	  3.在进行子域或转发测试时关闭dnssec 否则有的操作进行不了

1.全局定义 

	options{
		forward first|only;
		forwarders {FORWARD_DNS_IP;};  
	};

2.区域转发

	zone "ZONE_NAME" IN {
			type forward;
			forword first|only;
			forwarders {FORWARD_DNS_IP;}; 
	};

bind 的安全相关配置

acl:将一个或多个地址归并为一个集合;并通过统一的一个名字调用

	acl ACL_NAME {
			ip;
			net/per;
	};

示例: acl slaves{ 192.168.117.129; 192.168.117.131; 127.0.0.1; }; 以后调用salves相当于调用里面的ip

bind的4个内置acl none:没有一个主机 any:任意主机 local:本机 localnet:本机的ip和掩码运算后的网络地址

注意:acl只能先定义后调用 其一般定义在options前面部分

访问控制指令

allow-query{}:允许查询的主机,白名单
allow-transfer{}:允许区域传送的主机
allow-resursion{}:允许递归的主机           如 allow-resursion{ slaves;}; 在zone中不能定义
allow-update:允许更新区域数据库中的内容,关闭才安全

示例 zone "gaoleng.com" IN { type master; file "gaoleng.com"; allow-transfer{slaves;}; allow-update{none;}; };

view视图

	用于将不同地方客户端的请求 解析到其客户端所在区域的服务器上 如 将上海用户访问此域名 将其解析到伤害的服务器上 这样响应的速度快

	一个bind服务器可定义多个view 每个view可以定义多个zone

	每个view用来匹配一组客户端

	多个view内可能需要对同一个区域进行解析,但使用不同的区域解析库文件

	格式:
		view VIEW_NAME {
			match-clients{};
		};

	注意:
			1.一旦启用了view,所有的zone都只能定义在view中
			2.仅有必要在匹配到允许递归请求的客户端所在的view定义根区域
			3.客户端请求到达时,是自上而下检查每个view所服务的客户端列表


	示例:

		view localht{
			match-clients{mynet;};
			
		zone "localhost.localdomain" IN {
			type master;
			file "named.localhost";
			allow-update { none; };
		};

		zone "localhost" IN {
			type master;
			file "named.localhost";
			allow-update { none; };
		};

		zone "1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa" IN {
			type master;
			file "named.loopback";
			allow-update { none; };
		};

		zone "1.0.0.127.in-addr.arpa" IN {
			type master;
			file "named.loopback";
			allow-update { none; };
		};

		zone "0.in-addr.arpa" IN {
			type master;
			file "named.empty";
			allow-update { none; };
		};

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



		zone "." IN {
		        type hint;
		        file "named.ca";
		};

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

		};

		view ext {
			match-clients{any;};
		zone"gaoleng.com" IN 	{
			type master;
			file"gaoleng.com.ex.zone";
		};
		};