DNS实战

DNS简介

DNS概况

DNS(Domain Name System,域名系统),因特网上作为域名和IP地址互相映射的一个分布式数据库,能够使用户更方便的访问互联网,而不用去记住能够被机器直接读取的IP数串。通过主机名,最终得到该主机对应的IP地址的过程叫做域名解析(或主机名解析)。DNS协议运行在UDP协议之上,使用端口号53。

DNS的分布数据库是以域名为索引的,每个域名实际上就是一棵很大的逆向树中路径,这棵逆向树称为域名空间(domain name space),如下图所示树的最大深度不得超过127层,树中每个节点都有一个可以长达63个字符的文本标号。

3-1

DNS域名解析过程

首先,客户端检测自身缓存,如果没有,检测hosts文件,如果没有,客户端发出DNS请求翻译IP地址或者主机名。DNS服务器在收到客户机的请求后:

1)检查DNS服务器的缓存,若查到请求的地址或名字,即向客户机发出应答信息;

2)若没有查到,则在数据库中查找,若查到请求的地址或名字,即向客户机发出应答信息;

3)若没有查到,则将请求发给根域DNS服务器,并依序从根域查找顶级域,由顶级域查找二级域,二级域查找三级,直至找到要解析的地址或名字,即向客户机所在网络的DNS服务器发出应答信息,DNS服务器收到应答后先在缓存中存储,然后将解析结果发给客户机。

4)若没有找到,则返回错误信息。

DNS分类

主DNS服务器:就是一台存储着原始资料的DNS服务。

从DNS服务器:使用自动更新方式从主DNS服务器同步数据的DNS服务器。也称辅助DNS服务器。

备注:一般生产环境,主DNS服务器做管理使用,从DNS服务器提供服务。

缓存服务器:不负责本地解析,采用递归方式转发客户机查询请求,并返回结果给客户机的DNS服务器。同时缓存查询回来的记过,也叫递归服务器。

转发器:这台DNS发现非本机负责的查询请求时,不再向根域发起请求,而是直接转发给指定的一台或者多台服务器。自身并不缓存查询结果。

DNS中记录类型

3-2

3-3

3-4

3-5

DNS命名规范

1)26个英文字母

2)“0,1,2,3,4,5,6,7,8,9,”十个数字

3)“-”(英文中的连词号)

4)最多63字节长度

备注:要不按照这个规范命名,bing支不支持? 支持,不合适,不建议。 非要不按照这个,怎么办? master-view文件上配置check-name ignore;

DNS三个命令介绍(dig、host、nslookup)

安装必要软件包:yum install bind-utils -y

dig

工具软件dig可以显示整个查询过程

    dig blog.yjscloud.com

上面的命令会输出四段信息;

3-6

第一段是查询参数和统计

3-7

第二段是查询内容

3-8

第三段是DNS服务器的答复。

3-9

上面结果表示,blog.yjscloud.com的CNAME记录指向yjscloud.github.io.;而yjscloud.github.io.的CNAME记录指向sni.github.map.fastly.net.;也就是说,用户查询blog.yjscloud.com的时候,实际上返回的是sni.github.map.fastly.net.的IP地址。这样的好处是,变更服务器IP地址的时候,只要修改sni.github.map.fastly.net.这个域名就可以了,用户blog.yjscloud.com域名不用修改。sni.github.map.fastly.net.有一个A记录,即一个IP地址。532、3532、4都是TTL值(time to live的缩写),表示缓存时间,即表示在这些时间内不用重新查询。

第四段是DNS服务器的一些传输信息。

3-10

上面结果显示,本机的DNS服务器是192.168.16.1,查询端口是53(DNS服务器的默认端口),以及回应长度是117字节。

如果不想看到这么多内容,可以使用+short参数

3-11

使用+trace参数可以显示DNS的整个分级查询过程。

 dig blog.yjscloud.com +trace

上面命令的第一段列出根域名.的所有NS记录,即所有根域名服务器。

3-12

根据内置的根域名服务器IP地址,DNS服务器向所有这些IP地址发出查询请求,询问blog.yjscloud.com的顶级域名服务器com.的NS记录。

