1 基础概念

1.1 DNS分布式架构

DNS服务 - 图1

  • 全球共有13台根服务器,10台在美国,2台在欧洲(分别位于英国和瑞典),1台在日本;
  • TLD:Top Level Domain,顶级域,按照不同的分类方法,顶级域又可以被分为如下两种类型;

组织域:.com,.net,.org,.gov,.edu,.mil
国家域:.iq,.tw,.hk,.cn

1.2 DNS的查询类型

1、递归查询
通常向本地DNS服务器的查询过程就是递归查询,比如我们常填的8.8.8.8,223.5.5.5,或者自己本地搭建的DNS服务器(不包括自己局域网内部的域名接续),因为这些DNS服务器也并不知道他们的A记录,他们得通过迭代查询得方式首先向根域发起域名解析请求,然后逐级迭代查询,直到找到对应的解析记录。
2、迭代查询
正说上面所描述的那样,如本地的DNS服务器收到主机的域名解析请求时,他们向根域发起请求,并逐级查询的过程,这个过程就叫迭代查询。

1.3 DNS名称解析方式

1、正向解析:名称—>IP,从FQDN解析IP的过程,也是常规的使用方式
2、方向解析:IP—>名称,知道IP,解析出域名的过程
注意:二者的名称空间,不是同一个空间,即不是同一棵树,因此,也不是同一个解析库

1.4 DNS服务器类型

1、负责解析至少一个域,如本地搭建一个DNS服务器,负责公司内部的域名解析

  • 主名称服务器
  • 辅助名称服务器

2、不负责域解析,比如我们本地搭建一个DNS服务,不创建相应的区域解析文件,只负责做DNS的请求转发,缓存等,上面的主-辅名称服务器也可以是缓存名称服务器

  • 缓存名称服务器

    1.5 一次完整查询流程

    Client—>Hosts文件—>DNS服务器的本地缓存—>DNS 服务器(递归请求)—>DNS服务器(迭代查询)
    自己负责解析的域:直接查询数据库并返回结果;
    不是自己负责的解析域:Server cache —>迭代
    解析答案:
    肯定答案:
    否定答案:不存在查询的键,因此,不存在与其查询键对应的值;

权威答案:由直接负责的DNS服务器返回的答案
非权威答案:其他皆为非权威答案

1.6 DNS主-辅服务器

  • 主DNS服务器
    • 维护所负责解析的域数据库的服务器,读写操作均可进行
  • 从DNS服务器

    • 从主DNS服务器那里或其他从DNS服务器那里“复制”一份解析库,但只能进行读操作
  • 影响主-辅服务器复制的一些参数

    • 序列号:serial,也即是数据库的版本号;主服务器数据库内容发生变化时,其版本号递增;
    • 刷新时间间隔:refresh,从服务器多久到主服务器检查序列号更新状况;
    • 重试时间间隔:retry, 从服务器从主服务器请求同步解析库失败时,再次发起尝试请求的时间间隔;
    • 过期时长:expire,从服务器始终联系不到主服务器时,多久之后放弃主从服务器同步数据;并停止服务;
    • 否定答案的缓存时长:

备注:除了从服务器会定期向主服务器同步信息,当主服务器的信息发生变更时,主服务器也会“通知”从服务器更新数据;
区域传送

  1. - 全量传送:axfr,传送整个数据库;
  2. - 增量传递:ixfr,仅传送变量的数据

区域(zone)和域(domain)
比如xsc.org这是一个域,在这个域下面,我们可以添加正向区域文件,反向区域文件,但并意味着域的范围就比区域大,因为父域的区域范围比子域的域要大

1.7 区域数据库文件

资源记录:Resource Record,简称rr

1.7.1 记录类型

A ,AAAA,PTR,SOA,NS ,CNAME,MX

  1. - SOA: start of Authority,起始授权记录;一个区域解析库有且只能由一个SOA记录,而且必须放在第一条;
  2. - NSName Service;域名服务记录,一个区域解析库可以有多个NS记录,其中一个为主的;
  3. - AAddress,地址记录,FQDN-->IPv4
  4. - AAAA:地址记录,FQDN-->IPv6;
  5. - CNAMECanonical Name,别名记录;
  6. - PTRPointer,IP-->FQDN
  7. - MX: mail eXchanger 邮件交换器;
  8. - 优先级:0-99,数字越小优先级越高;

