DNS and BIND

DNS:Domain Name Service, 协议(C/S,53/udp,53/tcp)
BIND: Bekerly  Internet Name Domain, ISC (www.isc.org)

TCP:面向连接的协议(三次握手,四次断开)
UDP:User Datagram Protocol 无连接协议

本地名称解析hosts
/etc/hosts
%WINDOWS%/system32/drivers/etc/hosts

Top Level Doamin 顶级域(一级域) tld  
 com(公司),edu,mil,gov,net,org(非盈利),int(国际性)
三类:组织域、国家域(.cn,.iq,.hk,.tw)、反向域

DNS查询类型
    迭代查询
    递归查询

名称服务器:域内负责解析本域内的名称的主机
    根服务器:13组服务器
    
解析类型:
    Name -->IP
    IP--Name

正反向解析是不同的解析树

DNS服务器类型

主DNS服务器
辅助DNS服务器
缓存DNS服务器
转发器

主DNS服务器:维护所负责解析的域内解析库服务器
从DNS服务器:从主服务器或其他服务器“复制”(区域传递)一份解析库;
   序列号:解析库的版本号;前提:主服务器解析库内容发生变化;其序列递增
   刷新时间:从服务器从主服务器请求同步解析库的时间间隔
   重试时长:从服务器从主服务器请求同步解析库失败是,再次尝试的时间间隔
   过期时长:从服务器时钟联系不到主服务器时,多久后放弃从服务器角度,停止提供服务。

   "通知"机制

区域传输:
  全量传送
  增量传送

DNS:
    Domain
    正向:  FQDN-->IP
    反向: IP-->FQDN

    FQDN:  Full Qualified Domain Name
    完全合格域名

一次完整的查询请求经过的流程
client-->hosts文件-->DNS Service
    Local Cache -->DNS Server (recursion) --> Server Cache --> iteration (迭代) -->

  解析答案:肯定答案;否定答案;权威答案;非权威答案

资源记录:Resource Record ,RR
   记录内容:A ,AAAA ,PTR ,SOA,NS,CNAME,MX

  SOA:Start Of Authority 起始授权记录:一个区域解析库有且仅能有一个SOA记录,必须为解析库第一条记录
  A:Internet Address 作用  FQDN -->  IP
  AAAA:  FQDN -->IPV6
  PTR:  PoinTeR  ,  IP -->FQDN  指针,用来解析
  NS :Nameserver  转用于标明当前区域的DNS服务器
  CNAME:  Canonical Name 别名记录
  MX :Mail exchanger  邮件交换器

资源记录定义的格式
  语法:  name  [TTL]  IN  rr_type  value
    
    IN:internet
    TTL:可缓存时长
    rr_type  资源记录类型
    value  把名字(name)解析为结果   

  注意:
    (1)TTL  可从全局继承
    (2)@可以用于引用当前区域的名字
    (3)同一个名字可以通过多条记录定义多个不同的值;此时DNS服务器会以轮询方式响应
    (4)同一个值也可能有多个不同的定义名字;通过多个不同的名字指向同一个值进行定义;此仅表示通过多个不同的名字可以找到同一个主机。
    
 
  SOA:
    name:当前区域的名字,  example.com
    value:有多部分组成
    当前区域的主DNS服务器的FQDN,也可以使用当前区域的名字:@
      记录当前区域管理员的邮箱信息;地址中不能用@一般用.  例如hanzaip.example.com
    (主从服务协调属性的定义以及否定的答案的同一的TTL)
    
    例如:
    example.com.  86400  IN SOA   ns.example.com.  nsadmin.example.com.    (  #都要用.结尾
            2015042201 ;  #序列号
            2H       ;  #刷新时间
            10M        ; #重试时间
            1W         ;#过期时间
            1D         ;#否定答案的TTL值
        )

NS: 
 name:当前区域的名字
value :当前区域的某DNS服务器的名字,例如:ns.example.com
  注意:一个区域可以有多个NS记录