最先回复的根域名服务器将被缓存,以后只向这台服务器发请求。

接着是第二段。

3-13

上面结果显示.com域名的13条NS记录,同时返回的还有每一条记录对应的IP地址。

然后,DNS服务器向这些顶级域名服务器发出查询请求,询问blog.yjscloud.com的NS记录。

3-14

上面结果显示blog.yjscloud.com有两条NS记录,同时返回的还有每一条NS记录对应的IP地址。然后,DNS服务器向上面这两台NS服务器查询blog.yjscloud.com的主机名。

3-15

上面结果显示,blog.yjscloud.com有一条CNAME记录,两条NS记录,最先返回结果的NS服务器是f1g1ns1.dnspod.net.,IP地址为58.247.212.36。

host

host命令可以看作dig命令的简化版本,返回当前请求域名的各种记录。

3-16

host命令也可以用于逆向查询,即从IP地址查询域名,等同于dig -x

3-17

nslookup

nslookup命令用于互动式地查询域名记录。

3-18

DNS入门原理

DNS安装部署

192.168.16.111(主DNS)安装

安装DNS: yum install -y bind-utils bind bind-devel bind-chroot

检查是否安装完成:rpm -qa | grep bind

3-19

配置named.conf文件

mv  /etc/named .conf  /etc/named .conf.bak
vim  /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";

配置rndc.key文件

vim /etc/rndc.key

key "rndc-key" {
        algorithm hmac-md5;
        secret "Eqw4hClGExUWeDkKBX/pBg==";
};

配置rndc.conf文件

vim /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文件

vim /var/named/chroot/etc/view.conf

view "View" {
    zone "yjs.com" {
            type    master;
            file    "blog.yjscloud.com.zone";
            allow-transfer {
                    192.168.16.112;
            };
            notify  yes;
            also-notify {
                    192.168.16.112;
            };
    };
};

配置blog.yjscloud.com.zone文件

vim /var/named/chroot/etc/blog.yjscloud.com.zone

$ORIGIN .
$TTL 3600       ; 1 hour
yjs.com                  IN SOA  op.yjs.com. dns.yjs.com. (
                                2000       ; serial
                                900        ; refresh (15 minutes)
                                600        ; retry (10 minutes)
                                86400      ; expire (1 day)
                                3600       ; minimum (1 hour)
                                )
                        NS      op.yjs.com.
$ORIGIN yjs.com.
shanks              A       1.2.3.4
op              A       1.2.3.4
a               A       1.2.3.4

1)Serial:只是一个序号,但这个序号可被用来作为slave与master更新的依据。

举例来说,master序号为100但slave序号为90时,那么这个zone file的资料就会被传送到slave来更新了。由于这个序号代表新旧资料,通常我们建议你可以利用日期来设定。例如上面的资料是在2015/10/20所写的第一次,所以用2015102001作为序号代表。(yyyymmddnn,nn代表这一天是第几次修改)

2)Refresh:除了根据Serial来判断新旧之外,我们可以利用这个refresh(更新)命令slave多久进行一次主动更新、

3)Retry:如果到了Refresh的时间,但是slave却无法连接到master时,那么在多久之后,slave会再次的主动尝试与主机连接。

4)Expire:如果slave一直无法与master连接上,那么经过多久的时间之后,则命令slave不要再连接了。也就是说,此时我们假设masterDNS可能遇到重大问题而无法上线,则等待系统管理员处理完毕后,再重新到slaveDNS重启bind。

5)Minimum:这个类似TTL。
修改目录权限,并启动服务

cd /var && chown -R named.named named/
/etc/init.d/named start
chkconfig named on

解析测试

dig @127.0.0.1 a.yjs.com

3-20

192.168.16.112(从DNS)

yum install -y bind-utils bind bind-devel bind-chroot

配置named.conf文件

mv /etc/named.conf /etc/named.conf.bak
vim /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";

配置rndc.key文件

vim /etc/rndc.key

key "rndc-key" {
          algorithm hmac-md5;
          secret "Eqw4hClGExUWeDkKBX/pBg==";
};

配置rndc.conf文件

vim /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;
};

