学习DNS(一)

DNS(Domain Name System,域名系统)
因特网上作为域名和IP地址相互映射的一个分布式数据库,能够使用户方便的访问互联网,而不用去记住能够被机器读取的IP数串。
通过主机名,最终得到该主机名对应的IP地址的过程叫做域名解析(或主机名解析),DNS协议运行在UDP协议之上,使用端口号53
DNS的分布式数据库是以域名为索引的,每个域名实际上就是一颗很大的逆向数中路径,这棵逆向树成为域名空间(domain name space)
树的最大深度不超过127层,树种每个节点都有一个可以长达63个字符的文本符号。

 

简单地说就是一个IP地址和域名之间的转换系统,方便用户通过域名访问正确的服务地址,而不用记住不易区分的具体IP。DNS协议运行在UDP协议之上,使用端口53。

以访问www.qq.com为例,当用户在浏览器中输入网址点击回车以后,会经过以下查找IP过程,也就是DNS解析过程:
1)本地计算机host文件
2)如果本地没有解析记录,则开始递归查询本地域名服务器LOCAL DNS(也就是你网络中配置的首选和备选DNS)
3)LDNS也没有则会去查询根服务器,并开始迭代查询顶级域下的二级域或者三级域,直到查找到想要解析的域名
4)找到www.qq.com对应的ns域名地址后开始返回给LDNS,LDNS缓存一份记录后返回给计算机
5)计算机拿到地址直接对该地址发起访问请求,完成本次DNS解析过程。

 

常见的DNS服务软件
DNSMASQ
DNSmasq是一款小巧且方便的DNS和DHCP配置工具,适用于本地小型网络本地DNS解析,很多公司会在每台服务器上起着dnsmasq,来充当本地dns缓存服务,来提高dns解析性能同时减轻dnsserver压力
BIND
BIND是目前为止应用最为广泛的DNS部署服务开源软件,特点就是稳定、高效
HTTPDNS
移动解析,基于Http协议向云DNS服务器发送域名解析请求,替代了基于DNS协议向运营商Local DNS发起解析请求的传统方式,可以避免Local DNS造成的域名劫持和跨网访问问题,解决移动互联网服务中域名解析异常带来的困扰
这几年HTTPDNS开始兴起,目前最主要的应用领域还是移动app上解决切换流量数据时,造成新旧数据不一致的情况

 

DNS在企业服务集群中的作用
DNS作为整个集群中的基础服务性质存在,即可以完全独立服务于本地集群的IP解析,也可以部署位于外网环境中供公网解析使用;在集群部署环境配置中使用域名解析的好处就是当服务器迁移或者IP变更时,使用相同的主机域名,就不需要更改大量的应用配置。

 

DNS的分类
主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
DIG、NSLOOKUP、HOST介绍
host 命令,它通过网卡里配置的dns查询百度的域名解析
# 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
bind 9.8版本有个dns漏洞。放公网慎用。
 
检查安装的bind
# 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;
};
这个文件可以看到dns当前解析的数量和成功率
Statistics-file "/var/named/chroot/var/log/named_stats";

创建rndc.key和rndc.conf文件

它首先调用rndc-key,下面链接953端口
# 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文件

引号内的View就是个标记说明,你可以自己改,搞智能dns的时候。你可以改成dianxin liantong等
type master 主从dns,这里是主dns

下面的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;
       };
  };
};
编辑lnh.com.zone
 
这个zone文件是和上面的view里面对应的,和view文件在同一个目录下
SOA 可以理解为一段自己dns做备注说明的文本,一般与ns一致 
$ORIGIN 表示配置生效的域
TTL的话,内网用的话可以调整时间短点,外网用的话,调整时间长一点
# 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
 
从DNS服务器安装
下面来配置一台从DNS服务器
安装软件(同主服务器)
# yum install bind-utils bind bind-devel bind-chroot  -y
编辑named.conf(同主服务器)
编辑rndc-key(同主服务器)
编辑rndc.cnf(同主服务器)
# 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/
 
从dns编辑view.conf,这里和主的dns服务器配置不一样
# cat /var/named/chroot/etc/view.conf
view "SlaveView" {
  zone "lnh.com" {
       type slave;
       masters {10.0.1.161;};
       file "slave.lnh.com.zone";
  };
};
一个master可以跟多少个slave呢。其实没太严格限制。部署了20多个slave都没问题
 