例如:
example.com.   IN  NS   ns1.example.com
example.com.   IN  NS   ns2.example.com

注意:
  (1)相邻的两个资源记录的Name相同时,后续的可省略
   (2)对于NS记录而言,任何一个ns记录后面的服务器名字,都应该在后续有一个A记录
  
MX: 
 name:当前区域的名字
value :当前区域的某邮件服务器(smtp服务器)的主机名
    一个区域内,MX记录可由多个,单每个记录的value之前应该有一个数字(0-99),
表示此服务器的有限级,数字越小优先级越高。

例如:
example.com.   IN  MX  10   mx1.example.com
           IN  MX  20   mx2.example.com

注意:
(1)对MX记录,任何一个MX记录后面的服务器名字,都应该在后续有一个A记录

A:
   name:某主机的FQDN,例如:www.example.com
   value:主机名对应的IP地址

例如:

    www.example.com.    IN   A  172.25.11.10
    www.example.com.    IN   A  172.25.11.11   

    mx1.example.com.    IN   A  172.25.11.12
    mx2.example.com.    IN   A  172.25.11.12

注意:
   *.example.com.    IN  A  1.1.1.4
   example.com.    IN  A  1.1.1.4

  避免用户写错名称时给错误答案,可通过泛域名解析进行解析至某特定地址;

AAAA:
  name:FQDN
  value:ipv6

PTR:
  name : IP  有特定格式,把IP反过来写  1.2.3.4  写为4.3.2.1 有特定后缀 in-addr.arpa.  所以完整写法为: 4.3.2.1.in-addr.arpa.
  value : FQDN

例如
   4.3.2.1.in-addr.arpa.  IN PTR  www.example.com 
   简写成  
    4    IN PTR  www.example.com
      网络地址(后缀可省)  IN  PTR  www.example.com 
    主机地址依然需要反着写

CANME
  name:别名的FQDN
  valule: 正式名字的FQDN
  
  例如:
   web.example.com   IN  CNAME   www.example.com

BIND:
  RR(资源记录)类型: A PTR  NS MX  CNAME  SOA  AAAA 

  子域授权:每个域的名称服务器,都是通过其上级名称服务器在解析库中进行授权
    类似根域授权tld
       .com.  IN  NS   ns1.com.
       .com.  IN  NS   ns2.com.
      ns1.com.  IN  A  2.2.2.1
      ns2.com.  IN  A  2.2.2.2
    
    example.com.  在.com的名称服务器上,解析库中添加资源记录
            exmaple.com.  IN  NS  ns1.example.com.           
        exmaple.com.  IN  NS  ns2.example.com.           
        exmaple.com.  IN  NS  ns3.example.com.
        ns1.example.com.  IN A 3.3.3.1
        ns2.example.com.  IN A 3.3.3.2
        ns3.example.com.  IN A 3.3.3.3

    glue  record  粘合记录

域名注册:
  代理商:万网,新网;godaddy

  初测完成以后
    (1)管理后台,把NS记录指向的服务器名称,和A记录指向的服务器地址;

BIND的安装配置

 dns服务的程序包名bind,程序名named

 程序包:
    bind;bind-libs;bind-utils
    bind-chroot:/var/named/chroot/

 bind:
    服务脚本:/etc/rc.d/init.d/named
    主配置文件:/etc/named.conf,/etc/named.rfc1912.zones,/etc/rndc.key
    解析库文件:/var/named/ZONE_NAME.ZONE

        注意:
        (1)一台物理服务器可同时为多个区域提供解析;
        (2)必须要有根区域文件;named.ca
        (3)应该有两个(如果包括ipv6,应该更多)实现localhost和本地回环地址的解析库  

    rndc:remote name domain controller ,默认与bind安装在同一主机,
且只能通过127.0.0.1来连接named进程;提供辅助性的管理功能。
    953/tcp

全球13个根节点  cat /var/named/named.ca