备注:主从DNS主机配置named.conf、rndc.key、rndc.conf文件一样

配置view.conf文件

vim /var/named/chroot/etc/view.conf

view "SlaveView" {
        zone "yjs.com" {
                type    slave;
                masters {192.168.16.111; };
                file    "slave.blog.yjscloud.com.zone";
        };  
};

修改目录权限,并启动服务

cd /var && chown -R named.named named/
/etc/init.d/named start
chkconfig named on

进入目录/var/named/chroot/etc

3-21

如果有slave。blog.yjscloud.com.zone这个文件说明主从已经同步

添加A、CNAME、MX、PTR记录(主DNS)

A记录

编辑master节点/var/named/chroot/etc/blog.yjscloud.com.zone,在文件末尾添加记录

a               A       192.168.1.100
将serial + 1

3-22

执行rndc reload

3-23

检查从DNS主机,slave.blog.yjscloud.com.zone文件已同步更新。

3-24

CNAME记录

编辑master节点/var/named/chroot/etc/blog.yjscloud.com.zone,在文件末尾添加记录

cname       CNAME   a.yjs.com.
将serial + 1

执行rndc reload

检查从DNS主机,slave.blog.yjscloud.com.zone文件已同步更新。

测试 host a.swj.com 127.0.0.1

MX记录

编辑master节点/var/named/chroot/etc/shhnwangjian.com.zone,在文件末尾添加记录

mx      MX 5    192.168.1.101
将serial + 1

执行rndc reload

检查从DNS主机,slave.shhnwangjian.com.zone文件已同步更新。

测试 host mx.swj.com 127.0.0.1

PTR记录(反向解析)

编辑master节点/var/named/chroot/etc/view.conf,加入ptr的zone配置

zone "168.192.in-addr.arpa" {
  type    master;
 file    "168.192.zone";
 allow-transfer{
     192.168.16.1112;
 };
 notify  yes;
 also-notify{
     192.168.16.112;
 };
};

在下面这个位置加入代码:

3-25

编辑master节点/var/named/chroot/etc/168.192.zone

$TTL 3600       ; 1 hour
@                   IN SOA  op.yjs.com. dns.yjs.com. (
                            2003       ; serial
                            900        ; refresh (15 minutes)
                            600        ; retry (10 minutes)
                            86400      ; expire (1 day)
                            3600       ; minimum (1 hour)
                            )
                    NS      op.yjs.com.
100.1               IN  PTR a.yjs.com.

修改168.192.zone文件属主

chown named.named 168.192.zone
rndc reload

编辑slave节点/var/named/chroot/etc/view.conf,加入ptr的zone配置

zone "168.192.in-addr.arpa" {
    type    slave;
    masters {192.168.16.111; };
    file    "slave.168.192.zone";
};

在下面的这个位置加入代码:

3-26

执行rndc reload

slava节点/var/named/chroot/etc目录下生成slave.168.192.zone文件。

解析测试: host 192.168.1.100 127.0.0.1

DNS实现服务的负载均衡

编辑master节点/var/named/chroot/etc/blog.yjscloud.com.zone,在文件末尾添加记录

a               A       192.168.1.102
将serial + 1

3-27

执行rndc reload

master和slave执行解析:nslookup a.yjs.com 127.0.0.1,结果如下(轮询)

3-28

配置DNS视图(智能DNS)

编辑master节点/var/named/chroot/etc/named.conf,在include上面添加(对客户端IP分组)

acl group1 {
 192.168.137.13;
};

acl group2 {
 192.168.137.14;
};

编辑master节点/var/named/chroot/etc/view.conf(清空原view.conf文件的内容再添加)

view "GROUP1" {
 match-clients { group1; };
 zone "viewyjs.com" {
    type master;
    file "group1.viewyjs.com.zone";
  };
};

view "GROUP2" {
 match-clients { group2; };
 zone "viewyjs.com" {
    type master;
    file "group2.viewyjs.com.zone";
 };
};

编辑master节点/var/named/chroot/etc/group1.viewyjs.com.zone

