实战DNS
四、DNS的发展趋势
DNSMASQ
DNSmasq是一个小巧且方便地用于配置DNS和DHCP的工具,适用于小型网络,它提供了DNS功能和可选择的DHCP功能。它服务那些只在本地实用的域名,这些域名是不会在全球的DNS服务器中出现的。DHCP服务器和DNS服务器结合,并且允许DHCP分配的地址能在DNS中正常解析,而这些DHCP分配的地址和相关命令可以配置到每台主机中,也可以配置到一台核心设备中(比如路由器),DNSmasq支持静态和动态两种DHCP配置方式。
有一些公司在每台服务器上都起着dnsmasq,充当本地dns缓存服务,来提高dns解析性能同时减轻dnsserver的压力。
HTTPDNS
但凡使用域名来给用户提供服务的互联网企业,都或多或少的无法避免在有中国特色的互联网环境中遭遇到各种域名被缓存、用户跨网访问缓慢等问题。
首先是域名缓存,不同运营商,不同节点的缓存时间设置的差别较大。这样在流量切换时,就会产生新、旧应用数据不一致的现象。
其次就是域名解析过了太多层的nat,这就导致dns获取客户端地址时很难准确定位,从而智能dns的准确度大打折扣。
最近两年,httpdns出现了
用户明确的知道我在访问某厂的服务时,应该去找哪个ip要对应的域名,实现这个的前提是你可以左右用户的访问习惯,目前应用最适合的场景是app
在可预见的未来,不论在公司内网还是公网环境,dns在整个架构中,都将会以一个基础服务的位置存在,而目前最为稳定、高效的,依然是bind。
五、生产常用DNS问题以及排障方法
DNS需要开通53的UDP TCP!
运维同学突然告诉我,你的DNS不能用了
记得那时我刚来公司还没转正的时候。有个哥们问我,dns现在没什么事吧?卧槽卧槽,dns?什么dns?
记得那会线上跑着多少dns,每台dns配置又不一样,没人说得清楚。于是我说兄弟,你什么dns,怎么了?他告诉我一个ip,说用的这个dns,现在解析不了了。我说我看下,你先改个别的dns,这种时候一定要先恢复业务,然后再排查、解决问题。
我尝试用那台dns解析域名,确实不行了,登上去看,dns进程还在,想来是有什么瓶颈了,看日志吧,在日志中发现有报netfilter满了的日志,怎么他们会报这个呢,难道机器起着iptables?卧槽,还真是起着呢,这不蛋逼呢吗,赶紧把iptables停掉,问题恢复。
在iptables运行时,即便是没有任何规则,所有的报文也要过netfilter表,而dns这种高并发的业务很容易把netfilter表填满,从而影响服务。
后续的工作就是整理线上dns,同一配置,做好监控,做好高可用和负载均衡。
突然收到报警,提示DNS虚地址不能正常解析了
那天带孩子体检,请了一天假,还在医院的时候,收到的报警,赶紧电话到公司,询问怎么回事,原来是有同事将zabbix的一个域名删除了,而这个域名恰恰是我lvs健康检测dns服务是否可以提供解析的域名,域名都没了,那肯定解析失败,于是lvs把所有dns都剔除了。
虽然恢复起来很快,但是这也提醒我,系统之间,一定要尽量减小耦合性,避免雪崩。
开发来找,说调用微信支付接口有超时的现象,错误日志中报解析微信域名失败
接到这case,首先是确认问题是否出现在域名解析的环节,我登录到服务器上,用nslookup解析对应的域名,连续解析1000次均没问题,但开发小妹依然喋喋不休,我按耐住TMD心情。突然想起也许她php中调用的解析函数与nslookup不同,于是我用host解析,这时发现问题了。每次解析微信支付这个域名的时候,这不由得让我对大qq产生了膜拜的情绪。
出现这种情况让人很头大,而旁边开发小妹还在殷切的看着你,你背后还有领导不时的喘着粗气,而恰恰此时你对这问题一点头绪也没有,怎么办?
越是这种时候,越要淡定,不然怎么办?
这玩意不是谁教的,是你多遇到几次这种情况,每次都要提醒自己,冷静、冷静、冷静。。。。
既然只有解析微信这个接口有问题,那我想可能是微信对dns这块有什么限制,那我可不可以换个forward的公司dns试一下呢?分两头,一头是我去测试,另外一头让同事联系微信,给提供一个qq那边的权威dnsip,最终我将qq权威dns的ip加到我dns的forward列表中解决了这个case。
六、部分DNS相关的面试题
DNS中递归查询与迭代查询的区别
1.递归查询:
一般客户机和服务器之间属于递归查询,即当客户机向DNS服务器发出请求后,若DNS服务器本身不解析,则会向另外的DNS服务器发出查询请求,得到结果后转交给客户机。
2.迭代查询(反复查询):
一般DNS服务器之间属迭代查询,如:若DNS2不能响应DNS1的请求,则它会将DNS3的IP给DNS2,以便其再向DNS3发出请求:
以一个dns请求解析为例:
1)用户发起域名请求到dnsA,这时dnsA有这个记录,将结果返回给用户,这个过程是递归查询;
2)用户发起域名请求到dnsA,这时dnsA没有这个记录,他去向dnsB问有没有这个记录,以此类推,直到把结果返回给用户,这个过程是递归查询;
3)用户发起域名请求到dnsA,这时dnsA没有这个记录,他告诉用户,我没有这个记录,你去问dnsB吧,这个过程是迭代查询。
简述DNS进行域名解析的过程
首先,客户端发出DNS请求翻译IP地址或主机名。DNS服务器在收到客户机的请求后:
(1)检查DNS服务器的缓存,若查到请求的地址或名字,即向客户机发出应答信息;
(2)若没有查到,则在自身配置中查找,若查到请求的地址或名字,即向客户机发出应答信息;
(3)若没有查到,则将请求发给根域DNS服务器,并依次从根域查找顶级域,由顶级查找二级域,二级域查找三级,直至找到要解析的地址或名字,即向客户机所在网络的DNS服务器发出应答信息,DNS服务器收到应答后现在缓存中存储,然后,将解析结果发给客户机。
(4)若没有找到,则返回错误信息。
附录
DNS安装脚本YUM版
1 #!/bin/bash 2 #################################################################### 3 # Auto install bind 4 # Create Date : 2012-11-28 5 # Written by :shanks 6 # Organization: DangDang 7 #################################################################### 8 9 IN_Face=`route -n |awk \'{if($4~/UG/){print $8}}\'|head -n 1` 10 Local_IP=`/sbin/ifconfig|grep -B1 -C1 -w "${IN_Face}"|grep -w \'inet addr\'|awk -F: \'{print $2}\'|awk \'{print $1}\'` 11 12 cd /usr/local/src/ 13 yum -y install bind-utils bind bind-devel bind-chroot bind-libs >>/tmp/init_sn.log -y && rndc-confgen -r /dev/urandom -a || exit 1 14 # ***config /etc/named.conf*** 15 cat << shanks1 > /etc/named.conf 16 options { 17 version "1.1.1"; 18 listen-on port 53 {any;}; 19 directory "/var/named/chroot/etc/"; 20 pid-file "/var/named/chroot/var/run/named/named.pid"; 21 allow-query { any; }; 22 Dump-file "/var/named/chroot/var/log/binddump.db"; 23 Statistics-file "/var/named/chroot/var/log/named_stats"; 24 zone-statistics yes; 25 memstatistics-file "log/mem_stats"; 26 empty-zones-enable no; 27 forwarders {202.106.196.115;8.8.8.8; }; 28 }; 29 30 key "rndc-key" { 31 algorithm hmac-md5; 32 secret "Eqw4hClGExUWeDkKBX/pBg=="; 33 }; 34 35 controls { 36 inet 127.0.0.1 port 953 37 allow { 127.0.0.1; } keys { "rndc-key"; }; 38 }; 39 40 logging { 41 channel warning { 42 file "/var/named/chroot/var/log/dns_warning" versions 10 size 10m; 43 severity warning; 44 print-category yes; 45 print-severity yes; 46 print-time yes; 47 }; 48 channel general_dns { 49 file "/var/named/chroot/var/log/dns_log" versions 10 size 100m; 50 severity info; 51 print-category yes; 52 print-severity yes; 53 print-time yes; 54 }; 55 category default { 56 warning; 57 }; 58 category queries { 59 general_dns; 60 }; 61 }; 62 63 include "/var/named/chroot/etc/view.conf"; 64 65 shanks1 66 # ***config /etc/rndc.key*** 67 cat << shanks2 > /etc/rndc.key 68 key "rndc-key" { 69 algorithm hmac-md5; 70 secret "Eqw4hClGExUWeDkKBX/pBg=="; 71 }; 72 shanks2 73 # ***config /etc/rndc.conf*** 74 cat << shanks3 > /etc/rndc.conf 75 # Start of rndc.conf 76 key "rndc-key" { 77 algorithm hmac-md5; 78 secret "Eqw4hClGExUWeDkKBX/pBg=="; 79 }; 80 81 options { 82 default-key "rndc-key"; 83 default-server 127.0.0.1; 84 default-port 953; 85 }; 86 shanks3 87 # ***config /var/named/chroot/etc/view.conf*** 88 cat << shanks4 > /var/named/chroot/etc/view.conf 89 view "View" { 90 allow-transfer { 91 #dns-ip-list; 92 }; 93 notify yes; 94 also-notify { 95 #dns-ip-list; 96 }; 97 98 # ixfr-from-differences yes; 99 zone "com" { 100 type master; 101 file "com.zone"; 102 allow-transfer { 103 10.255.253.211; 104 }; 105 notify yes; 106 also-notify { 107 10.255.253.211; 108 }; 109 }; 110 zone "forward.com" { 111 type forward; 112 forwarders { 10.255.253.220; }; 113 }; 114 }; 115 shanks4 116 # ***config /var/named/chroot/etc/com.zone*** 117 cat << shanks5 > /var/named/chroot/etc/com.zone 118 \$ORIGIN . 119 \$TTL 3600 ; 1 hour 120 com IN SOA op.shanks.com. dns.shanks.com. ( 121 2000 ; serial 122 900 ; refresh (15 minutes) 123 600 ; retry (10 minutes) 124 86400 ; expire (1 day) 125 3600 ; minimum (1 hour) 126 ) 127 NS op.shanks.com. 128 \$ORIGIN com. 129 shanks A 1.2.3.4 130 shanks5 131 cd /var && chown -R named.named named/ 132 /etc/init.d/named start 133 chkconfig named on 134 #check install status. 135 check_cmd=`host -s -W 0.5 shanks.com 127.0.0.1|grep "1.2.3.4"` 136 if [ -z "${check_cmd}" ] 137 then 138 echo "<ERROR!> hey,man.install bind --- ERROR!" 139 exit 5 140 else 141 echo "<OK> hey,man.install bind --- ok." 142 rndc stats 143 fi 144 145 if [ -f /tmp/Install_bind.sh ] 146 then 147 rm -rf /tmp/Install_bind.sh 148 fi
DNS安装脚本9.9版(编译版本)
1 #!/bin/bash 2 #################################################################### 3 # Auto install bind 4 # Create Date : 2012-11-28 5 # Written by :shanks 6 # Organization: DangDang 7 #################################################################### 8 9 IN_Face=`route -n |awk \'{if($4~/UG/){print $8}}\'|head -n 1` 10 Local_IP=`/sbin/ifconfig|grep -B1 -C1 -w "${IN_Face}"|grep -w \'inet addr\'|awk -F: \'{print $2}\'|awk \'{print $1}\'` 11 12 prefix=\'/usr/local/bind\' 13 14 cd /usr/local/src/ && wget http://192.168.1.9/soft/dns/9.9/bind-9.9.7-P2.tar.gz && tar zxf bind-9.9.7-P2.tar.gz 15 if [ -d \'/usr/local/src/bind-9.9.7-P2\' ] 16 then 17 cd /usr/local/src/bind-9.9.7-P2 && ./configure --prefix=/usr/local/bind --enable-threads --with-libtool && make && make install 18 REAV=$? 19 if [ ${REAV} != 0 ] 20 then 21 echo \'bind make faild!!!\' 22 exit 2 23 fi 24 else 25 echo \'bind src get filed!!!\' 26 exit 1 27 fi 28 # ***config /etc/named.conf*** 29 cat << shanks1 > ${prefix}/etc/named.conf 30 options { 31 version "1.1.1"; 32 listen-on port 53 {any;}; 33 directory "${prefix}/etc/"; 34 pid-file "${prefix}/var/run/named.pid"; 35 allow-query { any; }; 36 Dump-file "${prefix}/var/binddump.db"; 37 Statistics-file "${prefix}/var/named_stats"; 38 zone-statistics yes; 39 memstatistics-file "var/mem_stats"; 40 empty-zones-enable no; 41 masterfile-format text; 42 # allow-update {none;}; 43 # allow-recursion {any;}; 44 # serial-query-rate 100; 45 # recursion no; 46 # dnssec-enable yes; 47 }; 48 49 key "rndc-key" { 50 algorithm hmac-md5; 51 secret "Eqw4hClGExUWeDkKBX/pBg=="; 52 }; 53 54 controls { 55 inet 127.0.0.1 port 953 56 allow { 127.0.0.1; } keys { "rndc-key"; }; 57 }; 58 59 logging { 60 channel warning { 61 file "${prefix}/var/dns_warning" versions 10 size 10m; 62 #file "${prefix}/var/dns_warning"; 63 severity warning; 64 print-category yes; 65 print-severity yes; 66 print-time yes; 67 }; 68 channel general_dns { 69 file "${prefix}/var/dns_log" versions 10 size 50m; 70 #file "${prefix}/var/dns_log"; 71 severity info; 72 print-category yes; 73 print-severity yes; 74 print-time yes; 75 }; 76 category default { 77 warning; 78 }; 79 category queries { 80 general_dns; 81 }; 82 }; 83 84 include "${prefix}/etc/view.conf"; 85 86 shanks1 87 # ***config /etc/rndc.key*** 88 cat << shanks2 > /etc/rndc.key 89 key "rndc-key" { 90 algorithm hmac-md5; 91 secret "Eqw4hClGExUWeDkKBX/pBg=="; 92 }; 93 shanks2 94 # ***config /etc/rndc.conf*** 95 cat << shanks3 > ${prefix}/etc/rndc.conf 96 # Start of rndc.conf 97 key "rndc-key" { 98 algorithm hmac-md5; 99 secret "Eqw4hClGExUWeDkKBX/pBg=="; 100 }; 101 102 options { 103 default-key "rndc-key"; 104 default-server 127.0.0.1; 105 default-port 953; 106 }; 107 shanks3 108 # ***config ${prefix}/etc/view.conf*** 109 cat << shanks4 > ${prefix}/etc/view.conf 110 view "View" { 111 allow-transfer { 112 #dns-ip-list; 113 }; 114 notify yes; 115 also-notify { 116 #dns-ip-list; 117 }; 118 119 # ixfr-from-differences yes; 120 zone "com" { 121 type master; 122 file "com.zone"; 123 allow-transfer { 124 10.255.253.211; 125 }; 126 notify yes; 127 also-notify { 128 10.255.253.211; 129 }; 130 }; 131 zone "forward.com" { 132 type forward; 133 forwarders { 10.255.253.220; }; 134 }; 135 }; 136 shanks4 137 # ***config ${prefix}/etc/com.zone*** 138 cat << shanks5 > ${prefix}/etc/com.zone 139 \$ORIGIN . 140 \$TTL 3600 ; 1 hour 141 com IN SOA op.shanks.com. dns.shanks.com. ( 142 2000 ; serial 143 900 ; refresh (15 minutes) 144 600 ; retry (10 minutes) 145 86400 ; expire (1 day) 146 3600 ; minimum (1 hour) 147 ) 148 NS dns.shanks.com. 149 \$ORIGIN com. 150 shanks A 1.2.3.4 151 shanks5 152 useradd named -s /sbin/nologin 153 cd /usr/local && chown -R named.named bind/ 154 if [ -f /etc/init.d/named ] 155 then 156 rm -rf /etc/init.d/named 157 fi 158 wget -q http://192.168.1.9/soft/dns/9.9/named -O /etc/init.d/named && chmod +x /etc/init.d/named 159 /etc/init.d/named start 160 ln -s ${prefix}/sbin/rndc /usr/bin/rndc 161 ln -s ${prefix}/bin/host /usr/bin/host 162 ln -s ${prefix}/bin/dig /usr/bin/dig 163 chkconfig named on 164 #check install status. 165 check_cmd=`host -s -W 0.5 shanks.com 127.0.0.1|grep "1.2.3.4"` 166 if [ -z "${check_cmd}" ] 167 then 168 echo "<ERROR!> hey,man.install bind --- ERROR!" 169 else 170 echo "<OK> hey,man.install bind --- ok." 171 fi 172 173 if [ -f /tmp/Install_bind.sh ] 174 then 175 rm -rf /tmp/Install_bind.sh 176 fi
DNS自动化配置V1
https://github.com/shanks1127/dns