1.7.2 资源记录的定义格式

语法:name [TTL] IN RR_TYPE value

1) SOA

name:当前区域的名字;列如“xsc.org.”,或者“2.3.4.-in-addr-arpa.”;
value:有多部份组成
1)当前区域的区域名称(也可以使用主DNS服务器名称);
2)当前区域管理员的邮箱地址,但地址中不能使用@符号,一般使用点来替代;
3)(主从服务协调属性的定义以及否定答案的TTL)
例如:
xsc.org. 86400 IN SOA xsc.org admin.xsc.org.(
20210916 ;serial
2H ;refresh
10M ;retry
1W ;expire
1D ;negative answer ttl
)

2) NS

name:当前区域的区域名称
value :当前区域的某DNS服务器的名字,例如ns.xsc.org.;
注意:一个区域可以有多个ns记录;
例如︰
xsc.org. 86400 IN NS ns1.xsc.org.
xsc.org. 86400 IN NS ns2.xsc.org.

3) MX

name:当前区域的区域名称
value :当前区域某邮件交换器的主机名;
注意:MX记录可以有多个;但每个记录的value之前应该有一个数字表示其优先级;
例如∶
xsc.org. IN MX 10 mx1.xsc.org.
xsc.org. IN MX 20 mx2.xsc.org.

4) A

name:某FQDN,例如www.xsc.org.
value:某IPv4地址;
例如:
www.xsc.org. IN A 1.1.1.1
www.xsc.org. IN A 1.1.1.2
bbs.xsc.org. IN A 1.1.1.1

5) 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. IN PTR www.xsc.org.
CNAME:
name:FQDN格式的别名;
value:FQDN格式的正式名字;
例如:
web.xsc.org. IN CNAME www.xsc.org.

6) 注意

1)TTL可以从全局继承;
2)@表示当前区域的名称;
3)相邻的两条记录其name相同时,后面的可省略;
4)对于正向区域来说,各MX,NS等类型的记录value为FQDN,此FQDN应该有一个A记录

2 Linux系统下Bind的安装与配置

Bind:Berkeley Internet Name Domain, ISC.org
bind:dns协议的一种实现
named:bind程序的运行的进程名
相关程序包:
bind-libs:被bind和bind-utils包中的程序共同用到的库文件
bind-utils:bind客户端程序集,例如dig,host,nslookup
bind:提供的dns server程序,以及几个常用的测试程序;
bind-chroot:选装,让named运行与一个jail模式下;

2.1 配置文件说明

bind主配置文件:
/etc/named.conf
主配置文件包含进来了其他文件:
/etc/named.iscdlv.key
/etc/named.rfc1912.zones
/etc/named.root.key
解析库文件:/var/named/目录下;一般名字为:ZONE_NAME.zone
注意:
1)一台DNS服务器可以同时为多个区域提供解析;
2)必须要有根区域解析库文件:named.ca;
3)还应该有两个区域解析库文件:localhost和127.0.0.1的正方向解析库
正向:named.localhost
反向:named.loopback
rndc:remote name domain controller,监听在953/tcp,但默认监听127.0.0.1的地址,因此仅允许本地使用
bind程序安装完成之后,默认即可作为缓存名称服务器使用;如果没有专门负责解析的区域,直接即可启动服务

2.1.1 配置文件语法

  1. 全局配置段:
  2. options{....}
  3. 日志配置段:
  4. logging{.....}
  5. 区域配置段:
  6. zone{.....}
  7. 那些由本地负责解析的区域,或转发的区域;
  8. 注意:每个配置语句必须以分号结尾;

2.2 缓存名称服务器的配置

监听能与外部主机通信的地址;
listen-on port 53; { 10.0.0.253; };
学习时,建议关闭dnssec
dnssec-enable no;
dnssec-validation no;
dnssec-lookaside no;
关闭仅允许本地查询:
allow-query { all; };
检查配置文件语法错误;
named-checkconf [/etc/named.conf]