主配置文件:
  全局配置:options {}
  日志子系统配置:logging{}
  区域定义:本机能为哪些zone进行解析,就要定义哪些zone
    zone  "ZONE_NAME" IN {}

  注意:任何武器程序如果期望其能够通过网络被其他主机访问,至少应该监听在一个能与外部主机通信的地址上。

cp -v /etc/named.conf{,.bak}  自动创建自己的一个备份,{}中,前不写东西代表自己本身

/*  ... */  段落注释  //注释
 
service named restart

ss -tunlp |grep :53  查看named服务端口

缓存名称服务器的配置:
    监听外部地址即可

    dnssec:
         建议测试时关闭dnssec  
        加入options {}中
        dnssec-enable no;
        dnssec-validation no;
        

dig [-t type]  www.exmaple.com

+[no]trace 跟踪解析过程
+[no]recurse 进行递归解析

正向解析区域
(1) zone "name"  IN {
    type master;
    file "zone_name.zone";
        };
(2)区域解析库
    SOA,NS,MX,A,CNAME

反向
  (1)zone "1.1.1.1.in-addr.arpa" IN {
    type master;
    file "somefile.zone"
    };
  (2)区域解析库
    SOA,NS,PTR

测试工具 dig  host  nslookup

主从同步:
    主服务器:授权允许同步
    (1)NS记录
    (2)授权允许区域传输

    从服务器:
    (1)只需定义区域
    

子域授权:分布式数据库

正向解析区域子域方法:

    定义一个子区域:
      ops.example.com.  IN  NS  ns1.ops.example.com.
      ops.example.com.  IN  NS  ns2.ops.example.com.
      ns1.ops.example.com   IN  A  1.1.1.1
      ns2.ops.example.com   IN  A  1.1.1.2

    定义转发服务器
      注意被转发的服务器需要能够为请求者做递归,否则,转发请求不予进行;
    (1)全部转发:凡是非本机所有负责解析的区域的请求,统统转发给指定的服务器;
     Options {
    forward  {first|only}   # first是先转发给你,only是仅递归
    forwarders     #定义转发给谁
        }
    (2)局部转发:仅转发对特定区域的请求至某服务器
        zone "" IN {
            type forward|master|slave|hint;
            forward {first|only}
            forwarders { 172.25.0.1; };
            
            }

rndc reload 重载服务
rndc flush 刷新
named-checkzone "example.com"  /var/named/example.com.zone
检测是否书写正确

dig -t A ww.example.com  @172.25.100.12  这样就不用在/etc/hosts里写了

dns中基础的安全相关的配置
  acl把一个或多个主机归并为一个集合,并通过一个统一的名称调用;
    用法    acl  acl_name  {
            ip;
            ip;
            net/prelen;   #指明长度的掩码格式
            };

    例如:

        acl localnet_1 {
            172.25.0.0/16;
            ;}

    但是 bind有四个内置的acl
    none没有一个主机
    any任一主机
    local本机
    localnet本机的IP同掩码运算后得到的网络地址

注意:只能先定义,后使用;因此,一般定义在options前面

访问控制的指令:
    allow-query {};  允许查询的主机,即白名单;
    allow-transfer {};  允许传送的=主机,白名单  测试 dig -t AXFR ..  @..
    allow-recursion {}; 允许递归的主机
    allow-update {};允许更新区域数据库中的内容

bind view  :
  视图:
    一个bind服务器可定义多个view;每个view中可定义一个或多个zone;
    每个view用来匹配一组客户端;
    多个view内可能需要对同一个区域进行解析,但是用不同的区域解析库文件;

    view VIEW_NAME {
        match-clients {};  #匹配的客户端
    
    
        };

    注意:
    (1)一旦启用了view,所有的zone都只能定义在view中;不能例外
    (2)仅有必要在匹配到允许递归请求的客户所在view中定义根区域
    (3)客户端请求到达时,是自上而下检查每个view所服务的客户端列表
    
