学习DNS(一)
DNS(Domain Name System,域名系统)
因特网上作为域名和IP地址相互映射的一个分布式数据库,能够使用户方便的访问互联网,而不用去记住能够被机器读取的IP数串。
通过主机名,最终得到该主机名对应的IP地址的过程叫做域名解析(或主机名解析),DNS协议运行在UDP协议之上,使用端口号53
DNS的分布式数据库是以域名为索引的,每个域名实际上就是一颗很大的逆向数中路径,这棵逆向树成为域名空间(domain name space)
树的最大深度不超过127层,树种每个节点都有一个可以长达63个字符的文本符号。
简单地说就是一个IP地址和域名之间的转换系统,方便用户通过域名访问正确的服务地址,而不用记住不易区分的具体IP。DNS协议运行在UDP协议之上,使用端口53。
DNS的分类
主DNS服务器:就是一台存储着原始资料的DNS服务器
从DNS服务器:使用自动更新方式从主DNS服务器同步数据的DNS服务器,也称辅助DNS服务器
缓存服务器:不负责本地解析,采用递归方式转发客户机查询请求,并返回结果给客户机的DNS服务器,同时缓存查询回来的结果,也叫递归服务器。
转发器:这台DNS发现非本机负责的请求后,不再向根发起请求,而是直接转发给指定的一台或多台服务器,自身并不保存查询结果
10.0.1.161 m01 主DNS(Master DNS)
10.0.1.162 m02 从DNS(Slave DNS)
系统版本号
# cat /etc/redhat-release CentOS release 6.6 (Final) # uname -rm 2.6.32-504.el6.x86_64 x86_64 # cat /etc/hosts 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 10.0.1.161 linux-node1.example.com linux-node1 10.0.1.162 linux-node2.example.com linux-node2
# host baidu.com baidu.com has address 180.149.132.47 baidu.com has address 220.181.57.217 baidu.com has address 111.13.101.208 baidu.com has address 123.125.114.144 baidu.com mail is handled by 20 jpmx.baidu.com. baidu.com mail is handled by 20 mx50.baidu.com. baidu.com mail is handled by 10 mx.n.shifen.com. baidu.com mail is handled by 20 mx1.baidu.com
nslookup显示的更多,会把nameserver也显示出来
# nslookup baidu.com Server: 10.0.2.15 Address: 10.0.2.15#53 Non-authoritative answer: Name: baidu.com Address: 111.13.101.208 Name: baidu.com Address: 123.125.114.144 Name: baidu.com Address: 180.149.132.47 Name: baidu.com Address: 220.181.57.217
dig命令
# dig baidu.com ;; QUESTION SECTION: ;baidu.com. IN A ;; ANSWER SECTION: baidu.com. 59 IN A 123.125.114.144 baidu.com. 59 IN A 180.149.132.47 baidu.com. 59 IN A 220.181.57.217 baidu.com. 59 IN A 111.13.101.208
主dns上安装bind
# yum install -y bind-utils bind bind-devel bind-chroot
# rpm -qa | grep "^bind"
编辑dns主配置文件,清空原先的内容。新的内容写如下
# cat /etc/named.conf options { version "1.1.1"; listen-on port 53 {any;}; directory "/var/named/chroot/etc/"; pid-file "/var/named/chroot/var/run/named/named.pid"; allow-query { any; }; Dump-file "/var/named/chroot/var/log/binddump.db"; Statistics-file "/var/named/chroot/var/log/named_stats"; zone-statistics yes; memstatistics-file "log/mem_stats"; empty-zones-enable no; forwarders {202.106.196.115;8.8.8.8; }; }; key "rndc-key" { algorithm hmac-md5; secret "Eqw4hClGExUWeDkKBX/pBg=="; }; controls { inet 127.0.0.1 port 953 allow { 127.0.0.1; } keys { "rndc-key"; }; }; logging { channel warning { file "/var/named/chroot/var/log/dns_warning" versions 10 size 10m; severity warning; print-category yes; print-severity yes; print-time yes; }; channel general_dns { file "/var/named/chroot/var/log/dns_log" versions 10 size 100m; severity info; print-category yes; print-severity yes; print-time yes; }; category default { warning; }; category queries { general_dns; }; }; include "/var/named/chroot/etc/view.conf";
上面主配置文件详解
options { version "1.1.1"; listen-on port 53 {any;}; directory "/var/named/chroot/etc/"; #A记录配置文件的目录 pid-file "/var/named/chroot/var/run/named/named.pid"; allow-query { any; }; #允许谁访问{}可以写IP Dump-file "/var/named/chroot/var/log/binddump.db"; Statistics-file "/var/named/chroot/var/log/named_stats"; #可以看到DNS解析记录的数量,成功率有多少,DNS状态(可做监控) zone-statistics yes; #配成yes之后上面才会写入 memstatistics-file "log/mem_stats"; #内存状态 empty-zones-enable no; forwarders {202.106.196.115;8.8.8.8; }; #转发(如果我这没有域名就转发) }; key "rndc-key" { #认证的密钥 algorithm hmac-md5; secret "Eqw4hClGExUWeDkKBX/pBg=="; }; controls { inet 127.0.0.1 port 953 allow { 127.0.0.1; } keys { "rndc-key"; }; }; logging { channel warning { #日志的相关信息 file "/var/named/chroot/var/log/dns_warning" versions 10 size 10m; severity warning; print-category yes; print-severity yes; print-time yes; }; channel general_dns { #访问日志相关信息 file "/var/named/chroot/var/log/dns_log" versions 10 size 100m; severity info; print-category yes; print-severity yes; print-time yes; }; category default { #默认日志警告级别 warning; }; category queries { #访问日志级别 general_dns; }; }; include "/var/named/chroot/etc/view.conf"; #其他域的配置文件(实现简单的智能DNS的功能)
除了这个文件的配置,dns的一些其他的配置,比如zone的配置。你可以使用rndc reload生效,这个就是rndc的作用
logging是关于日志设置项
versions 10 size 10m 表示一共保存10个日志,每个日志10MB
file "/var/named/chroot/var/log/dns_log" versions 10 size 10m;
下面default记录在warning上面
queries保存在了general上面
下面2个category调用了上面2个channel,类似于函数的作用
channel warning { file "/var/named/chroot/var/log/dns_warning" versions 10 size 10m; severity warning; print-category yes; print-severity yes; print-time yes; }; channel general_dns { file "/var/named/chroot/var/log/dns_log" versions 10 size 10m; severity info; print-category yes; print-severity yes; print-time yes; }; category default { warning; }; category queries { general_dns; };
Statistics-file "/var/named/chroot/var/log/named_stats";
创建rndc.key和rndc.conf文件
# cat /etc/rndc.key key "rndc-key" { algorithm hmac-md5; secret "Eqw4hClGExUWeDkKBX/pBg=="; }; # cat /etc/rndc.conf key "rndc-key" { algorithm hmac-md5; secret "Eqw4hClGExUWeDkKBX/pBg=="; }; options { default-key "rndc-key"; default-server 127.0.0.1; default-port 953; };
编辑view.conf文件
下面的allow-transfer表示允许下面主机来取数据,注意不是请求dns解析,而是用于从dns请求配置文件里的数据
also-notify表示文件更新时,执行rndc reload时通知哪个从dns来取数据。这样就达到了主从同步的效果
# cat /var/named/chroot/etc/view.conf view "View" { zone "lnh.com" { type master; file "lnh.com.zone"; allow-transfer { 10.0.1.162; }; notify yes; also-notify { 10.0.1.162; }; }; };
# cat /var/named/chroot/etc/lnh.com.zone $ORIGIN . $TTL 3600 ; 1 hour lnh.com IN SOA op.lnh.com. dns.lnh.com. ( 2003 ; serial 900 ; refresh (15 minutes) 600 ; retry (10 minutes) 86400 ; expire (1 day) 3600 ; minimum (1 hour) ) NS op.lnh.com. $ORIGIN lnh.com. shanks A 1.2.3.4 op A 1.2.3.4 a A 1.2.3.4 a A 192.168.122.101
上面关于zone文件解释说明
1、Serial:只是一个序号,但这个序号可被用来作为slave与master更新的依据。举例来说。
master序号100 但salve序号为90时,那么这个zonefile的资料就会被传送到slave来更新了
由于序号代表新旧资料,通常我们建议可以利用日期来设定!举例来说,在2006/10/20
所更新文件,可以用2006102001作为序号代表!(yyyymmddnn,nn代表这一天第几次修改)
2、Refresh:除了根据Serial来判断新旧之外,我们可以利用这个refresh(更新)命令,slave多久进行一次主动更新。
3、Retry:如果到了Refresh的时间,但是slave却无法连接到master时,那么在多久之后,slave会再次的主动尝试与主机连线
4、Expire:如果slave一直无法与master连接上,那么经过多久的时间之后,则命令slave不要再连接master了!也就是说,此时我们假设master DNS
可能遇到重大问题而无法上线,则等待系统管理员处理完毕后,再重新来到slave DNS重新启动bind吧
5、Minimun:这个就有点像是TTL!
区域解析库文件的简要说明: 常见的正解文件 RR 相关信息 [domain] IN [[RR type] [RR data]] 主机名. IN A IPv4 的 IP 地址 主机名. IN AAAA IPv6 的 IP 地址 区域名. IN NS 管理这个领域名的服务器主机名字. 区域名. IN SOA 管理这个领域名的七个重要参数(如上说明) 区域名. IN MX 顺序数字 接收邮件的服务器主机名字 主机别名. IN CNAME 实际代表这个主机别名的主机名字. 单位:W=周、D=日、H=小时、M=分钟。 $TTL 86400 宏定义全局TTL时间 @ IN SOA ns.chinasoft.com. root ( # ns.chinasoft.com. 是DNS服务器的名称 0 ; serial (d. adams) 仅作为序列号而已 1D ;refresh 服务器的更新时间 15M ; retry 重新更新时间间隔 1W ; expiry 多久之后宣布失败 1H ) ;minimum 相当于缓存记忆时间 @ IN NS ns.chinasoft.com. @ IN MX 5 mail.chinasoft.com.(5为优先级别) ns IN A 1.2.3.4 www IN A 1.2.3.4 www IN A 1.2.3.4 mail IN A 1.2.3.4
# cd /var && chown -R named.named named/# /etc/init.d/named start # chkconfig named on
检查端口
# netstat -lntup | grep 53
如果对zone文件更改,可以使用rndc reload让其生效
# rndc reload
使用dig命令测试
# dig @127.0.0.1 a.lnh.com ;; QUESTION SECTION: ;a.lnh.com. IN A ;; ANSWER SECTION: a.lnh.com. 3600 IN A 192.168.122.101 a.lnh.com. 3600 IN A 1.2.3.4 ;; AUTHORITY SECTION: lnh.com. 3600 IN NS op.lnh.com. ;; ADDITIONAL SECTION: op.lnh.com. 3600 IN A 1.2.3.4 ;; Query time: 1 msec ;; SERVER: 127.0.0.1#53(127.0.0.1) ;; WHEN: Mon May 15 22:20:39 2017 ;; MSG SIZE rcvd: 92
# yum install bind-utils bind bind-devel bind-chroot -y
# scp /etc/named.conf 10.0.1.162:/etc/# scp /etc/rndc.key 10.0.1.162:/etc/# scp /etc/rndc.conf 10.0.1.162:/etc/
# cat /var/named/chroot/etc/view.conf view "SlaveView" { zone "lnh.com" { type slave; masters {10.0.1.161;}; file "slave.lnh.com.zone"; }; };
# cd /var && chown -R named.named named/
# /etc/init.d/named start
# chkconfig named on
它自动生成从的zone文件
# ll /var/named/chroot/etc/ -rw-r--r-- 1 root root 388 Sep 17 2014 localtime drwxr-x--- 2 root named 4096 May 9 21:43 named -rw-r----- 1 root named 1891 May 14 19:05 named.conf -rw-r--r-- 1 root named 2389 May 9 21:43 named.iscdlv.key -rw-r----- 1 root named 931 Jun 21 2007 named.rfc1912.zones -rw-r--r-- 1 root named 487 Jul 19 2010 named.root.key drwxr-x--- 3 named named 4096 May 14 19:03 pki -rw-r--r--. 1 root root 6455 Jan 12 2010 protocols -rw-r--r-- 1 root root 90 May 14 19:06 rndc.conf -rw-r--r--. 1 root root 641020 Oct 2 2013 services -rw-r--r-- 1 named named 326 May 14 20:00 slave.lnh.com.zone -rw-r--r-- 1 named named 129 May 14 20:00 view.conf
# cat /var/named/chroot/etc/slave.lnh.com.zone $ORIGIN . $TTL 3600 ; 1 hour lnh.com IN SOA op.lnh.com. dns.lnh.com. ( 2000 ; serial 900 ; refresh (15 minutes) 600 ; retry (10 minutes) 86400 ; expire (1 day) 3600 ; minimum (1 hour) ) NS op.lnh.com. $ORIGIN lnh.com. a A 1.2.3.4 op A 1.2.3.4 shanks A 1.2.3.4
测试主从
主dns服务器把zone文件序号改成2004
# cd /var/named/chroot/etc/# cat lnh.com.zone $ORIGIN . $TTL 3600 ; 1 hour lnh.com IN SOA op.lnh.com. dns.lnh.com. ( 2004 ; serial 900 ; refresh (15 minutes) 600 ; retry (10 minutes) 86400 ; expire (1 day) 3600 ; minimum (1 hour) ) NS op.lnh.com. $ORIGIN lnh.com. shanks A 1.2.3.4 op A 1.2.3.4 a A 1.2.3.4 a A 192.168.122.101
# rndc reload
# cat slave.lnh.com.zone $ORIGIN . $TTL 3600 ; 1 hour lnh.com IN SOA op.lnh.com. dns.lnh.com. ( 2004 ; serial 900 ; refresh (15 minutes) 600 ; retry (10 minutes) 86400 ; expire (1 day) 3600 ; minimum (1 hour) ) NS op.lnh.com. $ORIGIN lnh.com. a A 1.2.3.4 A 192.168.122.101 op A 1.2.3.4 shanks A 1.2.3.4
# cat lnh.com.zone $ORIGIN . $TTL 3600 ; 1 hour lnh.com IN SOA op.lnh.com. dns.lnh.com. ( 2004 ; serial 900 ; refresh (15 minutes) 600 ; retry (10 minutes) 86400 ; expire (1 day) 3600 ; minimum (1 hour) ) NS op.lnh.com. $ORIGIN lnh.com. shanks A 1.2.3.4 op A 1.2.3.4 a A 1.2.3.4 a A 192.168.122.101
# rndc reload
# cat slave.lnh.com.zone $ORIGIN . $TTL 3600 ; 1 hour lnh.com IN SOA op.lnh.com. dns.lnh.com. ( 2004 ; serial 900 ; refresh (15 minutes) 600 ; retry (10 minutes) 86400 ; expire (1 day) 3600 ; minimum (1 hour) ) NS op.lnh.com. $ORIGIN lnh.com. a A 1.2.3.4 A 192.168.122.101 op A 1.2.3.4 shanks A 1.2.3.4
# cat lnh.com.zone $ORIGIN . $TTL 3600 ; 1 hour lnh.com IN SOA op.lnh.com. dns.lnh.com. ( 2005 ; serial 900 ; refresh (15 minutes) 600 ; retry (10 minutes) 86400 ; expire (1 day) 3600 ; minimum (1 hour) ) NS op.lnh.com. $ORIGIN lnh.com. shanks A 1.2.3.4 op A 1.2.3.4 a A 1.2.3.4 a A 192.168.122.101 cname CNAME a.lnh.com.
# rndc reload
# cat slave.lnh.com.zone $ORIGIN . $TTL 3600 ; 1 hour lnh.com IN SOA op.lnh.com. dns.lnh.com. ( 2005 ; serial 900 ; refresh (15 minutes) 600 ; retry (10 minutes) 86400 ; expire (1 day) 3600 ; minimum (1 hour) ) NS op.lnh.com. $ORIGIN lnh.com. a A 1.2.3.4 A 192.168.122.101 cname CNAME a op A 1.2.3.4 shanks A 1.2.3.4
# dig @10.0.1.161 cname.lnh.com ;; QUESTION SECTION: ;cname.lnh.com. IN A ;; ANSWER SECTION: cname.lnh.com. 3600 IN CNAME a.lnh.com. a.lnh.com. 3600 IN A 192.168.122.101 a.lnh.com. 3600 IN A 1.2.3.4 ;; AUTHORITY SECTION: lnh.com. 3600 IN NS op.lnh.com. ;; ADDITIONAL SECTION: op.lnh.com. 3600 IN A 1.2.3.4 ;; Query time: 1 msec ;; SERVER: 10.0.1.161#53(10.0.1.161) ;; WHEN: Mon May 15 23:09:22 2017 ;; MSG SIZE rcvd: 112
# dig @10.0.1.162 cname.lnh.com ;; QUESTION SECTION: ;cname.lnh.com. IN A ;; ANSWER SECTION: cname.lnh.com. 3600 IN CNAME a.lnh.com. a.lnh.com. 3600 IN A 192.168.122.101 a.lnh.com. 3600 IN A 1.2.3.4 ;; AUTHORITY SECTION: lnh.com. 3600 IN NS op.lnh.com. ;; ADDITIONAL SECTION: op.lnh.com. 3600 IN A 1.2.3.4 ;; Query time: 2 msec ;; SERVER: 10.0.1.162#53(10.0.1.162) ;; WHEN: Mon May 15 23:10:43 2017 ;; MSG SIZE rcvd: 112
MX记录学习
MX记录和A记录差不多,MX是关于邮件服务的解析的
# cat lnh.com.zone $ORIGIN . $TTL 3600 ; 1 hour lnh.com IN SOA op.lnh.com. dns.lnh.com. ( 2006 ; serial 900 ; refresh (15 minutes) 600 ; retry (10 minutes) 86400 ; expire (1 day) 3600 ; minimum (1 hour) ) NS op.lnh.com. $ORIGIN lnh.com. shanks A 1.2.3.4 op A 1.2.3.4 a A 1.2.3.4 a A 192.168.122.101 cname CNAME a.lnh.com. mx MX 5 192.168.122.101
记得序列号更新下,可以+1
# rndc reload
# cat slave.lnh.com.zone $ORIGIN . $TTL 3600 ; 1 hour lnh.com IN SOA op.lnh.com. dns.lnh.com. ( 2006 ; serial 900 ; refresh (15 minutes) 600 ; retry (10 minutes) 86400 ; expire (1 day) 3600 ; minimum (1 hour) ) NS op.lnh.com. $ORIGIN lnh.com. a A 1.2.3.4 A 192.168.122.101 cname CNAME a mx MX 5 192.168.122.101 op A 1.2.3.4 shanks A 1.2.3.4
# dig @10.0.1.162 mx.lnh.com ;; QUESTION SECTION: ;mx.lnh.com. IN A ;; AUTHORITY SECTION: lnh.com. 3600 IN SOA op.lnh.com. dns.lnh.com. 2006 900 600 86400 3600 ;; Query time: 1 msec ;; SERVER: 10.0.1.162#53(10.0.1.162) ;; WHEN: Mon May 15 23:17:57 2017 ;; MSG SIZE rcvd: 71
# host mx.lnh.com 127.0.0.1 Using domain server: Name: 127.0.0.1 Address: 127.0.0.1#53 Aliases: mx.lnh.com mail is handled by 5 192.168.122.101.lnh.com. # host mx.lnh.com 10.0.1.162 Using domain server: Name: 10.0.1.162 Address: 10.0.1.162#53 Aliases: mx.lnh.com mail is handled by 5 192.168.122.101.lnh.com.
添加RTP记录(反向解析)
作用:可以让人根据IP获取到主机名,从而判断主机用途
编辑maste节点/var/named/chroot/etc/view.conf,加入ptr的zone配置
in-addr.arpa已经成为业界共识了,作为ptr用的
168.192是IP地址反过来
主dns服务器上如下编辑view文件,添加新的zone
# cat /var/named/chroot/etc/view.conf view "View" { zone "lnh.com" { type master; file "lnh.com.zone"; allow-transfer { 10.0.1.162; }; notify yes; also-notify { 10.0.1.162; }; }; zone "168.192.in-addr.arpa" { type master; file "168.192.zone"; allow-transfer { 10.0.1.162; }; notify yes; also-notify { 10.0.1.162; }; }; };
# cat /var/named/chroot/etc/168.192.zone $TTL 3600 ; 1 hour @ IN SOA op.lnh.com. dns.lnh.com. ( 2004 ; serial 900 ; refresh (15 minutes) 600 ; retry (10 minutes) 86400 ; expire (1 day) 3600 ; minimum (1 hour) ) NS op.lnh.com. 102.122 IN PTR a.lnh.com.
@ 表示继承 zone "168.192.in-addr.arpa"
没有@的话,前面就得用
$ORIGIN .
了
文件授权,并重新加载
# ll /var/named/chroot/etc/ -rw-r--r-- 1 root root 503 May 15 23:43 168.192.zone -rw-r--r-- 1 named named 536 May 15 23:14 lnh.com.zone -rw-r--r-- 1 root root 388 Sep 17 2014 localtime drwxr-x--- 2 named named 4096 May 9 21:43 named -rw-r--r-- 1 named named 1121 May 14 21:16 named.conf -rw-r--r-- 1 named named 2389 May 9 21:43 named.iscdlv.key -rw-r----- 1 named named 931 Jun 21 2007 named.rfc1912.zones -rw-r--r-- 1 named named 487 Jul 19 2010 named.root.key drwxr-x--- 3 named named 4096 May 13 21:53 pki -rw-r--r--. 1 named named 6455 Jan 12 2010 protocols -rw-r--r-- 1 named named 181 May 14 20:45 rndc.conf -rw-r--r-- 1 named named 91 May 14 20:53 rndc.key -rw-r--r--. 1 named named 641020 Oct 2 2013 services -rw-r--r-- 1 named named 434 May 15 23:39 view.conf # chown named:named 168.192.zone # rndc reload
# cat /var/named/chroot/etc/view.conf view "SlaveView" { zone "lnh.com" { type slave; masters {10.0.1.161;}; file "slave.lnh.com.zone"; }; zone "168.192.in-addr.arpa" { type slave; masters {10.0.1.161; }; file "slave.168.192.zone"; }; };
从上更改权限并重新加载配置
# rndc reload # ll /var/named/chroot/etc/ -rw-r--r-- 1 root root 388 Sep 17 2014 localtime drwxr-x--- 2 root named 4096 May 9 21:43 named -rw-r----- 1 root named 1121 May 15 22:36 named.conf -rw-r--r-- 1 root named 2389 May 9 21:43 named.iscdlv.key -rw-r----- 1 root named 931 Jun 21 2007 named.rfc1912.zones -rw-r--r-- 1 root named 487 Jul 19 2010 named.root.key drwxr-x--- 3 named named 4096 May 14 19:03 pki -rw-r--r--. 1 root root 6455 Jan 12 2010 protocols -rw-r--r-- 1 root root 181 May 15 22:37 rndc.conf -rw-r--r-- 1 root root 91 May 15 22:37 rndc.key -rw-r--r--. 1 root root 641020 Oct 2 2013 services -rw-r--r-- 1 named named 327 May 15 23:58 slave.168.192.zone -rw-r--r-- 1 named named 389 May 15 23:54 slave.lnh.com.zone -rw-r--r-- 1 named named 251 May 15 23:50 view.conf
# cat slave.168.192.zone $ORIGIN . $TTL 3600 ; 1 hour 168.192.in-addr.arpa IN SOA op.lnh.com. dns.lnh.com. ( 2004 ; serial 900 ; refresh (15 minutes) 600 ; retry (10 minutes) 86400 ; expire (1 day) 3600 ; minimum (1 hour) ) NS op.lnh.com. $ORIGIN 168.192.in-addr.arpa. 102.122 PTR a.lnh.com.
# host 192.168.122.102 127.0.0.1 Using domain server: Name: 127.0.0.1 Address: 127.0.0.1#53 Aliases: 102.122.168.192.in-addr.arpa domain name pointer a.lnh.com.
# host 192.168.122.102 10.0.1.162 Using domain server: Name: 10.0.1.162 Address: 10.0.1.162#53 Aliases: 102.122.168.192.in-addr.arpa domain name pointer a.lnh.com.
测试dns解析的轮询功能
重新加载服务
# rndc reload
# nslookup a.lnh.com 127.0.0.1 Server: 127.0.0.1 Address: 127.0.0.1#53 Name: a.lnh.com Address: 192.168.122.101 Name: a.lnh.com Address: 192.168.122.102 Name: a.lnh.com Address: 1.2.3.4# nslookup a.lnh.com 127.0.0.1 Server: 127.0.0.1 Address: 127.0.0.1#53 Name: a.lnh.com Address: 192.168.122.102 Name: a.lnh.com Address: 1.2.3.4 Name: a.lnh.com Address: 192.168.122.101# nslookup a.lnh.com 127.0.0.1 Server: 127.0.0.1 Address: 127.0.0.1#53 Name: a.lnh.com Address: 1.2.3.4 Name: a.lnh.com Address: 192.168.122.101 Name: a.lnh.com Address: 192.168.122.102
测试智能dns,根据源IP不同解析到对应的IP
# cat /var/named/chroot/etc/view.conf view "GROUP1" { match-clients { group1; }; zone "viewlnh.com" { type master; file "group1.viewlnh.com.zone"; }; }; view "GROUP2" { match-clients { group2; }; zone "viewlnh.com" { type master; file "group2.viewlnh.com.zone"; }; };
# cat /var/named/chroot/etc/group1.viewlnh.com.zone $ORIGIN . $TTL 3600 ; 1 hour viewlnh.com IN SOA op.viewlnh.com. dns.viewlnh.com. ( 2009 ; serial 900 ; refresh (15 minutes) 600 ; retry (10 minutes) 86400 ; expire (1 day) 3600 ; minimum (1 hour) ) NS op.viewlnh.com. $ORIGIN viewlnh.com. op A 192.168.122.1 view A 192.168.122.1
# cat /var/named/chroot/etc/group2.viewlnh.com.zone $ORIGIN . $TTL 3600 ; 1 hour viewlnh.com IN SOA op.viewlnh.com. dns.viewlnh.com. ( 2009 ; serial 900 ; refresh (15 minutes) 600 ; retry (10 minutes) 86400 ; expire (1 day) 3600 ; minimum (1 hour) ) NS op.viewlnh.com. $ORIGIN viewlnh.com. op A 192.168.122.2 view A 192.168.122.2# chown named.named group*# rndc reload
# host view.viewlnh.com 10.0.1.161 Using domain server: Name: 10.0.1.161 Address: 10.0.1.161#53 Aliases: view.viewlnh.com has address 192.168.122.1
# host view.viewlnh.com 10.0.1.161 Using domain server: Name: 10.0.1.161 Address: 10.0.1.161#53 Aliases: view.viewlnh.com has address 192.168.122.2
# cat /etc/named.conf options { version "1.1.1"; listen-on port 53 {any;}; directory "/var/named/chroot/etc/"; pid-file "/var/named/chroot/var/run/named/named.pid"; allow-query { any; }; Dump-file "/var/named/chroot/var/log/binddump.db"; Statistics-file "/var/named/chroot/var/log/named_stats"; zone-statistics yes; memstatistics-file "log/mem_stats"; empty-zones-enable no; forwarders {202.106.196.115;8.8.8.8; }; }; key "rndc-key" { algorithm hmac-md5; secret "Eqw4hClGExUWeDkKBX/pBg=="; }; controls { inet 127.0.0.1 port 953 allow { 127.0.0.1; } keys { "rndc-key"; }; }; logging { channel warning { file "/var/named/chroot/var/log/dns_warning" versions 10 size 10m; severity warning; print-category yes; print-severity yes; print-time yes; }; channel general_dns { file "/var/named/chroot/var/log/dns_log" versions 10 size 100m; severity info; print-category yes; print-severity yes; print-time yes; }; category default { warning; }; category queries { general_dns; }; }; acl group1 { 10.0.1.161; }; acl group2 { 10.0.1.162; }; acl groupall { *; }; include "/var/named/chroot/etc/view.conf";
构建企业级DNS
服务压测,服务的功能测试,这些在生产中都要考虑到
1、硬件选型
dns对网卡和cpu消耗大
下面配置可以达到单台服务器每秒3万请求,0延时
CPU:12c以上配置
内存:16GB
网络:千兆
2、初始化系统
关闭selinux,iptables,调整ulimit限制
3、构建高性能,高可用dns
采用lvs-dr模式负载均衡,多idc,多套dns集群,通过master-slave技术保证dns配置的一致性
(1)、高可用
物理层:
首先确保两台lvs不在统一机柜、同一物理交换机接入;
其次确保将所有dns服务器也做到不在同一机柜、同一物理交换机接入。
同时,在不同的idc构建多套dns集群,为客户端提供可切换的配置。
服务层:
坚决摒弃lvs上端口检测这种方式,采用自定义脚本检测,为dns的健康检测单独设置一个域名,就为了lvs检测dns是否存活而设计。
脚本示例,这个脚本是部署在lvs上,做健康检测的
#!/bin/sh timeout=5 Q="baidu.com" host="/usr/bin/host" if test -z "$1" ;then echo "You need to supply a DNS Server to check. Quitting" exit; fi SERVER=$1 ERC=`$host -s -w $timeout $Q $SERVER > /dev/null 2>&1;echo $?` if [ $ERC -eq 0 ];then exit 0 else exit 1 fi
客户端层:
多idc之间的流量切换是通过客户端的健康检测cron实现的,脚本每分钟运行一次,分别检测每个dns集群虚地址的可用性。
(2)、高性能
通过lvs可以对每个集群做横向扩容,是否需要扩容的一句是对现有系统的压测结果,以及实时的监控数据。
亦或者可以在靠近应用层处,加上一层cache-only集群,但前提是你的线上环境中,没人任何系统依赖于dns负载均衡
4、压测
# wget http://ftp.isc.org/isc/bind9/9.7.3/bind-9.7.3.tar.gz # tar xfz bind-9.7.3.tar.gz # cd bind-9.7.3/contrib/queryperf/
配置和编译
# ./configure # make
# ls config.h config.log configure input Makefile.in queryperf queryperf.o utils config.h.in config.status configure.in Makefile missing queryperf.c README # cp queryperf /usr/bin/
# cat test.txt www.baidu.com A www.qq.com A www.sina.com A www.dangdang.com A
# queryperf -d test.txt -s 10.0.1.161Statistics: Parse input file: once Ended due to: reaching end of file Queries sent: 4 queries Queries completed: 4 queries Queries lost: 0 queries Queries delayed(?): 0 queries RTT max: 0.172311 sec RTT min: 0.000703 sec RTT average: 0.075561 sec RTT std deviation: 0.063613 sec RTT out of range: 0 queries Percentage completed: 100.00% Percentage lost: 0.00% Started at: Fri May 19 15:43:39 2017 Finished at: Fri May 19 15:43:39 2017 Ran for: 0.172392 seconds Queries per second: 23.202933 qps
监控结合zabbix实现
系统基础性能:
使用zabbix自带模板即可。cpu、内存、主机存活、磁盘空间、主机运行时间、系统load
LOOPBACK地址绑定状态监控:
该架构中,dnsserver在集群中充当realserver的角色,在dr中,需要绑定loopback的地址方能通信,因此当loopback地址没有绑定上时,lvs健康检测通过,但是当请求到达dnsserver时,请求被拒绝,dns集群会出现异常。
DNS数据与MASTER一致性监控:
一是通过写zabbix自定义discovery,扫出dns配置中所有zone,然后分别对比slave和master每个zone的serial值,当slave与master的值持续5分钟不一致时报警
二是写脚本,每15分钟扫一遍master上所有域名解析结果,与每个slave的结果做对比,当出现结果不一致时,报警
DNS响应时间监控:
远端一组主机跑在fullnat下(提供高可用),通过dig命令监测dnsserver的响应时间。
其中Query time就是查询的时间
# dig @127.0.0.1 www.baidu.com ;; QUESTION SECTION: ;www.baidu.com. IN A ;; Query time: 2 msec ;; SERVER: 127.0.0.1#53(127.0.0.1) ;; WHEN: Fri May 19 17:10:27 2017 ;; MSG SIZE rcvd: 31
DNS每秒请求数监控:
# grep stats /etc/named.conf Statistics-file "/var/named/chroot/var/log/named_stats"; memstatistics-file "log/mem_stats";
# rndc stats
# cat /var/named/chroot/var/log/named_stats +++ Statistics Dump +++ (1495185099) ++ Incoming Requests ++ 393 QUERY ++ Incoming Queries ++ 23 A 362 SOA 3 MX 3 AAAA ++ Outgoing Queries ++ [View: GROUP1] 11 A 3 NS 1 MX 1 AAAA [View: GROUP2] [View: _bind] ++ Name Server Statistics ++ 393 IPv4 requests received 362 requests with EDNS(0) received 393 responses sent 362 responses with EDNS(0) sent 24 queries resulted in successful answer 6 queries resulted in authoritative answer 385 queries resulted in non authoritative answer 362 queries resulted in referral answer 5 queries resulted in nxrrset 14 queries caused recursion ++ Zone Maintenance Statistics ++ ++ Resolver Statistics ++ [Common] [View: GROUP1] 16 IPv4 queries sent 16 IPv4 responses received 14 queries with RTT 10-100ms 2 queries with RTT 100-500ms [View: GROUP2] [View: _bind] ++ Cache DB RRsets ++ [View: GROUP1 (Cache: GROUP1)] 4 A 1 NS 6 CNAME 1 MX 1 RRSIG [View: GROUP2 (Cache: GROUP2)] [View: _bind (Cache: _bind)] ++ Socket I/O Statistics ++ 18 UDP/IPv4 sockets opened 3 TCP/IPv4 sockets opened 16 UDP/IPv4 sockets closed 2 TCP/IPv4 sockets closed 16 UDP/IPv4 connections established 3 TCP/IPv4 connections accepted ++ Per Zone Query Statistics ++ [viewlnh.com (view: GROUP1)] 1 queries resulted in successful answer 3 queries resulted in authoritative answer 2 queries resulted in nxrrset [viewlnh.com (view: GROUP2)] 1 queries resulted in successful answer 3 queries resulted in authoritative answer 2 queries resulted in nxrrset [version.bind (view: _bind)] [hostname.bind (view: _bind)] [authors.bind (view: _bind)] [id.server (view: _bind)] --- Statistics Dump --- (1495185099)
#!/bin/bash #rndc stats STATS='/var/named/chroot/var/log/named_stats' if [ $# -ne 1 ];then echo "$0 [querys]" exit 2 else which=$1 fi if [ -f "${STATS}" ];then echo > ${STATS} rndc stats >dev/null 2>&1 else echo "${STATS} not found " exit 2 fi case ${which} in querys) RESULT=` awk '{if ($2=="QUERY") {print $1}}' ${STATS}` ;; *) echo "$0 [querys]" exit 2 ;; esac echo ${RESULT}
DNS可用性监控:
远端一组主机跑在fullnat下(提供高可用),通过host命令监测dnsserver的可用性,脚本与lvs健康检测脚本类似
6、自动化
saltstack安装、部署
通过定制saltstack配置,实现自动、批量安装、部署dns
配置管理自动化
业界最多的是bind-dlz,dlz是指将所有的配置都存在mysql表中,对bind做特殊配置,使得每次bind
接受的请求都去mysql中查询数据之后返回给用户
bind-dlz的优缺点
优势:将数据全部存在数据库,符合运维开发的理念。
劣势:每次解析都要select数据库,性能低下;增加了系统的耦合性,还需要保证mysql的高可用
为什么要做成页面可以管理的呢
7、安全
时刻关注dns相关的抖动、补丁;
选用稍大些的厂商作为域名服务商,我们是万网;
对服务器的登录日志做监控分析;
8、日常运维规范
dns作为基础服务,在做好高可用,高性能,好扩容的基础上,任何时刻都不能掉以轻心
确保所有监控均处于生效状态;
所有新机器,均在saltstack上完成初始化和安装、部署操作,不能单独操作;
所有针对dns架构调整的操作,均需在流量低谷时操作;
对集群扩容操作时,务必对新加入节点做压测,同时重启服务器并检测重启后各项指标是否正常;
关注dns相关新闻,时刻根据
9、DNS发展趋势
(1)DNSMASQ
DNSmasq是一个小巧且方便地用于配置DNS和DHCP的工具,适用于小型网络,它提供了DNS功能和可选择的DHCP功能。
它服务那先只在本地使用的域名,这些域名是不会在全球的DNS服务器中出现的。
DHCP服务器和DNS服务器结合,并且允许DHCP分配的地址能在DNS中正常解析,而这些DHCP分配的地址和相关命令可以配置到每台主机中,
也可以配置到一台核心设备中(比如路由器),DNSmasq支持静态和动态两种DHCP配置方式。
有一些公司在每台服务器上都起着dnsmasq,充当本地dns缓存服务,来提高dns解析性能同时减轻dnsserver的压力。
(2)HTTPDNS
但凡使用域名来给用户提供服务的互联网企业,都或多或少无法避免在有中国特色的互联网环境中遭遇到各种域名被缓存、用户跨网访问缓慢等问题。
首先是域名缓存,不同运营商、不同节点的缓存时间设置的差别较大。这样在流量切换时,就会产生新、旧应用数据不一致的现象。
其次就是域名解析过了太多层的nat,这就导致dns获取客户端地址时很难准确定位,从而智能dns的准确度大打折扣。
最近几年httpdns出现了,用户明确的知道我在访问某厂的服务时,应该去找哪个ip要对应的域名,实现这个的前提是你可以左右用户的访问习惯,目前应用最合适的场景是app。
参照如下链接http://www.dnsdizhi.com/post-240.html
HttpDNS的原理非常简单,主要有两步:
A、客户端直接访问HttpDNS接口,获取业务在域名配置管理系统上配置的访问延迟最优的IP。
(基于容灾考虑,还是保留次选使用运营商LocalDNS解析域名的方式)
B、客户端向获取到的IP后就向直接往此IP发送业务协议请求。以Http请求为例,通过在header中指定host字段,向HttpDNS返回的IP发送标准的Http请求即可。
(2)HttpDNS优势:
从原理上来讲,HttpDNS只是将域名解析的协议由DNS协议换成了Http协议,并不复杂。但是这一微小的转换,却带来了无数的收益:
A、根治域名解析异常:由于绕过了运营商的LocalDNS,用户解析域名的请求通过Http协议直接透传到了腾讯的HttpDNS服务器IP上,用户在客户端的域名解析请求将不会遭受到域名解析异常的困扰。
B、调度精准:HttpDNS能直接获取到用户IP,通过结合腾讯自有专利技术生成的IP地址库以及测速系统,可以保证将用户引导的访问最快的IDC节点上。
C、实现成本低廉:接入HttpDNS的业务仅需要对客户端接入层做少量改造,无需用户手机进行root或越狱;而且由于Http协议请求构造非常简单,兼容各版本的移动操作系统更不成问题;
另外HttpDNS的后端配置完全复用现有权威DNS配置,管理成本也非常低。总而言之,就是以最小的改造成本,解决了业务遭受域名解析异常的问题,并满足业务精确流量调度的需求。
D、扩展性强:HttpDNS提供可靠的域名解析服务,业务可将自有调度逻辑与HttpDNS返回结果结合,实现更精细化的流量调度。比如指定版本的客户端连接请求的IP地址,指定网络类型的用户连接指定的IP地址等。
当然各位可能会问:用户将首选的域名解析方式切换到了HttpDNS,那么HttpDNS的高可用又是如何保证的呢?另外不同运营商的用户访问到同一个HttpDNS的服务IP,用户的访问延迟如何保证?
为了保证高可用及提升用户体验,HttpDNS通过接入了腾讯公网交换平台的BGP Anycast网络,与全国多个主流运营商建立了BGP互联,保证了这些运营商的用户能够快速地访问到HttpDNS服务;
另外HttpDNS在多个数据中心进行了部署,任意一个节点发生故障时均能无缝切换到备份节点,保证用户解析正常。