2.2.1 配置示例

  1. options {
  2. listen-on port 53 { any; };
  3. listen-on-v6 port 53 { ::1; };
  4. directory "/var/named";
  5. dump-file "/var/named/data/cache_dump.db";
  6. statistics-file "/var/named/data/named_stats.txt";
  7. memstatistics-file "/var/named/data/named_mem_stats.txt";
  8. recursing-file "/var/named/data/named.recursing";
  9. secroots-file "/var/named/data/named.secroots";
  10. allow-query { any; };
  11. /*
  12. - If you are building an AUTHORITATIVE DNS server, do NOT enable recursion.
  13. - If you are building a RECURSIVE (caching) DNS server, you need to enable
  14. recursion.
  15. - If your recursive DNS server has a public IP address, you MUST enable access
  16. control to limit queries to your legitimate users. Failing to do so will
  17. cause your server to become part of large scale DNS amplification
  18. attacks. Implementing BCP38 within your network would greatly
  19. reduce such attack surface
  20. */
  21. recursion yes;
  22. dnssec-enable no;
  23. dnssec-validation no;
  24. /* Path to ISC DLV key */
  25. bindkeys-file "/etc/named.root.key";
  26. managed-keys-directory "/var/named/dynamic";
  27. pid-file "/run/named/named.pid";
  28. session-keyfile "/run/named/session.key";
  29. };
  30. logging {
  31. channel default_debug {
  32. file "data/named.run";
  33. severity dynamic;
  34. };
  35. };
  36. zone "." IN {
  37. type hint;
  38. file "named.ca";
  39. };
  40. include "/etc/named.rfc1912.zones";
  41. include "/etc/named.root.key";

2.2.2 测试工具

dig,host,nslookup

1、dig命令

dig [-t RR_TYPE] name [@SERVER] [query options]
用于测试dns系统,因此其不会查询hosts文件;
查询选项:
+[no]trace:跟踪解析过程;
+[no]recure:进行递归解析;
例如dig -t A www.baidu.com
反向解析:
dig -x IP
模拟完全区域传送:
dit -t axfr DOMAIN [@server]

2、host命令

host [-t RR_TYPE] name SERVER_IP

3、nslookup命令:

nslookup [-options] [name] [server]
交互模式:
nslookup>
server IP:以指定的IP为DNS服务器进行查询;
set q=RR_TYPE:要查询的资源记录类型;
name:要查询的名称;
rndc命令:named服务控制命令
rndc status
rndc flush

2.3 配置一个正向区域

1)定义区域
在主配置文件中或主配置文件辅助配置文件中实现;
zone “ZONE_NAME” IN {
type {master |slave|hint|forward};
file “ZONE_NAME.zone”;
};
2)建立区域数据文件
在/var/named目录下建立区域数据文件;
文件为:/var/named/xsc.org.zone
$TTL 3600
$ORIGIN xsc.org.
@ IN ns1.xsc.org. dnsadmin.xsc.org.(
2021091701
1H
10M
3D
1D)
IN NS ns1
IN MX 10 mx1
IN MX 20 mx2
ns1 IN A 10.0.0.253
mx2 IN A 10.0.0.252
mx2 IN A 10.0.0.251
www IN A 10.0.0.250
web IN CNAME www
bbs IN A 10.0.0.248
bbs IN A 10.0.0.247
权限及属主修改:
]# chgrp named /var/named/xsc.org.zone
]# chmod 0= /var/named/xsc.org.zone
语法检查:
]# named-checkzone ZONE_NAME ZONE_FILE
]# named-checkconf
3)让服务器重载配置文件和区域数据文件
]# rndc reload 或systemctl reload named

2.4 配置解析一个反向区域

1)定义区域
在主配置文件中或主配置文件辅助配置文件中实现;
zone “ZONE_NAME” IN {
type {master |slave|hint|forward};
file “ZONE_NAME.zone”;
};
注意:反向区域的名字,写成的网段地址.in-addr-arpa,例如0.0.10.in-addr-arpa
2)定义区域解析库文件(主记录为PTR)
示例,区域名称为0.0.10.in-addr.arpa;
$TTL 3600
$ORIGIN 1 0.0.10.in-addr-arpa.
@ IN SOA ns1.xsc.org. nsadmin.xsc.org.(
2021091701
1H
10M
3D
12H)
IN NS ns1.xsc.org.
253 IN PTR ns1.xsc.org.
252 IN PTR mx1.xsc.org.
权限及属主修改:
]# chgrp named /var/named/10.0.0.zone
]# chmod 0= /var/named/10.0.0.zone
语法检查:
]# named-checkzone ZONE_NAME ZONE_FILE
]# named-checkconf
3)让服务器重载配置文件和区域数据文件
]# rndc reload 或systemctl reload named