$ORIGIN .
$TTL 3600       ; 1 hour
viewyjs.com                  IN SOA  op.viewyjs.com. dns.viewyjs.com. (
                            2000       ; serial
                            900        ; refresh (15 minutes)
                            600        ; retry (10 minutes)
                            86400      ; expire (1 day)
                            3600       ; minimum (1 hour)
                            )
                    NS      op.viewyjs.com.
$ORIGIN viewyjs.com.
view              A       192.168.122.1
op              A       192.168.122.1

编辑master节点/var/named/chroot/etc/group2.viewyjs.com.zone

$ORIGIN .
$TTL 3600       ; 1 hour
viewyjs.com                  IN SOA  op.viewyjs.com. dns.viewyjs.com. (
                            2000       ; serial
                            900        ; refresh (15 minutes)
                            600        ; retry (10 minutes)
                            86400      ; expire (1 day)
                            3600       ; minimum (1 hour)
                            )
                    NS      op.viewyjs.com.
$ORIGIN viewyjs.com.
view              A       192.168.122.2
op              A       192.168.122.2

修改文件属主,加载配置

chown named.named /var/named/chroot/etc/group*.zone
rndc reload

测试,在192.168.16.111主机上执行host view.viewyjs.com 192.168.16.111

3-29

在192.168.16.112主机上执行host view.viewyjs.com 192.168.16.111

3-30

构建DNS(企业级)

硬件选型

CPU:12C以上配置

内存:16G

网络:千兆

初始化系统配置

关闭 iptables

service iptables stop
chkconfig iptables off
关闭 selinux
vi /etc/sysconfig/selinux
SELINUX=disabled

高性能、高可用DNS

3-31

1)高可用

物理层:首先确保两台lvs不在同一机柜、同一物理交换机接入;其次确保将所有dns服务器也做到不在同一机柜、同一物理交换机接入;在不通的idc构建多套dns集群,为客户端提供可切换的配置。

服务层:坚决摒弃lvs上端口检测这种方式,采用自定义脚本检测,为dns的健康检测单独设置一个域名,为了lvs检测dns是否存活而设计。

客户端层:多idc之间的流量切换是通过客户端的健康检测cron实现的,脚本可以按分钟运行一次,分别检测每个dns集群虚地址的可用性。

#!/bin/sh
timeout=5
Q=""
host="/usr/bin/host"
if test -z "$1" ; then
    echo "You need to supply a DNS server to check. Quittind"
    exit;
fi
SERVER=$10
ERC=$host -s -w $timeout $Q SERVER > /dev/null 2>$1; echo $?
if [ $ERC -eq 0 ] ; then
    exit 0
else
    exit 10
fi

2)高性能

通过lvs可以对每个集群做横向扩容,是否需要扩容的依据是对现有系统的压测结果,以及实时的监控数据。或者可以在最靠近应用层处,加上一次cache-only集群,但前提是你的线上环境中,没有任何系统依赖于dns负载均衡。

压测

将bind-9.9.9-P1.tar.gz下载到合适的目录下

下载bind源码:

wget http://ftp.isc.org/isc/bind9/9.9.1-P1/bind-9.9.9-P1.tar.gz

解压:

tar -xvf bind-9.9.9-P1.tar.gz
cd /bind-9.9.9-P1/contrib/queryperf

编译:

./configure
make

此目录下生成queryperf文件

cp queryperf /usr/bin

压测自己创建的DNS服务,创建一个文件test.txt,内容如下(前面为域名,后面为A记录)

view.viewyjs.com A
view.viewyjs.com A
view.viewyjs.com A
view.viewyjs.com A
view.viewyjs.com A

执行命令:

queryperf -d test.txt -s 192.168.16.111

结果:

3-32

|| 版权声明
作者:废权
链接:https://blog.yjscloud.com/archives/57
声明:如无特别声明本文即为原创文章仅代表个人观点,版权归《废权的博客》所有,欢迎转载,转载请保留原文链接。
THE END
分享
二维码
DNS实战
DNS简介 DNS概况 DNS(Domain Name System,域名系统),因特网上作为域名和IP地址互相映射的一个分布式数据库,能够使用户更方便的访问互联网,而不用去记住……
<<上一篇
下一篇>>
文章目录
关闭
目 录