dinghailong128

实战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

 

分类:

技术点:

相关文章:

  • 2021-10-15
  • 2021-12-17
  • 2022-02-28
  • 2022-12-23
  • 2021-05-22
  • 2021-07-08
  • 2021-09-19
猜你喜欢
  • 2021-09-15
  • 2022-12-23
  • 2021-12-25
  • 2022-12-23
  • 2021-04-28
  • 2021-06-06
相关资源
相似解决方案