更改属主并启动
# 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
当你的目录下面有这个文件的时候,说明你的主从同步已经生效了
从服务器本来没这个文件,它是从master同步过来的
# 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  
修改rndc文件和view文件,改完后不用重启,rdnc reload就行了
除了改named.conf这个主配置文件,其它文件修改,都用rndc reload就行了

 测试主从

主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
# rndc reload
从dns查看,也跟着变化了,说明主从同步没问题
# 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
接下来在master上做。增加一条A记录
a    A   192.168.122.101
同时记得更新序列号
 
关于zone文件,a对应多个IP
它解析多个IP
A记录这里可以1对多
一个域名对应多个IP,解析的时候是轮询的。可以简单当成负载均衡
缺点如下
1、后端的服务器是否存活不知道
2、只有简单的轮询
# 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
主dns上执行rndc  reload
从dns查看zone文件
# 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
加一条cname记录测试下,同时把序列号+1
# 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
检查slave dns
可以看到这个cname
# 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解析下
可以看到先得到cname为a.lnh.com,然后解析a.lnh.com
# 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
通过从dns解析,正常情况下结果一致
# 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是关于邮件服务的解析的

MX    5 表示优先级,数值是越小越高
# 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
从dns查看
# 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
主dns上测试解析下mx.lnh.com
# 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
上面dig没显示mx.lnh.com的IP
采用下面host方式解析
# 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.
PTR记录

添加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 .

IN SOA后面的 op.lnh.com. dns.lnh.com是一段说明

 文件授权,并重新加载

# 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

 

因为这是个新加的域,从上得编辑它
编辑slave节点/var/named/chroot/etc/view.conf加入ptr的zone配置
# 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

 

从上新的zone文件出现了
# 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.
默认直接host 192.168.122.102 它会去找系统默认的dns服务器

 

测试dns解析的轮询功能

加一条记录,再更改下序列号+1,这样a能解析到3个IP了。测试下解析是否是轮询的

重新加载服务

# rndc reload
执行3次,排在第一位的IP不同,这个是轮询的结果,默认它会把第一个作为请求的返回给客户端
# 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 

编辑master节点/var/named/chroot/etc/view.conf
把原先的内容清理了
# 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";
  };
};
 
编辑maste节点新的/var/named/chroot/etc/group1.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
group不同的地方只是IP不同
编辑maste节点新的/var/named/chroot/etc/group2.viewlnh.com.zone文件
# 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
 
因为编辑的view.conf 现在从dns和主dns已经脱离了主从关系,不用理会主从
测试从两台机器上去请求dns。模拟作为不同客户端的IP去请求同一个dns服务器
在node1上去解析,客户端是10.0.1.161
# 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
在node2上去解析,客户端是10.0.1.162
# 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
这就是智能dns
公网可以买IP库
cdn什么的就是靠IP库
添加 acl groupall,肯定有部分客户端IP不在group中,但是还得让其可以使用dns服务,这里添加个groupall,匹配所有
# 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、压测

安装queryperf
解压bind源码: tar zxf bind-9.7.3.tar.gz
进入解压后的bind源码目录:
# 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
会在当前目录下出现queryperf,可以将它拷贝至/usr/bin/下
# 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
5、监控

监控结合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

 

有人觉得3ms慢,有人觉得30ms慢,没特别的统一的标准

DNS每秒请求数监控:

主配置文件中,这个文件可以用于监控
# grep stats /etc/named.conf
  Statistics-file "/var/named/chroot/var/log/named_stats";
  memstatistics-file "log/mem_stats";
先执行rndc 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) 
在每台dns主机上,编写zabbix脚本,分析named_stats文件,获取每秒请求数
下面这个脚本比较粗略,有时间可以自己优化下,加锁,记录日志等。
#!/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的高可用

我的方案
采用dlz的数据库部分表结构;
用thinkphp 实现对mysql的增删改查,和一些权限控制的页面,在该页面,用户可以完成对域名的增删改查操作,数据源在mysql中;
通过saltstack+py实现从mytsql中调数据,生成bind的配置文件,并检测文件格式,之后reload
改造了,提前生成dns的配置文件。这样mysql挂了没事

为什么要做成页面可以管理的呢

为什么做这些,我要将dns做成可交付,已维护的系统,交付给应用运维同学使用,我只负责dns架构的server端
https://github.com/shanks1127/dns

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在多个数据中心进行了部署,任意一个节点发生故障时均能无缝切换到备份节点,保证用户解析正常。

 

 

posted on 2019-07-18 14:38  五光十色  阅读(1429)  评论(0编辑  收藏  举报

导航