3 主从DNS架构

注意:从服务器是区域级别的概念;
配置一个从区域;

3.1 On Slave

1)定义区域
定义一个从区域;
zone “ZONE_NAME” IN {
type slave;
file “slave/ZONE_NAME.zone”;
master {MASTER_IP;};
};
配置文件语法检查:named-checkconfig
2)重载配置
rndc reload 或 systemctl reload named
示例:在从服务器的[root@localhost ~]# vim /etc/named.rfc1912.zones文件下增加如下区域记录

zone "xsc.org" IN {
    type slave;
    file "slaves/xsc.org.zone";
    masters { 10.0.0.253; };
};

3.2 On master

1)确保区域数据文件中为每个从服务器配置NS记录,并且在正向区域文件需要每个从服务器的NS记录的主机名配置一个A记录,其此A后面的地址为真正的服务器的IP地址;
注意:时间要同步;ntpdate命令;
示例:在主DNS服务器上的区域文件添加一条NS记录
image.png
重启主-从DNS服务器即可实现数据同步
使用从服务器进行解析,解析成功
image.png

4 子域授权

4.1 子域配置

正向解析区域授权子域的方法:
ops.xsc.org. IN NS ns1.ops.xsc.org.
ops.xsc.org. IN NS ns2.ops.xsc.org.
ns1.ops.xsc.org IN A IP.AD.DR.ESS
ns1.ops.xsc.org IN A IP.AD.DR.ESS
1)在父域服务器上添加一条子域DNS服务器的NS记录

ops.xsc.org.       IN    NS  ns3.ops.xsc.org.
ns3.ops.xsc.org    IN    A   10.0.0.111

image.png
2)在子域服务器上按照之前章节添加区域文件即可

$TTL 1D
@ IN SOA  ops.xsc.org. admin.ops.xsc.com (
          0 ; serial
          1D  ; refresh
          1H  ; retry
          1W  ; expire
          3H ); minimum
       IN    NS  ns1
ns1    IN    A   10.0.0.111
www    IN       A   10.0.0.199
bbs    IN       A   10.0.0.188

3)在子域服务器上做解析,解析正常
image.png

4.2 定义转发

上面子域的解析,只能由子域服务器来解析,如果想在父域服务器上做子域的解析,需要配置forward转发
注意:被转发的服务器必须允许为当前服务器做递归;
1)区域转发:仅转发对某特定区域的解析请求;
zone “ZONE_NAME” IN {
type forward;
forward {first|only};
forwarders {SERVER_IP;};
};

  • first:首先转发,转发器不响应,自行去迭代查询;
  • only:只转发;

示例:

zone "xsc.org" IN {
    type master;
    file "xsc.org.zone";
  forward first;
    forwarders { 10.0.0.111; };    
};

如下即完成了在父域DNS上对子域的解析
image.png
2)全局转发:针对凡本地没有通过zone定义的区域查询请求,通通转给某转发器;
options {
…….
forward {only|first};
forwarders { SERVER_IP; };
…….
};

5 bind中的安全相关配置

acl:访问控制列表,把一个或多个地址归并为一个命名的集合,随后通过此名称即可对此集合的所有主机实现统一调用
acl ACL_NAME {
ip;
net/prelen;
};
示例:
acl mynet {
10.0.0.0/24;
127.0.0.1/8;
};
bind有四个内置的acl
none:没有一个主机;
any:任意主机;
local:本机
localnet:本机所在的IP所属的网络;
访问控制指令:
allow-query {}; 允许查询的主机,白名单;
allow-transfer {}; 允许向哪些主机做区域传送,默认为向所有主机,应该配置仅允许从服务器;
allow-recursion {}; 允许哪些主机向当前DNS服务器发起递归查询请求;
allow-update {};DDNS,允许动态更新区域数据库中内容;

6 bind view智能DNS

视图:
view VIEW_NAME {
zone
zone
zone
}
view internal {
match-clients {10.0.0.0/16;};
zone “xsc.org” IN {
type master;
file “xsc.org/internal”;
};
};
view external {
match-clients {anyl};
zone “xsc.org” IN {
type master;
file “xsc.org/external”;
};
};