view external {
    match-clients { any; };
    zone "example.com" IN {
    type master;
    file "magedu.com.external";
    allow-update { none; };

};
};

CDN: Content Delivery Network  内容分发网络

智能DNS:
 dnspod
 dns.la

yum groupinstall  "Development Tools"  "Server Platform Development"  -y

编译安装bind  (纯手动配置)
  get  bind-9.10.1-P1.tar.gz
  tar xf ...
  cd  bind-9
  cat README
  groupadd -g 53 named
  useradd -u 53 -g  named  named  -r  (创建系统用户 -r)
  ./configure --prefix=/usr/local/bind9 --sysconfidir=/etc/named/ --disable-ipv6 --disable-chroot
--enable-threads (启动线程threads  多核可以更好工作)
  make && make install

  cd /usr/local/bind9/
  没办法直接调用
  导入路径
  vim /etc/profile.d/named.sh
  写入  export PATH=/usr/local/bind9/bin:/usr/local/bin9/sbin:$PATH
  然后导出库文件
  vim /etc/ld.so.conf.d/named.conf
  /usr/local/bind9/lib
  然后
  ldconfig -v
  导入头文件
  ln -sv  /usr/local/bind9/include  /usr/include/named
  vim /etc/man.config
  MANPATH  /usr/local/bind9/share/man
  然后 man named
  mkdir /var/named/
  vim /etc/named/named.conf
  options {
    directory "/var/named";
};

 zone "." IN {
    type hint;
    file "named.ca";
};

zone "localhost" IN {
    type master;
    file "localhost.zone";
    allow-update { none; };
};

zone "0.0.127.in-addr.arpa" IN {
    type master;
    file "named.local";
    allow-update { none; };
};

named-checkconf
dig -t NS . @172.16.0.1 > /var/named/named.ca

vim localhost.zone
$TTL 1d
@  IN  SOA  localhost.  admin.localhost. (
    2015042501
    1h
    5m    
    7d
    1d)
    IN    NS    localhost.
localhost.    IN    A     127.0.0.1

vim named.local

$TTL 1d
@  IN  SOA  localhost.  admin.localhost. (
    2015042501
    1h
    5m    
    7d
    1d)
    IN    NS    localhost.
1    IN    PTR    localhost.

chmod  640 ./*
chown :named *  修改组
chmod  640 /etc/named/named.conf
chown :named /etc/named/named.conf

man named

named -u named -f -g -d 3 
ss -tunl
named -u named  后台运行
killadd named 就关掉了

重新修改添加域
 vim /etc/named/named.conf
  options {
    directory "/var/named";
};

 zone "." IN {
    type hint;
    file "named.ca";
};

zone "localhost" IN {
    type master;
    file "localhost.zone";
    allow-update { none; };
};

zone "0.0.127.in-addr.arpa" IN {
    type master;
    file "named.local";
    allow-update { none; };
};

zone "example.com"  IN  {
    type master;
    file "example.com.zone";
    allow-update { none; };
};
vim example.com.zone
$TTL 86400
$ORIGIN  example.com.
@ IN SOA ns.example.com.  admin.exmaple.com.(
    2015042501
    2h
    10m
    1w
    1d)
    IN NS ns
ns    IN A  172.16.100.11 
www    IN A  172.26.100.11

chmod 640 example.com.zone
chmod :named example.com.zone
named -u named
rndc reload
ss -tunl  就可以了实现自己手动编译安装了

其中 rndc 命令

rndc-confgen -r  /dev/urandom    > /etc/named/rndc.conf
vim  /etc/named.conf   写入 rndc.conf后面部分的内容
killall named
named -u named 重新启动

cd contrib/scripts/queryperf/
./configure
make
就可以使用这个脚本了  queryperf  提升性能的脚本

直接写文本
vim  test
www.example.com
example.com  NS

queryperf -d test -s 172.25.100.11