[TOC]

0x00 前言简述

基础概念

Q: 什么是DNS(Domain Name System)?

A: DNS即域名名称系统(也称域名解析服务器), 它使用层次结构的命名系统将域名和IP地址相互映射形成一个分布式数据库系统, 能够使人更方便的访问互联网
DNS 是互联网的基础设施类的服务、这是一种协议、协议最后是要实现的、协议实现的软件很多( 例如 Bind、CoreDNS)

Tips: DNS 命名用于 Internet 等 TCP/IP 网络中,通过用户友好的名称查找计算机和服务。当用户在应用程序中输入 DNS 名称时,该服务可以将此名称解析为与之相关的其他信息,如 IP 地址。

Tips: DNS 采用C/S架构服务器端主要工作在UDP协议端口53,当然也可以在TCP协议端口53之上。
Tips: 应用程序通常将 DNS 解析委派给操作系统的 DNS Resolver 来执行,程序员对它几乎无感知。


Q:什么是域名(Domain Name)?

A:是一串用点分割的字符,是互联网某台或者某组计算机的名称,使用者更好方便访问网页,而不需去记住一长串的IP地址字符,例如 http://www.weiyigeek.top/ --> IP地址

使用域名好处总结:

  • 1.方便人类记忆
  • 2.更换机器IP地址后不需要改变硬编码在应用的域名,只需要更改解析即可。
  • 2.便于实现负载均衡,例如一个域名可以对应多个IP。
  • 3.便于实现虚拟主机名进行访问同一个地址的多个应用,例如Nginx的代理。

Tips: 域名的购买与使用流程(此处忽略了我大天朝的特殊国情-备案):

  • 1.你在某域名提供商处购买了一个域名 weiyigeek.top
  • 2.域名提供商向 .top 对应的顶级域名服务器中插入一条以上的 NS 记录,指向它自己的次级 DNS 服务器,如 dns25.hichina.com.
  • 3.阿里云会向 TLD 中插入几条 NS 记录,指向阿里云的次级 DNS 服务器(如 alidns.com - 223.6.6.6)。
  • 4.你在该域名提供商的 DNS 管理界面中添加 A 记录,值为你的服务器 IP。
  • 5.OK 现在 ping 一下 weiyigeek.top,就会发现它已经解析到你自己的服务器了。

Tips: 了解各种域名状态的含义,有助于明白域名安全情况、不能正常使用的原因等,以便及时采取相应措施。

  • 1.新注册的域名可能出现以下状态:

    • .addPeriod : 注册局设置域名新注册期(域名新注册 5 天内会出现的状态,不影响域名使用,5 天后自动解除 - 添加句点)。
    • ·ok : 普通状态(可正常使用。没有需要立即进行的操作,也没有设置任何保护措施。有其他状态时,OK 状态不显示,但并不代表不正常。
  • 2.出于对域名注册信息的保护,域名在进行某些安全锁定后,会出现以下状态:

    • ·clientDeleteProhibited 注册商设置禁止删除(保护域名的一种状态,域名不能被删除)。
    • .serverDeleteProhibited 注册局设置禁止删除(保护域名的一种状态,域名不能被删除)。
    • ·clientUpdateProhibited 注册商设置禁止更新(域名信息,包括注册人/管理联系人/技术联系人/付费联系人/DNS 等不能被修改,但可设置或修改解析记录)。
    • ·serverUpdateProhibited 注册局设置禁止更新(域名信息,包括注册人/管理联系人/技术联系人/付费联系人/DNS 等不能被修改,但可设置或修改解析记录)。
    • ·clientTransferProhibited 注册商设置禁止转移(保护域名的一种状态,域名不能转移注册商)。
    • ·serverTransferProhibited 注册局设置禁止转移(保护域名的一种状态,域名不能转移注册商。有的域名新注册及转移注册商 60 天内会被注册局设置成该状态,60 天后自动解除;有的则为域名涉及仲裁或诉讼案被注册局设置,仲裁或诉讼案结束会被解除)。
  • 3.其他禁止解析、禁止续费的状态:

    • ·pendingVerification 注册信息审核期(该域名注册后未进行实名审核,需尽早在域名付费后 5 天内提交资料审核,5 天后仍未实名审核的,将进入 ServerHold 状态)。
    • ·clientHold 注册商设置暂停解析(处于该状态域名解析暂停,需联系注册商解除该状态)。
    • ·serverHold 注册局设置暂停解析(处于该状态域名解析暂停,.cn 国内中英文域名注册成功后未通过实名审核时多出现该种状态,需在域名有效期内完成实名审核后解除)。
    • ·inactive 非激活状态(注册时未填写域名 DNS,不能进行解析,需在注册商处设置域名 DNS)。
    • ·clientRenewProhibited 注册商或注册局设置禁止续费(域名不能续费,处于该状态通常表示该域名处于仲裁或法院争议期,需联系注册商确认原因)。
    • .serverRenewProhibited
    • ·pendingTransfer 注册局设置转移过程中(域名正在转移注册商过程中)。
    • ·redemptionPeriod 注册局设置赎回期(域名处于赎回期,可联系注册商高价赎回)。
    • ·pendingDelete 注册局设置待删除/赎回期(对于国际域名,该状态表示域名已过赎回期等待被删除,删除后开放重新注册;对于国内域名,该状态表示域名处于赎回期,可联系注册商高价赎回)。

Tips: 当前每一级域名长度的限制是63个字符,域名总长度则不能超过253个字符。


Q: 什么是FQDN?

A: FQDN( Fully Qualified Domain Name) 完全限定域名,它是使用DNS的树状层级结构的完全路径域名来表示一个准确位置对应的主机。

例如域名大致分类:

1
2
3
组织域:.com、.org、.mil、.gov、.edu、.net、
国家域:.cn、.hk、.tw、.us、.jp、.ir、.uk
反向域:.in-addr.arpa

WeiyiGeek.域名树状结构图

WeiyiGeek.域名树状结构图

Tips : DNS提供正向解析(FQDN-->IP)反向解析(IP-->FQDN)的功能。


Q: 什么是名称解析?

A: 所谓名称解析的过程就是某个应用程序基于某个搜索引擎在指定的数据库中查询、而后查询到某些对应的键以后与之对应的键导出来的过程
简单的说: 它可以将一个域名(URL)解析到对应的IP地址上,从而能访问该IP地址下机器提供的相关应用, 所以几乎每个Internet连接都以DNS查找开始。
例如,多数用户喜欢使用友好的名称(如 debian.linuxsir.org)来查找计算机,如网络上的邮件服务器或 Web 服务器。友好名称更容易了解和记住。但是计算机使用数字地址在网络上进行通讯。为更容易地使用网络资源,DNS 等命名系统提供了一种方法,将计算机或服务的用户友好名称映射为数字地址。

1
2
3
4
# 域名对应IP查看
C:\Users\WeiyiGeek>ping www.weiyigeek.top
正在 Ping www.weiyigeek.top [104.31.80.144] 具有 32 字节的数据:
来自 104.31.80.144 的回复: 字节=32 时间=229ms TTL=50


基础术语

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

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

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

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

  • hint : 根DNS internet服务器集。

  • 递归查询: 以上客户机和本地DNS服务器直接的查询方式

  • 迭代查询: 本地DNS服务器多次请求重复查询的方式

  • WHOIS: 即域名数据库查询, 一个域名的所有者可以通过查询WHOIS数据库而被找到;对于大多数根域名服务器基本的WHOIS由ICANN维护,而WHOIS的细节则由控制那个域的域注册机构维护。对于240多个国家代码顶级域名(ccTLDs),通常由该域名权威注册机构负责维护WHOIS, 例如:

    • 中国互联网络信息中心(China Internet Network Information Center)负责 .CN 域名的WHOIS维护
    • 香港互联网注册管理有限公司(Hong Kong Internet Registration Corporation Limited) 负责 .HK 域名的WHOIS维护
    • 台湾网络信息中心 (Taiwan Network Information Center) 负责 .TW 域名的WHOIS维护。
  • 域名分层结构(四层):
    • 1.根域(Root Zone):所有域名的根。根域名服务器负责解析顶级域名,给出顶级域名的 DNS 服务器地址。它的域名是 “” 空字符串。而它的全限定域名(FQDN)是 . ,因为 FQDN 总是以 . 结尾。
      Tips : 全球有13组DNS根服务器、11台在美国、一组在挪威、一组在日本、DNS服务重兵把守、他的安全性有多重要、一旦被攻击全球都互联网中断、可想而知。
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      # (1) 查看全球13个根节点的服务
      $ dig -t NS .
      # ;; OPT PSEUDOSECTION:
      # ; EDNS: version: 0, flags:; udp: 65494
      # ;; QUESTION SECTION:
      # ;. IN NS
      # ;; ANSWER SECTION:
      # . 2483 IN NS d.root-servers.net.
      # . 2483 IN NS h.root-servers.net.
      # . 2483 IN NS c.root-servers.net.
      # . 2483 IN NS k.root-servers.net.
      # . 2483 IN NS g.root-servers.net.
      # . 2483 IN NS l.root-servers.net.
      # . 2483 IN NS m.root-servers.net.
      # . 2483 IN NS j.root-servers.net.
      # . 2483 IN NS f.root-servers.net.
      # . 2483 IN NS e.root-servers.net.
      # . 2483 IN NS a.root-servers.net.
      # . 2483 IN NS b.root-servers.net.
      # . 2483 IN NS i.root-servers.net.
      # ;; Query time: 4 msec
    • 2.顶级域(Top Level Domains, TLD):.com .cn 等国际、国家级的域名, 顶级域名服务器负责解析次级域名,给出次级域名的 DNS 服务器地址, 每个顶级域名都对应各自的服务器,它们之间是完全独立的。例如 .cn 的域名解析仅由 .cn 顶级域名服务器提供。
    • 3.次级域(Second Level Domains): 个人/企业能够买到的域名,比如 baidu.com, 每个次级域名都有一到多个权威 DNS 服务器,这些 DNS 服务器会以 NS 记录的形式保存在对应的顶级域名(TLD)服务器中。权威域名服务器则负责给出最终的解析结果:ip 地址(A 记录 ),另一个域名(CNAME 记录)、另一个 DNS 服务器(NS 记录)等。
    • 4.子域(Sub Domians): *.baidu.com 统统都是 baidu.com 的子域。每一个子域都可以有自己独立的权威 DNS 服务器,这通过在子域中添加 NS 记录实现。

Tips: 目前国际 DNS 系统中已有上千个 TLD,包括中文「.我爱你」甚至藏文域名,详细列表参见 IANA TLD 数据库(http://www.iana.org/domains/root/db) , 除了国际可用的 TLD 还有一类类似「内网 IP 地址」的“私有 TLD”,最常见的比如 xxx.local xxx.lan,被广泛用在集群通信中。

  • 公共 DNS 服务器:缓存了大量的 DNS 记录,有效地降低了上游 DNS 服务器的压力,也加快了网络上的 DNS 查询速度。例如Google 的 8.8.8.8,腾讯 的 114.114.114.114, 阿里 的 233.6.6.6。

  • DNS 泛解析通配符 : DNS 记录允许使用通配符 ,并且该通配符可匹配任意级数的子域!!!比如 *.example.com 就可以匹配所有的一二三四级域名等等,但是无法匹配 example.com 本身!

  • TTL (Time To Live): 上面讲了公共 DNS 服务器通过缓存技术,降低了上游 DNS 服务器的压力,也加快了网络上的 DNS 查询速度。可缓存总得有个过期时间吧!为了精确地控制 DNS 记录的过期时间,每条 DNS 记录都要求自定义设置一个时间属性——TTL,单位为秒。任何一条 DNS 缓存,在超过过期时间后都必须丢弃!另外在没超时的时候,DNS 缓存也可以被主动或者被动地刷新。

  • 本地 DNS 服务器:它只在当前局域网内有效,企业常用一般通过 DHCP 或者手动配置的方式,使内网的服务器都默认使用局域网 DNS 服务器进行解析,该服务器可以只解析自己的私有 DNS 域,而将其他 DNS 域的解析 forward 到公网 DNS 解析器去。

  • 私有 DNS 域:它会覆盖掉公网的同名域(如果公网上有这个域的话),它也可以使用公网不存在的 TLD,比如 xxx.local xxx.lan 等,例如 vmware vcenter 就默认使用 vsphere.local 作为它的 sso (单点登录)系统的域名。kubernetes 默认使用 svc.cluster.local作为集群内部域名。


记录类型

Q: 什么是RR(Resource Record)资源记录?

答: DNS层级结构中不管是节点还是叶子节点都是资源,对这些资源中的某一个的标识使用一定格式的多字段的一条记录来表示,该条记录就是资源记录RR。RR的标准记录在RFC 1034中

(1) RR(Resource Record)的组成说明:

  • owner name : 所属名称
  • TTL : 缓存RR的秒数(Time-to-live)到达此数后强制刷新
  • CLASS : 表示一个协议或者一族协议(常用IN表示Internet)
  • TYPE : RR 类型
  • RDATA : 记录数据

(2) RR中IN类(CLASS)常见解析记录类型(type):

  • SOA :区域授权起始记录,区域文件第一条记录,而且一个区域文件只能有一条;
  • NS :名称服务器解析记录,就是一个Bind Server,这个Server不能提供这个域名的解析服务,直接返回NS记录,用户用这条记录请求权威的解析Bind Server,返回解析地址
  • MX :邮件服务器解析记录, 配合A记录进行
  • A :由域名解析出对应的IPv4地址就叫A记录,属于最基本的记录
  • AAAA : IPV6(A记录)可以理解成新一代的 A 记录。以后会用的越来越多的。
  • PTR :逆向解析记录(解析IP为域名)基本上只在设置邮件服务器时才会用到,例如18.12.168.192.in-addr.arpa name = www.weiyigeek.top.
  • CNAME :别名记录(Canonical name) 记录域名与另一个域名的对应关系由别的域名提供A记录的解析,主要用于给域名起别名
  • TXT : 文本记录主要用于验证域名所属权以及证书申请校验时使用。
  • SRV : SRV 记录用于提供服务发现,看名字也能知道它和 SERVICE 有关。主要用于企业域控(AD)、微服务发现(Kubernetes)等


例如 SOA 记录格式解析

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
$TTL 生存周期(单位s)
@ 记录TLL IN SOA MNAME RNAME (
SERIAL;
REFRESH;
RETRY;
EXPIRE;
MINIMUM;
)

# SOA的RDATA格式说明
* MNAME : 授权主机DQDN或者当前区域的名称
* RNAME : 邮箱地址采用@用.替代
* SERIAL : 区域传送使用的版本号格式是yyyymmddnn
* REFRESH : 从服务器去同步主服务器时间建个
* RETRY : 刷新失败重试时间间隔
* EXPIRE : 从服务器过期时长
* TTL : 消极的缓存TTL即否宕答案过期时常

# SOA 记录 @ 取代在/etc/named.conf中指定的域名其中中的数字分别为:序列号、刷新、重试、过期、生存期
* 序列号:序列号用于DNS数据库文件的版本控制,每当数据被改变,这个序列号就应该被增加
* 刷新:从服务器向主服务器查询最新数据的间隔周期。每一次检查时从服务器的数据是否需要更改,则根据序列号来判别
* 重试:一旦从服务器尝试连接主服务器失败,下一次查询主服务器的延迟时间
* 过期:如果从服务器无法连通主服务器,则在经过此时间后,宣告其数据过期
* 生存期:服务器回答 '无此域名' 的间隔时间
* 数字的默认单位为秒,否则:D= 日、H= 小时、W= 周、M= 分钟

示例1: 百度的SOA解析

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$TTL 7200    ;# 生存周期(单位s)
@ 579 IN SOA dns.baidu.com. sa.baidu.com. (
2021041915 ; serial number
3600 ; refresh 3600s
1200 ; retry 1200s
86400 ; expire 1d
360 ; min TTL 6m
)

primary name server = vip3.alidns.com
responsible mail addr = hostmaster.hichina.com
serial = 2021041915
refresh = 3600 (1 hour)
retry = 1200 (20 mins)
expire = 86400 (1 day)
default TTL = 360 (6 mins)

常用指令说明:

1
2
3
4
5
# (1) $TTL 可以在SOA之前使用该指令,给出TTL秒数的32位整数值。
# (2) $ORIGIN 设定域名它必须出现在任何一行省略书写的RR记录前。当一个区域文件第一次被读取时隐含这个命令的值为 <zone_name>.(必须是跟着一个半角句号),如果不设置它就必须在区域文件中书写FQDN。
* 例如: $ORIGIN kernel.org.
* www CNAME web-server <等同于> www.kernel.org. CNAME web-server.kernel.org.
# (3) @符号等价于$ORIGIN。

示例2: NS/MX/CNAME/A/PTR各个RDATA格式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
# 1.7 NS的RDATA格式
# NSDName:DNS的FQDN
baidu.com. 64899 IN NS ns2.baidu.com.
baidu.com. 64899 IN NS ns4.baidu.com.
baidu.com. 64899 IN NS dns.baidu.com.
baidu.com. 64899 IN NS ns7.baidu.com.
baidu.com. 64899 IN NS ns3.baidu.com.

# 1.8 MX的RDATA格式
# PREFERENCE:优先级,越小越高
# EXCHANGE:邮件服务器FQDN
baidu.com. 7200 IN MX 20 jpmx.baidu.com.
baidu.com. 7200 IN MX 20 mx50.baidu.com.
baidu.com. 7200 IN MX 10 mx.n.shifen.com.
baidu.com. 7200 IN MX 20 mx1.baidu.com.

# 1.9 CNAME的RDATA格式
# CNAME:权威名称,FQDN
www.baidu.com. 1154 IN CNAME www.a.shifen.com.
www.a.shifen.com 是正式名称,而 www.baidu.com 是别名

# 2.0 A的RDATA格式
# ADDRESS:IPV4地址
www.baidu.com. 1154 IN CNAME www.a.shifen.com.
www.a.shifen.com. 36 IN A 111.13.100.92
www.a.shifen.com. 36 IN A 111.13.100.91

# 2.1 PTR的RDATA格式(注意地址是反着来的此处为域名对应的地址192.168.100.7)
7.100.in-addr.arpa. IN PTR www.example.com.


# 2.2 SRV的固定格式: 优先级 权重 端口 目标地址
0 5 5060 sipserver.example.com


0x01 DNS服务介绍

原理流程

描述: DNS服务器采用分布式数据结构保存着海量的名称,那么用户如何快速的在互联网上访问哪台服务器或者哪些服务器就能找到待解析的数据呢?

DNS常规解析请求流程:

描述: 客户机发起对www.kernel.org的解析请求流程如下:

  • 1) 客户机首先查看查找本地hosts文件,如果有则返回,否则进行下一步
  • 2) 客户机查看本地缓存,是否存在本条目的缓存,如果有则直接返回,不再向外发出请求,否则进行下一步,转发。
  • 3) 将请求转发本地DNS服务器。
  • 4) 查看域名是否本地解析,是则本地解析返回,否则进行下一步。
  • 5) 本地DNS服务器首先在缓存中查找,有则返回,无则进行下一步。
  • 6) 向全球某一个根域服务器发起DNS请求,根域返回org域的地址列表。
  • 7) 使用某一个org域的IP地址,发起DNS请求,org域返回kernel域服务器地址列表。
  • 8) 使用某一个kernel域IP地址,发起DNS请求,kernel域返回www.kernel.org主机的IP地址,本地DNS服务收到后,返回给客户机。
WeiyiGeek.DNS访问

WeiyiGeek.DNS访问

DNS域名解析查询方式分类

  • 1.递归查询: 以上客户机和本地DNS服务器直接查询的方式(直接返回查询到的地址给客户机),称为递归查询。

    WeiyiGeek.递归方式查询

    WeiyiGeek.递归方式查询

  • 2.迭代查询: 本地DNS服务器多次请求重复查询的方式,称为迭代查询。

    WeiyiGeek.迭代方式查询

    WeiyiGeek.迭代方式查询


Tips: 总之 DNS 查询进程分两部分进行:

  • 1.名称查询从客户端计算机开始,并传输至解析程序即 DNS 客户端服务程序进行解析。

  • 2.不能在本地解析查询时,可根据需要查询 DNS 服务器来解析名称。


实验目标

描述: 企业内部Linux系统下智能DNS服务搭建系列分为四部:

  • 1) Bind9服务篇: Bind服务基础安装与DNS解析记录及其简单使用;
  • 2) Bind9负载均衡篇 : DNS的递归迭代查询和子域授权, DNS转发的实现过程和配置以及DNS主从域传输
  • 3) Bind9智能DNS篇 : 介绍了DNS的区域传输数据加密及相关配置;
  • 4) Bind9企业内部DNS搭建实践篇

0x02 DNS服务之Bind9

Bind9 基础介绍

Bind9 项目官网: https://www.isc.org/bind/

Q: 什么是Bind9?

答: 1984年,加州大学伯克利分校的几个学生完成了Unix名称服务的实现,起名叫做Berkeley Internet Name Domain(BIND),目前,它是互联网上使用最为广泛的DNS服务软件。
BIND9 是开源的、多功能、经典的、完整的名称服务器软件; BIND9 已发展成为一个非常灵活,功能齐全的DNS系统。其根据MPL 2.0许可获得许可, 用户可以自由地向BIND 9添加功能;


Q: 为什么要使用BIND 9?

答:无论您的应用程序是什么,BIND 9可能都具有必需的功能。作为第一个最古老最常用的解决方案,与其他任何系统相比,已经有更多熟悉BIND 9的网络工程师。
从发布(由DNSSEC签名)的DNS根区域和许多顶级域到发布具有许多小区域的非常大的区域文件的主机提供商,以及具有内部(私有)和外部区域的企业的所有应用程序,BIND均可成功用于所有应用程序中到具有大型解析器场的服务提供商。


Q: Bind9 软件包包括以下三个部分?

1.DNS服务器: 它是一个叫做named的程序代表name daemon的简写, 它根据DNS协议标准的规定响应收到的查询, 默认Bind的配置文件为/etc/named.conf,在每一次named启动与挂起时都会被读取。。   
2.DNS解析库(resolver library) : 一个解析器等于一个程序,通过发送请求到合适的服务器并且对服务器的响应做出合适的回应, 来解析对一个域名的查询。一个解析库是程序组件的集合可以在开发其它程序时使用,为这些程序提供域名解析的功能。
3.软件测试工具 : 例如 dig、host 等DNS测试软件;

Q: Bind9 版本说明?

BIND 的当前代码库为 BIND9 ,当前Current-Stable为9.16.9;
BIND 稳定版,开发版,扩展支持(ESV)和订阅(支持的预览版标记为-S)。

Tips: bind服务需要开放的端口和说明(安装配置时注意防火墙放行):

  • UDP 53 port 用于常规解析;
  • TCP 53 port 用于bind同步数据等作用;
  • TCP 953 port 用于IPv6解析;


Bind9 安装方式

描述: 安装Bind服务软件的几种方式说明

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# (1) 包管理工具
- Redhat 家族
yum install -y bind bind-chroot
rpm -qa | grep bind # 查看被安装的Rpm包
rpm -ql bind | more # 本地的文件路径

- Ubuntu 家族
apt-get install bind9 bind9utils bind9-doc -y
dpkg --list | grep "bind9"
# ii bind9-dnsutils 1:9.16.1-0ubuntu2.4 amd64 Clients provided with BIND 9
# ii bind9-host 1:9.16.1-0ubuntu2.4 amd64 DNS Lookup Utility
# ii bind9-libs:amd64 1:9.16.1-0ubuntu2.4 amd64 Shared Libraries used by BIND 9

# 采用光盘安装
vim /etc/yum.repos.d/base.repo
[RHEL6]
name= base
baseurl=file:///mnt/cdrom
enabled=1
gpgcheck=0

# (2) 编译安装
https://downloads.isc.org/isc/bind9/9.16.9/bind-9.16.9.tar.xz

# (3) 容器安装
官方镜像: https://hub.docker.com/r/internetsystemsconsortium/bind9


Tips : 但是在生产环境中您很可能会有其他限制,包括:

  • 已经安装并正在运行BIND版本-在准备好之前,您不希望覆盖它。
  • 在升级后出现意外情况时,通常希望保留选择切换回以前版本的选项。
  • 您可能需要在另一台计算机上构建BIND,因为您的生产环境未安装编译器。
  • 您可能正在集中构建BIND,以将其分发到许多分散的生产机器。

Tips : 编译安装 bind9 有一个麻烦之处(一般情况下及其不推荐), 所有的配置文件都得自己去建立比如/var/named/这个目录、编译安装时连这个目录都不会存在、得自己去创建这个目录、里面的各种配置文件、区域文件、像根的、甚至连
service启动脚本都没、所以不到万不得以最好别去编译它,所以建议采用操作系统中软件管理包进行自动安装;


Ubuntu 安装

安装环境:

1
2
Description: Ubuntu 20.04.1 LTS
Linux ubuntu 5.4.0-26-generic 30-Ubuntu SMP Mon Apr 20 16:58:30 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux

安装帮助: https://kb.isc.org/docs/aa-00768


1) 源码编译安装
  • Step 1.默认绑定构建和安装

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    # (1)默认情况下,BIND将安装在/usr/local中,并将文件放置在它的子目录中:
    # sbin -已命名以及与BIND相关的所有系统管理工具,例如rndc,dnssec-keygen,named-checkconf等。
    # bin - 非管理员用户的工具-您将在此处找到dig,host和nsupdate
    # lib - 目标代码库
    # Share -(以及各种子目录)BIND的手册页
    # Include - C头文件

    # (2)在不更改默认目录的情况下编译的BIND将期望使用以下目录(相对于/)
    /etc - 配置文件(例如`named.conf,rndc.conf`)
    /var/run - 由named创建和使用的运行时文件
  • Step 2.bind源码下载和编译

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    # (1) 下载与解压: http://www.isc.org/downloads/bind/
    wget https://downloads.isc.org/isc/bind9/9.16.9/bind-9.16.9.tar.xz
    sudo tar -xvf bind-9.16.9.tar.xz -C /usr/local/
    sudo mkdir /etc/bind

    # (2)源码编译两个附加选项(--enable-threads和--with-openssl)以启用多线程并启用OpenSSL。(如果要使用DNSSEC,则需要OpenSSL)
    apt install -y gcc make pkg-config python3-pip libuv1 libuv1-dev libssl-dev libcap-dev libxml2-dev
    mkdir -vp /usr/local/bind && cd /usr/local/bind-9.16.9
    ./configure --prefix=/usr/local/bind --sysconfdir=/etc/bind --localstatedir=/var --with-openssl --with-libxml2 # --enable-threads 实际版本中它是默认即configure没有该选项
    # Configured paths:
    # prefix: /usr/local/bind
    # sysconfdir: /etc/bind
    # localstatedir: /var

    # (3) make 执行构建
    /usr/local/bind-9.16.9# make && make install

    # (4) 版本验证
    /usr/local/bind# ls & ls bin/
    # bin include lib sbin share
    # arpaname delv dig host mdig named-rrchecker nslookup nsupdate
    /usr/local/bind# named -v
    # BIND 9.16.9 (Stable Release) <id:b3f41b7>

    # (5 )dns 解析软件相关软连接
    for i in /usr/local/bind/sbin/*; do ln -f -s $i /usr/local/sbin; done
    for i in /usr/local/bind/bin/*; do ln -f -s $i /usr/local/bin; done
  • Step 3.运行Bind用户以及组创建

    1
    2
    # 选项 -r 系统不会创建家目录
    sudo groupadd -g 53 -r named && sudo useradd -g named -r named
  • Step 3.Bind软件相关的目录以及文件的配置

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    # (1) 创建named的工作目录、然后创建named.ca这个文件
    mkdir -vp /var/named/private/
    dig -t NS . @223.6.6.6 > /var/named/named.ca # 13台根服务器

    # (2) 编译安装默认配置文件与--sysconfdir参数有关, 为了便于管理我们统一设置在/etc/bind/目录下
    sudo mkdir -vp /etc/bind/

    # (3) 我们以weiyigeek.top和一个网段为例编写配置文件
    vim /etc/bind/named.conf
    cat > /etc/bind/named.conf <<'EOF'
    # - 全局配置
    options {
    # 监听地址设置,默认是any表示允许所有网段的主机(可以改成自己所在的内网网段)
    listen-on port 53 { any; };
    listen-on-v6 port 53 { ::1; };
    # 定义named的固定工作路径
    directory "/var/named";
    dump-file "/var/named/data/cache_dump.db";
    statistics-file "/var/named/data/named_stats.txt";
    memstatistics-file "/var/named/data/named_mem_stats.txt";
    # 开启递归
    recursion yes;
    # 下面这两行配置很重要,该配置后当客户端采用我们自己配置的内网DNS的NS服务器后,当访问别的网站内网NS解析不了的就转发给8.8.8.8的DS服务器解析,保证能正常上网。
    forward first;
    forwarders {223.5.5.5;223.6.6.6;};
    # 表示接收所有网段请求
    allow-query { any; };
    };

    # - 日志记录
    logging {
    channel default_debug {
    file "data/named.run";
    severity dynamic;
    };
    };


    # - 根域设置
    zone "." {
    type hint;
    file "named.ca";
    };

    # - 正向解析的区域: 定义一个统一的域名后缀(IN 可被忽略)
    zone "weiyigeek.top" {
    # 类型属于master、属于自己的
    type master;
    # 指定正向解析的文件
    file "private/weiyigeek.top.zone";
    # 允许192.168.12.1/24网段(从DNS服务器)传送
    allow-transfer {192.168.12/24;};
    };

    # - 反向解析的区域
    zone "12.168.192.in-addr.arpa" {
    type master;
    file "private/192.168.12.zone";
    allow-transfer {192.168.12/24;}; # 指定正向解析的文件
    };
    EOF

    - PS : 如果上述是多个网段的反向解析这里就需要定义多个反向解析区域。
  • Step 4.将您的二进制文件作为递归服务器进行测试以及运行后台守护程序

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    # 1) 创建默认的rndc.key文件(它将由named和rndc用来代替named.conf或rndc.conf中的任何特定控件配置)
    sudo rndc-confgen -a
    # wrote key file "/etc/bind/rndc.key"

    # 2) 启动命名的守护程序
    sudo named -u named -c /etc/named/named.conf # PS 如果以非root用户运行请指定-u选项

    # 3) 检查named是否按预期运行;检查日志文件,如果没有,请纠正任何问题:
    sudo ps -ef|grep named
    # /named 113839 1 0 21:35 ? 00:00:00 named

    # 4) 查看状态
    sudo rndc status
    # version: BIND 9.16.9 (Stable Release) <id:b3f41b7>
    # running on ubuntu: Linux x86_64 5.4.0-26-generic #30-Ubuntu SMP Mon Apr 20 16:58:30 UTC 2020
    # boot time: Sat, 28 Nov 2020 13:35:13 GMT
    # last configured: Sat, 28 Nov 2020 13:35:14 GMT
    # configuration file: /etc/named.conf
    # CPUs found: 4
    # worker threads: 4
    # UDP listeners per interface: 4
    # number of zones: 100 (99 automatic)
    # debug level: 0
    # xfers running: 0
    # xfers deferred: 0
    # soa queries in progress: 0
    # query logging is OFF
    # recursive clients: 0/900/1000
    # tcp clients: 0/150
    # TCP high-water: 0
    # server is up and running
  • Step 5.权威解析配置

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    touch /var/named/private/{192.168.12.zone, weiyigeek.top.zone}

    cat > /var/named/private/weiyigeek.top.zone <<'EOF'
    $TTL 1D
    @ IN SOA ns.weiyigeek.top. root.weiyigeek.top. (
    20200711
    7200
    6000
    604800
    86400)
    @ IN NS lns.weiyigeek.top.
    @ IN NS ens.weiyigeek.top.
    lns IN A 192.168.12.253
    ens IN A 223.6.6.6
    self IN A 192.168.12.215
    blog IN A 192.168.12.216
    EOF
    # 1 // 定义宏,通用变量,单位为秒(S)、小时(H),天数(D)
    # 2 // 此处一般是写NS域名,邮件域名,或root.weiyigeek.top.
    # 2 // 序列号 当主DNS修改解析文件时,必须要修改这个序列号,然后重启named服务后,从DNS才能正常同步过去!(这个参数很重要,要特别注意!!)
    # 2 // 刷新时间
    # 2 // 失败重试时间
    # 2 // 过期时间
    # 2 // 否定答案时间
    cat > /var/named/private/192.168.12.zone <<'EOF'
    $TTL 1D
    @ IN SOA ns.weiyigeek.top. root.weiyigeek.top. (
    20200712
    2H
    6000
    604800
    86400)
    @ IN NS lns.weiyigeek.top.
    253 IN PTR lns.weiyigeek.top.
    215 IN PTR self.weiyigeek.top.
    216 IN PTR blog.weiyigeek.top.
    EOF

PS : 对于主DNS的正反向解析文件中的序列号,每当做一次修改后,必须要同时修改这个序列号,这样才能触发主从同步机制!然后重启named服务,从DNS服务器那边才能同步过去,否则不能完成主从同步!

  • Step 6.修改DNS相关配置文件的属主属组和权限

    1
    2
    3
    4
    chown -R named.named /usr/local/bind/ /etc/bind/ /var/named/ /var/run/named/
    chown named.named /etc/bind/rndc.key
    chmod -R 755 /var/named/
    chmod 640 /etc/bind/named.conf /etc/bind/rndc.key
  • Step 7.检查主配置文件和区域数据文件有没有语法错误

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
# (1) 主配置文件验证
root@ubuntu-253:~$ /usr/local/bind/sbin/named-checkconf

# (2) 区域数据文件验证
root@ubuntu-253:/var/named/private# /usr/local/bind/sbin/named-checkzone weiyigeek.top weiyigeek.top.zone
# zone weiyigeek.top/IN: loaded serial 20200711
# OK
root@ubuntu-253:/var/named/private# /usr/local/bind/sbin/named-checkzone 12.168.192.in-addr.arpa 192.168.12.zone
# zone 12.168.192.in-addr.arpa/IN: loaded serial 20200711
# OK

# (3) 使用默认选项测试您的二进制文件 named 启动错误信息查看(Debug)
named -u named -g
# 28-Nov-2020 21:30:44.008 found 4 CPUs, using 4 worker threads
# 28-Nov-2020 21:30:44.008 using 4 UDP listeners per interface
# 28-Nov-2020 21:30:44.012 using up to 21000 sockets
# 28-Nov-2020 21:30:44.012 loading configuration from '/etc/named.conf'
# 28-Nov-2020 21:30:44.012 reading built-in trust anchors from file '/etc/bind.keys'
# 28-Nov-2020 21:30:44.012 using default UDP/IPv4 port range: [32768, 60999]
# 28-Nov-2020 21:30:44.012 using default UDP/IPv6 port range: [32768, 60999]
# 28-Nov-2020 21:30:44.016 listening on IPv4 interface lo, 127.0.0.1#53
# 28-Nov-2020 21:30:44.016 listening on IPv4 interface ens160, 192.168.1.254#53
# 28-Nov-2020 21:30:44.016 listening on IPv4 interface docker0, 172.17.0.1#53
# 28-Nov-2020 21:30:44.016 IPv6 socket API is incomplete; explicitly binding to each IPv6 address separately
# 28-Nov-2020 21:30:44.016 listening on IPv6 interface ens160, fe80::250:56ff:fe8a:cf24%2#53
# 28-Nov-2020 21:30:44.020 generating session key for dynamic DNS
# 28-Nov-2020 21:30:44.020 sizing zone task pool based on 0 zones
# 28-Nov-2020 21:30:44.020 none:98: 'max-cache-size 90%' - setting to 7165MB (out of 7961MB)
# 28-Nov-2020 21:30:44.040 obtaining root key for view _default from '/etc/bind.keys'
# 28-Nov-2020 21:30:44.040 set up managed keys zone for view _default, file 'managed-keys.bind'
.....
# 30-Nov-2020 21:48:53.576 none:98: 'max-cache-size 90%' - setting to 7165MB (out of 7961MB)
# 30-Nov-2020 21:48:53.592 configuring command channel from '/etc/bind/rndc.key'
# 30-Nov-2020 21:48:53.592 command channel listening on 127.0.0.1#953
# 30-Nov-2020 21:48:53.592 configuring command channel from '/etc/bind/rndc.key'
# 30-Nov-2020 21:48:53.592 couldn't add command channel ::1#953: address not available
# 30-Nov-2020 21:48:53.592 not using config file logging statement for logging due to -g option
# 30-Nov-2020 21:48:53.604 managed-keys-zone: loaded serial 9
# 30-Nov-2020 21:48:53.612 zone 12.168.192.in-addr.arpa/IN: loaded serial 20200711
# 30-Nov-2020 21:48:53.612 zone weiyigeek.top/IN: loaded serial 20200711
# 30-Nov-2020 21:48:53.612 all zones loaded
# 30-Nov-2020 21:48:53.612 running
# 30-Nov-2020 21:48:53.612 zone weiyigeek.top/IN: sending notifies (serial 20200711)
# 30-Nov-2020 21:48:53.612 zone 12.168.192.in-addr.arpa/IN: sending notifies (serial 20200711)
# 30-Nov-2020 21:48:53.668 managed-keys-zone: No DNSKEY RRSIGs found for '.': success
  • Step 8.最后检查守护程序是否正在响应:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    # (1) 打开一个新的Shell终端进行验证
    dig @127.0.0.1 . NS
    # 您的名称服务器发送查询,要求它查询具有权威性的NS记录(根名称服务器)列表
    # ;; flags: qr rd ra ad; QUERY: 1, ANSWER: 13, AUTHORITY: 0, ADDITIONAL: 27
    # ;; ANSWER SECTION:
    # . 518252 IN NS g.root-servers.net.
    # . 518252 IN NS h.root-servers.net.
    # . 518252 IN NS l.root-servers.net.
    # . 518252 IN NS j.root-servers.net.
    # . 518252 IN NS k.root-servers.net.
    # . 518252 IN NS b.root-servers.net.
    # . 518252 IN NS m.root-servers.net.
    # . 518252 IN NS f.root-servers.net.
    # . 518252 IN NS d.root-servers.net.
    # . 518252 IN NS c.root-servers.net.
    # . 518252 IN NS e.root-servers.net.
    # . 518252 IN NS i.root-servers.net.
    # . 518252 IN NS a.root-servers.net.

    # (2) 解析验证
    $ sudo vim /etc/resolv.conf # 首先设置本机DNS服务器指向
    # nameserver 192.168.12.253
    # options edns0 trust-ad

    $ dig -t A www.weiyigeek.top @192.168.12.253
    # ;; flags: qr aa rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 1 # 由于没添加解析则回答为0
    # ;; OPT PSEUDOSECTION:
    # ; EDNS: version: 0, flags:; udp: 1232
    # ; COOKIE: caef08a6d576a202010000005fc4fc7251641b78e122c9b0 (good)
    # ;; QUESTION SECTION:
    # ;www.weiyigeek.top. IN A
    # ;; AUTHORITY SECTION:
    # weiyigeek.top. 86400 IN SOA ns.weiyigeek.top. root.weiyigeek.top. 20200711 7200 6000 604800 86400
    # ;; Query time: 0 msec
    # ;; SERVER: 192.168.12.253#53(192.168.12.253)

    # - 正向解析
    $ dig -t A blog.weiyigeek.top @192.168.12.253
    # ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 4139
    # ;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1 # 存在对应的解析目录
    # ;; QUESTION SECTION:
    # ;blog.weiyigeek.top. IN A
    # ;; ANSWER SECTION:
    # blog.weiyigeek.top. 86400 IN A 192.168.12.216

    # - 反向解析
    root@ubuntu-253:~$ nslookup
    # > 192.168.12.253
    # 253.12.168.192.in-addr.arpa name = lns.weiyigeek.top.
    # > 192.168.12.215
    # 215.12.168.192.in-addr.arpa name = self.weiyigeek.top.


2) APT仓库安装
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
# (1) 卸载多余软件例如 snap 服务
sudo systemctl stop snapd snapd.socket #停止snapd相关的进程服务
sudo apt autoremove --purge -y snapd
sudo systemctl daemon-reload
sudo rm -rf ~/snap /snap /var/snap /var/lib/snapd /var/cache/snapd

# (2) 软件源设置与系统更新
sudo cp /etc/apt/sources.list{,.bak}
sudo tee /etc/apt/sources.list <<'EOF'
#阿里云Mirrors - Ubuntu
deb http://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiverse

deb http://mirrors.aliyun.com/ubuntu/ focal-security main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ focal-security main restricted universe multiverse

deb http://mirrors.aliyun.com/ubuntu/ focal-updates main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ focal-updates main restricted universe multiverse

deb http://mirrors.aliyun.com/ubuntu/ focal-proposed main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ focal-proposed main restricted universe multiverse

deb http://mirrors.aliyun.com/ubuntu/ focal-backports main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ focal-backports main restricted universe multiverse
EOF
sudo apt autoclean && sudo apt update

# (3) 判断时间与时区
~$ date
Sat 20 Mar 2021 11:35:19 PM CST
~$ timedatectl status
Local time: Sat 2021-03-20 23:35:00 CST
Universal time: Sat 2021-03-20 15:35:00 UTC
RTC time: Sat 2021-03-20 15:35:00
Time zone: Asia/Shanghai (CST, +0800)
System clock synchronized: yes
NTP service: n/a
RTC in local TZ: no

# (4) 在DNS服务器上安装 bind9
apt install bind9

# (5) 安装成功后目录结构查看主要是配置文件存放目录以及内部域名解析为对应IP的文件
~$ tree /etc/bind/
/etc/bind/
├── bind.keys
├── db.0
├── db.127
├── db.255
├── db.empty
├── db.local
├── named.conf # named 主配置文件入口
├── named.conf.default-zones # - named 本地默认域
├── named.conf.local # - named 自定义域名(我们内网创建的域名解析相应的配置在此处)
├── named.conf.options # - named 全局配置段
├── rndc.key
└── zones.rfc1918

$ tree /var/cache/bind/ # 自定义的正向解析域名以及反向解析的内容文件(你可以将其类比于存储了IP与域名对应的数据库表)
/var/cache/bind/
├── db.12.168.192
├── db.168.192
├── db.weiyigeek.cn
├── db.weiyigeek.top
├── managed-keys.bind
└── managed-keys.bind.jnl

# (6) 启动服务查看状态
$ sudo systemctl start named
$ sudo systemctl status named
# ● named.service - BIND Domain Name Server
# Loaded: loaded (/lib/systemd/system/named.service; enabled; vendor preset: enabled)
# Active: active (running) since Sat 2021-03-20 20:41:03 CST; 3h 4min ago
# Docs: man:named(8)
# Main PID: 838 (named)
# Tasks: 26 (limit: 9448)
# Memory: 82.1M
# CGroup: /system.slice/named.service
# └─838 /usr/sbin/named -f -u bind

Tips : 至此安装告一段落后面企业内部DNS服务搭建时再进行详细讲解;


(3) 脚本附录
systemd 服务:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 与此 unit 的解释、执行服务相依性有关
cat > /etc/systemd/system/named.service <<'EOF'
[Unit]
Description=bind9 DNS monitor maneger
Documentation=https://www.isc.org/bind/
After=network.target

[Service]
Type=simple
StandardError=journal
WorkingDirectory=/etc/bind/
ExecStart=/usr/local/bind/sbin/named -u named -c /etc/bind/named.conf
ExecStop=/bin/kill -INT $MAINPID
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=always
RestartSec=3s

[Install]
WantedBy=multi-user.target
Alias=named.service
EOF

描述:因为是一个服务、所以我们要为他提供一个服务脚本、以后可以利用脚本启动、编辑/etc/init.d/bindnamed

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
#!/bin/bash
# Ubuntu 20.04 TLS
# description: named daemon
# chkconfig: - 25 88

namedFile="/usr/local/bind/sbin/named"
pidFile="/var/run/named/named.pid"
lockFile="/var/lock/subsys/named"
confFile="/etc/bind/named.conf"
pid=$(pidof ${namedFile})

# - 启动
start() {
if [ -e $lockFile ]; then
echo "named is already running..."
exit 0
fi
echo -n "Starting named:"
${namedFile} -u named -c "${confFile}"
RETVAL=$?
echo " Pid = $(pidof named)"
if [ $RETVAL -eq 0 ]; then
touch $lockFile $lockFile
return $RETVAL
else
rm -f $lockFile $pidFile
return 1
fi
}

# - 停止
stop() {
if [ ! -e $lockFile ]; then
echo "named is stopped."
fi
echo -n "Stopping named:"
# 使用脚本实现killproc的功能
# ps - | grep named | {
# while read pid tty time cmd;
# do
# echo -n "Killing $cmd with PID = $pid"
# kill -INT $pid
# done
# }
if [ -n "$pid" ];then
kill -INT $pid
RETVAL=$?
fi
echo
if [ $RETVAL -eq 0 ];then
rm -f $lockFile $pidFile
return 0
else
echo "Cannot stop named."
return 1
fi
}

# - 重启
restart() {
stop
sleep 2
start
}

# - 重载
reload() {
echo -n "Reloading named: "
if [ -n "$pid" ];then
kill -HUP $pid
fi
RETVAL=$?
echo
return $RETVAL
}

status() {
if [ -n "$pid" ];then
echo -n "named is running...($pid) "
echo
else
echo -n "named is stopped..."
echo
fi
}

usage() {
echo "Usage: named {start|stop|restart|status|reload}"
}

case $1 in
start)
start ;;
stop)
stop ;;
restart)
restart ;;
status)
status ;;
reload)
reload ;;
*)
usage
exit 4 ;;
esac

操作流程:

1
2
chmod 755 /etc/init.d/named
chkconfig named on && chkconfig --list named


(3) 入坑解决

  • 问题1.error: Python >= 2.7 or >= 3.2 and the PLY package are required for dnssec-keymgr and other Python-based tools.
    错误信息:
    1
    2
    configure: error: Python >= 2.7 or >= 3.2 and the PLY package are required for dnssec-keymgr and other Python-based tools. PLY may be available from your OS package manager as python-ply or python3-ply; it can also be installed via pip. To build without Python/PLY, use --without-python.
    配置:错误:Python >= 2.7或>= 3.2和PLY包是需要的dnssec-keymgr和其他基于Python的工具。PLY可以从你的OS包管理器作为pythonply或python3 PLY可用;也可以通过pip进行安装。如果不使用Python/PLY进行构建,请使用——不使用Python。
    解决办法:
    1
    2
    apt install python3-pip
    pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple ply


问题2.error: OpenSSL/LibreSSL not found

1
2
3
checking whether compiling and linking against OpenSSL works... no
configure: error: in '/usr/local/bind-9.16.9':
configure: error: OpenSSL/LibreSSL not found

解决办法:

1
2
3
4
5
6
#是OpenSSL 加密库(lib), 这个库需要openssl-devel包 ,在ubuntu中就是 libssl-dev 
#RedHat Fedora 平台
yum -y install openssl-devel

# Debian ,ubunu 平台
apt-get install libssl-dev


问题3.启动DNS由于权限问题导致监听错误isc_file_isplainfile 'data/named.run' failed: permission denied

  • 错误信息:
    1
    2
    3
    30-Nov-2020 21:41:25.073 checking logging configuration failed: permission denied
    30-Nov-2020 21:41:25.089 loading configuration: permission denied
    30-Nov-2020 21:41:25.089 exiting (due to fatal error)
  • 解决办法:
    1
    2
    chown named.named /etc/bind/rndc.key
    chown -R named.named /var/named/data

CentOS 安装

环境安装说明:

1
bind版本: bind-9.10.5-P3.tar.gz # http://www.isc.org/downloads/bind/

安装流程:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# (1) 时间同步以及检查一下安装环境所需要的开发包组、确保所依赖的开发包组
ntpdate ntp1.aliyun.com
yum -y groupinstall "Development Tools" && yum -y groupinstall "Server Platform Development"
yum grouplist # 查看一下、最主要两项:Development tools和Server Platform Development

# (2) 解压并编译
tar -zvxf bind-9.10.5-P3.tar.gz && cd bind-9.10.5-P3
./configure --prefix=/data/bind9 --sysconfdir=/etc/named --enable-threads --enable-epoll --with-openssl --disable-chroot
make && make install
# --prefix=/data/bind9:指定编译存放的路径
# --with-openssl : openssl的支持
# --sysconfdir=/etc/named:指定配置文件存放路径
# --enable-threads:启用了多线程的功能

# (3) 相关用户及其组的创建(-r选项系统用户不会给他创建家目录的)
groupadd -g 53 -r named
useradd -g named -r named


# (4) 创建对应的配置目录以及文件
mkdir -vp /etc/named/ && touch /etc/bind.conf
mkdir -vp /var/named
# 关键一定要保证能解析,否则无法forward转发那些NS(223.5.5.5或者8.8.8.8等)的解析,比如最后无法ping通www.baidu.com
dig -t NS . @8.8.8.8 > /var/named/named.ca

# (5) 配置文件编辑
vim /etc/named/named.conf


基于系统软件管理包进行安装使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# (1) 安装完BIND后系统会多一个用户named
yum -y install bind*

# (2) 启动DNS服务
systemctl start named.service && systemctl enable named.service

# (3) 验证服务是否正常
systemctl status named.service
netstat -an|grep :53

# (4) 防火墙开放TCP和UDP的53号端口:
iptables -I INPUT -p tcp --dport 53 -j ACCEPT
iptables -I INPUT -p udp --dport 53 -j ACCEPT

# (5) 配置全局文件或者区域文件
/etc/named.rfc1912.zones
cp -p /var/named/named.localhost /var/named/cise.weiyigeek.top.zone
/var/named/198.168.192.in-addr.arpa.zone

# (6) 在Linux下的DNS客户端的设置及测试配置/etc/resolv.conf文件。
domain cise.weiyigeek.top
search cise.weiyigeek.top
nameserver 192.168.10.154


Docker 容器

基础环境准备:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# 1.更新系统
sudo apt update && sudo apt upgrade -y

# 2.安装docker
curl -sSL https://get.daocloud.io/docker | sh

# 3.配置Docker使用国内镜像
sudo vim /etc/docker/daemon.json
{
"registry-mirrors": [
"https://hub-mirror.c.163.com",
"https://mirror.baidubce.com"
]
}

# 4.重启一下docker服务并检查是否配置成功
sudo systemctl restart docker
sudo docker info

# 5.容器安装DNS时建议系统的systemd-resolved服务(我没有关闭所以可能不会有影响)
# Ubuntu 20.04中默认启用的systemd-resolved服务会占用udp53端口, 如果导致bind服务无法正常启动所以要先禁用掉这个服务
sudo systemctl disable systemd-resolved
sudo systemctl stop systemd-resolved

# 6.禁用服务后还需要手动修改/etc/resolv.conf指定互联网DNS服务地址
sudo vim /etc/resolv.conf
# 修改下面行
nameserver 114.114.114.114


  • 方式1:internetsystemsconsortium/bind9:9.16
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    # (1) 权威DNS服务器在这里,您实际上需要在/etc/bind/name.conf和区域等中提供所需的配置(例如,这不是魔法,您必须配置它)。
    docker run \
    --name=bind9 \
    --restart=always \
    --publish 53:53/udp \
    --publish 53:53/tcp \
    --publish 127.0.0.1:953:953/tcp \
    --volume /etc/bind \
    --volume /var/cache/bind \
    --volume /var/lib/bind \
    --volume /var/log \
    internetsystemsconsortium/bind9:9.16


    # (2) 配置说明
    Recursive DNS server # 递归DNS服务器不需要任何配置。
    Authoritative DNS server # 权威DNS服务器配置
    options {
    directory "/var/cache/bind";
    listen-on { 127.0.0.1; };
    listen-on-v6 { ::1; };
    allow-recursion {
    none;
    };
    allow-transfer {
    none;
    };
    allow-update {
    none;
    };
    };
    zone "example.com." {
    type primary;
    file "/var/lib/bind/db.example.com";
    notify explicit;
    };


  • 方式2: UI DNS 管理界面
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    # (1) 镜像拉取
    sudo docker pull sameersbn/bind:latest
    # ----内网环境导入----
    # 导出镜像为本地压缩包
    sudo docker save -o bind.tar sameersbn/bind:latest
    # 内网服务器可以导入上面的压缩包
    sudo docker load -i bind.tar


    # (2) 查看镜像信息
    docker images --all
    # REPOSITORY TAG IMAGE ID CREATED SIZE
    # sameersbn/bind latest 55516ab380dc 6 months ago 343MB


    # (3) 数据持久化目录创建
    mkdir -vp /app/bind/
    # mkdir: created directory '/app'
    # mkdir: created directory '/app/bind/'

    # (4) 服务启动
    sudo docker run --name='bind' -d -p 53:53/udp -p 10000:10000/tcp -e WEBMIN_ENABLED=true -v ~/bind:/app/bind/ sameersbn/bind:latest
    8348e2e7af96c2cbfcd9cab36c8651407cd91f94caf9195251269654e4eae045

    # (5) 分别检查bind服务的udp53端口和webmin管理服务的tcp10000端口是否正常启用
    ~$ ss -lnutp | grep -E ":53|:10000"
    # udp UNCONN 0 0 127.0.0.53%lo:53 0.0.0.0:* # systemd-resolved服务
    udp UNCONN 0 0 172.17.0.1:53 0.0.0.0:*
    udp UNCONN 0 0 192.168.12.253:53 0.0.0.0:*
    udp UNCONN 0 0 127.0.0.1:53 0.0.0.0:*
    udp UNCONN 0 0 172.17.0.1:53 0.0.0.0:*
    udp UNCONN 0 0 172.17.0.1:53 0.0.0.0:*
    udp UNCONN 0 0 172.17.0.1:53 0.0.0.0:*
    udp UNCONN 0 0 192.168.12.253:53 0.0.0.0:*
    udp UNCONN 0 0 192.168.12.253:53 0.0.0.0:*
    udp UNCONN 0 0 192.168.12.253:53 0.0.0.0:*
    udp UNCONN 0 0 127.0.0.1:53 0.0.0.0:*
    udp UNCONN 0 0 127.0.0.1:53 0.0.0.0:*
    udp UNCONN 0 0 127.0.0.1:53 0.0.0.0:*
    udp UNCONN 0 0 *:53 *:*
    udp UNCONN 0 0 [fe80::250:56ff:fe8a:cf24]%ens160:53 [::]:*
    udp UNCONN 0 0 [fe80::250:56ff:fe8a:cf24]%ens160:53 [::]:*
    udp UNCONN 0 0 [fe80::250:56ff:fe8a:cf24]%ens160:53 [::]:*
    udp UNCONN 0 0 [fe80::250:56ff:fe8a:cf24]%ens160:53 [::]:*
    # tcp LISTEN 0 4096 127.0.0.53%lo:53 0.0.0.0:* # systemd-resolved服务
    tcp LISTEN 0 10 172.17.0.1:53 0.0.0.0:*
    tcp LISTEN 0 10 192.168.12.253:53 0.0.0.0:*
    tcp LISTEN 0 10 127.0.0.1:53 0.0.0.0:*
    tcp LISTEN 0 4096 *:10000 *:*
    tcp LISTEN 0 10 [fe80::250:56ff:fe8a:cf24]%ens160:53 [::]:*


    # 此种方式已不能正常使用(已弃用)
    # docker network create -d macvlan --subnet=10.0.10.0/24 --gateway=10.0.10.1 -o parent=ens160 appnet
    # 其中enp0s3 就是目前宿主机IP对应的网络,接下来我们创建一个macvlan网络:
    # -d 驱动, 这里使用macvlan
    # --subnet,指定子网
    # --gateway,指定网关
    # parent,这里指定宿主机网卡名称
    # appnet,这是新创建的docker网络名称
    # docker network inspect appnet
    # docker run -dit --hostname bind --net=appnet --ip=10.0.10.1 --name bind --restart=always --volume /app/bind:/data sameersbn/bind:latest

WEB管理使用浏览器访问下面地址进行远程管理:https://服务器IP:10000, 默认登陆账号root,密码password

WeiyiGeek.Webmin

WeiyiGeek.Webmin

Tips: 小型企业中此种方式管理方便十分推荐。


0x03 Bind 配置解析

Bind9 官方语法参考: https://bind9.readthedocs.io/en/v9_16_13/reference.html?highlight=allow-query-cache#

1) 配置文件目录

Q: Bind9 相关文件信息说明?

  • 相关路径:/var/named/ 或者 /var/cache/named
  • 配置文件:/var/named/chroot/etc/named.conf 与 /etc/named.conf 或者 /etc/bind/named.conf
  • 后台进程:named
  • 控制脚本: /etc/rc.d/init.d/named 或者 /etc/init.d/named
  • 使用端口:53 (tcp,udp)

PS : 上述路径与Named编译选项、以及安装方式操作 系统有直接关联;

帮助文档:

1
2
3
4
5
6
7
8
9
10
/usr/local/bind/share/man# cp -r * /usr/local/share/man/
cp: -r not specified; omitting directory 'man1'
cp: -r not specified; omitting directory 'man5'
cp: -r not specified; omitting directory 'man8'

# named 运行
man named

# named 配置文件
man named.conf

Tips : Bind9 安装后其目录有一定的差异与安装方式以及操作系统有非常大的关系。例如Ubuntu安装的bind9:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
$ tree /etc/bind/
/etc/bind/
├── bind.keys
├── db.0
├── db.127
├── db.255
├── db.empty
├── db.local
├── named.conf # 主配置文件
├── named.conf.default-zones
├── named.conf.local
├── named.conf.options
├── rndc.key
└── zones.rfc1918

$ cat /etc/bind/named.conf
// This is the primary configuration file for the BIND DNS server named.
//
// Please read /usr/share/doc/bind9/README.Debian.gz for information on the
// structure of BIND configuration files in Debian, *BEFORE* you customize
// this configuration file.
//
// If you are just adding zones, please do that in /etc/bind/named.conf.local

include "/etc/bind/named.conf.options";
include "/etc/bind/named.conf.local";
include "/etc/bind/named.conf.default-zones";


2) 配置选项

Syntax 语法说明:

1
2
3
4
5
6
7
8
# (1) 严格注意语法书写(其格式非常严格)
# (2) 解析记录(例如A、CNAME包括但不限于)都是不允许折行书写
# (3) 单行记录开头不准许空格或者tab开头
# (4) 字符说明
# // 表示注销掉系统默认配置的zone信息所有行
# ; 表示注释
# @ 表示当前域名它是DNS记录中的保留字
# $ 表示定义变量


Tips: named.conf 默认选项值及参数一览

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/usr/local/bind-9.16.9# bin/tests/cfg_test --named --grammar | more
# options {
# answer-cookie <boolean>;
# automatic-interface-scan <boolean>;
# avoid-v4-udp-ports { <portrange>; ... };
# avoid-v6-udp-ports { <portrange>; ... };
# bindkeys-file <quoted_string>;
# blackhole { <address_match_element>; ... };
# cookie-algorithm ( aes | siphash24 );
# cookie-secret <string>; // may occur multiple times
# coresize ( default | unlimited | <sizeval> );
# ....
# }

# 例如: dnssec-validation 验证
/usr/local/bind-9.16.9/bin/tests/cfg_test --named --grammar | grep "dnssec-validation"
dnssec-validation ( yes | no | auto );


Tips : 在 /etc/named.conf 配置文件中包括 options(全局参数)、zone(区域定义)、access control lists(访问控制列表)、Key(rndc 安全加解密钥)、logging(日志记录)等主要选项

访问限制常用字句语句说明: 格式子句 语句 说明

  • allow-query options,zone 指定哪主机或网络可以查询本服务器或区,默认的是允许所有主机进行查询。
  • allow-transfer options,zone 指定哪些主机允许和本地服务器进行域传输(定允许复制zone数据的主机-主从必备),默认值是允许和所有主机进行域传输。
  • allow-recursion options 指定哪些主机可以进行递归查询。如果没有设定,缺省是允许所有主机进行递归查询的。注意禁止一台主机的递归查询,并不能阻止这台主机查询已经存在于服务器缓存中的数据。
  • allow-update zone 指定哪些主机允许为主域名服务器提交动态 DNS 更新。默认为拒绝任何主机进行更新。
  • blackhole options 指定不接收来自哪些主机的查询请求和地址解析。默认值是 none 。


日志的常用字句语句说明: 术语 含义

  • channel(通道) 日志输出方式,如:syslog、文本文件、标准错误输出或 /dev/null
  • category(类别) 日志的消息类别,如:查询消息或动态更新消息等
  • module(模块) 产生消息的来源模块名称
  • facility(设备) syslog 设备名
  • severity(严重性) 消息的严重性等级


配置参数:

  • 1.ACL(访问控制) : 访问控制列表(ACL)就是一个被命名的地址匹配列表, 使用访问控制列表可以使配置简单而清晰,一次定义之后可以在多处使用,不会使配置文件因为大量的 IP 地址而变得混乱。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    # Tips : acl 是 named.conf 中的顶级语句,不能将其嵌入其他的语句。并且定义访问控制列表的 acl 语句应该位于 options 语句之前。
    # Tips : 为了便于维护管理员定义的访问控制列表,可以将所有定义 acl 的语句存放在单独的文件 /etc/bind/named.conf.acls 中。可以在主配置文件 /etc/bind/named.conf 中如下语句 include "/etc/bind/named.conf.options" 之前添加如下的配置行include "/etc/bind/named.conf.acls";

    # acl 语句语法
    acl "acl_name" {
    address_match_list;
    };

    # acl 使用基础示例
    acl "acl_name" {
    localhosts;
    10.0.0.0/8;
    172.16.0.0/12;
    };


    # 阈值参数: 默认预定义了 4 个名称的地址匹配列表
    * any : 所有主机
    * localhost : 本机
    * localnets : 本地网络上的所有主机
    * none : 不匹配任何主机
  • 2.options(全局参数)

    1
    2
    3
    4
    5
    6
    # 1.ACL使用举例限制查询
    # - 假如要限制只有 202.0.0.0/8 和 221.0.0.0/8 查询本地服务器的所有区信息需在 options 语句里使用 allow-query 子句
    allow-query { 202.0.0.0/8; 221.0.0.0/8; };

    # - 使用定义的 acl_name 限制允许查询的主机列表
    allow-query { aqlist; };
  • 3.zone(区域定义)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    zone "example.com" {
    type master;
    file "example.com.hosts";
    # 1.ACL使用举例限制查询
    # 假如要限制只有 221.3.131.5 和 221.3.131.6 可以从本地服务器传输 “example.com” 的区信息 在 zone 语句里使用 allow-transfer 子句
    allow-transfer { 221.3.131.5; 221.3.131.6; };
    # 使用定义的 acl_name 限制允许进行域传输的主机列表
    allow-transfer { aqlist; };
    };
  • 4.Key (rndc 安全加解密钥)

  • 5.View (分离内外服务器配置) : 许多站点希望 DNS 对于内网访问和外网(Internet)访问看起来不一样,这种类型的配置称为”分离 DNS (Split DNS)“; 对内网用户公开整个区的所有主机而对 Internet 用户只公开几台主机,如 www 服务器等对内外用户指定不同的 RR,或对内网用户提供更多的 RR可以在内网使用 RFC 1918 中定义的私有地址

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    # view 语句语法
    view view_name {
    match-clients { address_match_list }; # 它用于指定谁能看到本 view
    [ view_option; ...]
    zone_statement; ...
    };

    # 简单示例
    view "internal" {
    match-clients { our-nets; }; ; 匹配内网客户的访问
    recursion yes; ; 对内网客户允许执行递归查询
    zone "example.com" { ; 定义内网客户可见的区声明
    type master;
    file "example.com.hosts.internal";
    };
    };

    view "external" {
    match-clients { any; }; ; 匹配 Internet 客户的访问
    recursion no; ; 对 Internet 客户不允许执行递归查询
    zone "example.com" { ; 定义 Internet 客户可见的区声明
    type master;
    file "example.com.hosts.external";
    };
    };
  • 6.logging (日志记录) : 在默认情况下BIND9 把日志消息写到 /var/log/messages 文件中,而这些日志消息是非常少的,主要就是启动,关闭的日志记录和一些严重错误的消息;而将调试日志信息写入 BIND 服务器工作目录中的 named.run 文件。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    # 语法
    logging {
    channel channel_name { // 定义通道
    file log_file [versions number | unlimited] [size sizespec]; | null; | stderr;
    # * file : 输出到纯文本文件
    # * log_file 指定一个文件名
    # * version 指定允许同时存在多少个版本的该文件,比如指定 3 个版本(version 3),就会保存 query.log、query.log0、query.log1 和query.log2。
    # * size 指定文件大小的上限,如果只设定了size 而没有设定 version,当文件达到指定的文件大小上限时,服务器停止写入该文件。如果设定了version,服务器会进行循环,如把 log_file 变成 log_file.log1,log_file.log1 变成 log_file.log2 等,然后建立一个新的 log_file.log 进行写入。

    syslog optional_facility; # 输出到 syslog,
    # optional_facility 是 syslog 的设备名可选值
    # * daemon
    # * local0 到 local7
    # * null :输出到空设备
    # * stderr :输出到标准错误输出,默认为屏幕


    severity log_severity; // 定义消息严重性 & 定义输出方式
    # * log_severity 的取值为(按照严重性递减的顺序):
    # * critical
    # * error
    # * warning
    # * notice
    # * info
    # * debug [ level ]

    [print-time boolean;] // 是否在消息中添加时间前缀,仅用于 file 日志
    [print-severity boolean;] // 是否在消息中添加消息严重性前缀
    [print-category boolean;] // 是否在消息中添加消息类别名前缀
    };

    category category_name { // 定义类别
    channel_name;
    ......
    };
    # category 语句是指定哪一种类别的信息使用哪个或者哪几个已经定义了的通道输出。
    # 类别 说明
    # client 处理客户端请求。
    # config 配置文件分析和处理。
    # database 同BIND内部数据库相关的消息,用来存储区数据和缓存记录。
    # default 匹配所有未明确指定通道的类别。
    # dnssec 处理 DNSSEC 签名的响应。
    # general 包括所有未明确分类的 BIND 消息。
    # lame-servers 发现错误授权,即残缺服务器。
    # network 网络操作。
    # notify 区更新通知消息。
    # queries 查询日志
    # resolver 名字解析,包括对来自解析器的递归查询信息。
    # security 批准/非批准的请求。
    # update 动态更新事件。
    # xfer-in 从远程名字服务器到本地名字服务器的区传送。
    # xfer-out 从本地名字服务器到远程名字服务器的区传送。
    };

    # 示例1.BIND 9 预制了如下四个默认通道
    channel "default_syslog" {
    syslog daemon; // 发送给 syslog 的 daemon 设备
    severity info; // 只发送此 info 及其更高优先级的信息
    };
    channel "default_debug" { // 只有当服务器的 debug 级别非 0 时,才产生输出。
    file "named.run"; // 写入工作目录下的 named.run 文件
    severity dynamic; // 按照服务器当前的debug 级别记录日志
    };
    channel "default_stderr" {
    stderr; // 写到stderr
    severity info; // 只发送此 info 及其更高优先级的信息
    };
    channel "null" {
    null; // 丢弃所有发到此通道的信息
    };

    # 示例2.Bind9 默认配置
    logging {
    ; # 通道1
    channel default_debug {
    file "data/named.run";
    severity dynamic;
    };
    ; # 通道2
    channel query_log {
    file "data/query.log." versions 5 size 50m;
    print-time yes;
    severity info;
    };
    category queries { query_log;};
    };

    # 示例3.例如要记录查询消息可以在 named.conf 中添加如下配置:
    logging {
    channel query_log {
    file "query.log" versions 3 size 20m;
    severity info;
    print-time yes;
    print-category yes;
    };
    category queries {
    query_log;
    };
    };

    Tips : 它会在工作目录(directory 语句所指定的目录,Ubuntu 为 `/var/cache/bind` )下创建 query.log 文件,并把运行过程产生的 queries 消息写如到此文件中。


常用参数

1
2
3
* forwarders:指定其上级域名服务器
* allow-query:指定允许向其提交请求的客户
* allow-transfer:指定允许传输


主配置文件 /etc/named.conf 解析说明

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
# (0) 访问限制,防止欺骗和拒绝服务攻击
# 为了防止欺骗和拒绝服务攻击,对于 Internet 上的每个 DNS 服务器至少应该有一个假地址的 ACL 和一个本地地址的 ACL。
# Tips : 是企业自建的DNS对外网子公司提供DNS解析的场景
# // 创建一个名称为 "bogusnets" 的 ACL 来阻止经常用于欺骗性攻击的(RFC1918)地址空间
acl bogusnets {
0.0.0.0/8;
1.0.0.0/8;
2.0.0.0/8;
169.254.0.0/16;
192.0.2.0/24;
224.0.0.0/3;
10.0.0.0/8;
172.16.0.0/12;
192.168.0.0/16;
};
# //创建一个名称为 "our-nets" 的 ACL,并将其配置为实际本网的 IP 地址段。
acl our-nets { # 用您的网络地址替换下面的地址列表
x.x.x.x/24;
x.x.x.x/21;
};

# (1) 全局配置
# * options 整个Bind使用的全局选项
options {
listen-on port 53 { 127.0.0.1; }; # 监听端口,修改成自己的IP地址,如果有多个IP,就写多个,也可以写any,每行要以;结束。
listen-on-v6 port 53 { any; };
directory "/var/named"; # 指定zone file的存放位置,/var/named 是相对目录它在chroot环境下/var/named 目录下。
dump-file "/var/named/data/cache_dump.db";
statistics-file "/var/named/data/named_stats.txt";
memstatistics-file "/var/named/data/named_mem_stats.txt";
allow-query { localhost;our-nets; }; # 允许查询任何client查询此处改成 any
allow-recursion { localhost;our-nets; };
blackhole { bogusnets; }; # 不接收来自哪些主机的查询请求和地址解析 默认是none
recursion yes;
forward only; # only | first
forwarders { 223.6.6.6;223.5.5.5; } # 指定其上级域名服务器

}


# (2) 日志配置
# - 日志记录
logging {
channel default_debug {
file "data/named.run";
severity dynamic;
};
channel query_log {
file "data/query.log." versions 5 size 50m;
print-time yes;
severity info;
};
category queries { query_log;};
};



# (3) 区域配置
# zone 语句作用是定义DNS 区域,在此语句中可定义DNS 区域选项
# zone区域设置,第一步,设置根区域当DNS服务器处理递归查询时,如果本地区域文件不能进行查询的解析,就会转到根DNS服务器查询,所以在主配置文件named.conf文件中还要定义根区域。 (默认即可)
# 使用根服务器的知识来启动服务器
zone "." {
type hint; # 根的类型是hint
file "/usr/share/dns/root.hints"; # 根区域文件
};

# (4) 正向解析配置常规配置
zone "weiyigeek.top" IN {
tyep master;
file "weiyigeek.top.zone"
allow-update {
none;
};
}

# 将范例及其源文件属性一起复制到正向解析文件
cp -p /var/named/named.localhost /var/named/weiyigeek.top.zone

# /var/named/weiyigeek.top.zone
$TTL 1D
@ IN SOA dns.weiyigeek.top (
0 ; serial - 序列号
1D ; refresh - 刷新
1H ; retry - 重试
1W ; expire - 过期
3H) ; minimum - 最小值

@ IN NS dns.weiyigeek.com.
dns IN A 192.168.1.2
www IN A 192.168.1.3

# 关键字说明:
TTL : 存活时间
NS :设置域名服务器的域名name server
IN 是internet记录
SOA 记录 @ 取代在/etc/named.conf中指定的域名其中中的数字分别为:序列号、刷新、重试、过期、生存期
* 序列号:序列号用于DNS数据库文件的版本控制,每当数据被改变,这个序列号就应该被增加
* 刷新:从服务器向主服务器查询最新数据的间隔周期。每一次检查时从服务器的数据是否需要更改,则根据序列号来判别
* 重试:一旦从服务器尝试连接主服务器失败,下一次查询主服务器的延迟时间
* 过期:如果从服务器无法连通主服务器,则在经过此时间后,宣告其数据过期
* 生存期:服务器回答 '无此域名' 的间隔时间
* 数字的默认单位为秒,否则:D= 日、H= 小时、W= 周、M= 分钟


3) 基础配置示例

示例1.采用Bind建立一个A记录DNS服务器

WeiyiGeek.示例1需求一览

WeiyiGeek.示例1需求一览

配置示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 全局配置文件
$ vim /etc/named.conf
options {
directory "/var/named";
};
zone "imooc.com" IN {
type master;
file "imooc.com.zone";
};

# 指定的 zone 区域文件配置
$ vim /var/named/imooc.com.zone
$TTL 7200
imooc.com. IN SOA imooc.com. jeson.imooc.com. (222 1H 15M 1W 1D) # 注意邮箱的@的符用.代替,@在这里表示所有域名起始记录的解析. # 主从里面的同步参数 (222 1H 15M 1W 1D)
imooc.com. IN NS dns1.imooc.com. # 内部的DNS域名解析器
dns1.imooc.com. IN A 192.168.205.131 # 在A记录中的二级域可以忽略不写,直接dns1
www.imooc.com. IN A 2.2.2.2 # authority section 权威部分

补充:重启服务如有报错请使用以下命令查看tail -f /var/log/messages
PS : 访问测试软件 dig 或者 nslookup

WeiyiGeek.A记录效果

WeiyiGeek.A记录效果


示例2.采用Bind建立一个CNAME记录DNS服务器

WeiyiGeek.示例2需求一览

WeiyiGeek.示例2需求一览

配置示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# named.conf 配置
zone "iaskjob.com"{
type master;
file "iaskjob.com.zone";
};

# 修改上面/var/named/imooc.com.zone文件将www的A记录IP地址替换成imooc的IP地址;
www.imooc.com. IN A 119.28.48.218

$ vim /var/named/iaskjob.com.zone
$TTL 7200
iaskjob.com. IN SOA isakjob.com. iaskjob.163.com. (4012100 1H 15M 1W 1D)
iaskjob.com. IN NS dns1.iaskjob.com.
dns1.iaskjob.com. IN A 192.168.199.202 # DNS 服务器地址
imooc.iaskjob.com. IN CNAME www.imooc.com. # CNAME 别名记录

WeiyiGeek.CNAME记录效果

WeiyiGeek.CNAME记录效果


示例3.采用Bind建立一个正向/反向解析DNS服务器

Q: 什么是正向与反向解析?

正向解析 : 即通过域名查找IP ,例如 A记录
反向解析 : 即通过IP查询对应的域名 ,例如 PTR 记录

正向解析(与上面的A记录配置差异不大)

1
2
3
4
5
6
7
8
9
10
11
12
13
# named.conf
zone "imooc.com" IN {
type master;
file "imooc.com.zone";
};

# imooc.com.zone
$TTL 7200
imooc.com. IN SOA imooc.com. jeson.imooc.com. ( 222 1H 15M 1W 1D # jeson.imooc.com.其实为邮箱地址:jeson@imooc.com.
imooc.com. IN NS dns1.imooc.com.
dns1.imooc.com. IN A 172.16.102.14
@ IN MX 10 mail # 邮箱mx解析,总是需要A记录的配合 10为优先级
mail IN A 172.16.102.14 # 内网地址为DNS服务主机的地址

测试:dig @172.16.102.14 mail.imooc.com

WeiyiGeek.正向解析

WeiyiGeek.正向解析


反向解析(重点)

1
2
3
4
5
6
7
8
9
10
11
12
zone "102.16.172.in-addr.arpa" IN {
type master;
file "102.16.172.zone";
};

# /var/named/102.16.172.zone
$TTL 3600
# SOA起始记录解析,@代172.16.102这个段的主机
@ IN SOA 102.16.172.in-addr.arpa iaskjob.163.com. ( 2016012200 1H 15M 1W 1D )
@ IN NS dns1.imooc.com.
14 IN PTR dns1.imooc.com. # 表示 102.16.172.14 指向 dns.imooc.com
116 IN PTR mail.imooc.com. # 表示 102.16.172.116 指向 mail.imooc.com

测试: dig -x (反向解析使用) 172.16.102.116(在102.x这个段的主机) @172.16.102.14 (DNS服务主机)

WeiyiGeek.反向解析

WeiyiGeek.反向解析


总结:

  • (1) 逆向解析域in-addr.arpa的书写格式而反向解析常常用于邮件服务的域名解析;
  • (2) 需要非常注意zone解析内容文件的权限必须要named用户可读取的;


示例4.DNS递归迭代查询

描述: 对于客户端来说发起一次请求、而服务端发起多次请求,示意图如下;

WeiyiGeek.DNS递归迭代查询

WeiyiGeek.DNS递归迭代查询

关键参数:

1
2
3
- recursion : yes | no : 是否允许递归请求;
- allow-recursion : { address_match_list } | any | none : 允许递归请求范围;
- recursive-clients : number : 客户端执行递归请求数量

关键配置:

1
2
3
4
5
6
options {
directory "/var/named";
recursion yes;
recursive-clients 1024;
allow-recursion any;
}

Tips: 测试关闭递归查询

1
2
3
4
5
6
7
8
9
10
$ vim /etc/named.conf 
options {
directory "/var/named";
recursion no; # recursion 参数 yes 启用 / no 不启用
}


# (1) 进行查询并没能查询得到并且显示
# ;; WARNING: recursion requested but not available
dig @192.168.12.22 www.weiyigeek.top


  • 基础示例5.DNS子域授权
    描述: NS记录常常用于DNS子域授权以及迭代查询,示例图如下所示;
WeiyiGeek.DNS子域

WeiyiGeek.DNS子域

例如: A服务负责(imooc.com)域名解析,授权B服务器子域(test.imooc.com)的域名解析,而S记录到子域的DNS服务器上,在用A记录指向DNS服务器IP;

1
2
A服务器 : 父域   30.96.8.232
B服务器 : 子域 30.96.8.233

实践方式:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#- 将test.imooc指向B服务器
$ vim imooc.com.zone
test.imooc.com. IN NS ns1.test
ns1.test IN A 30.96.8.233

# - 在子域B服务器上进行设置 named.conf 以及 test.imooc.com.zone
$ vim named.conf
options {
directory "/var/named";
}

zone "test.imooc.com" {
type master;
file "test.imooc.com.zone"
}

$ vim test.imooc.com.zone
$TTL 7200
@ IN SOA test.imooc.com. (1001 1H 15M 1W 1D)
@ IN NS dns1
dns1 IN A 30.96.8.233
www IN A 119.254.210.200

在B服务器子域上进行dig查询:dig @30.96.8.233 www.test.imooc.com, 此处已将授权给了B服务器的子域;

PS : 但是imooc.com并没有授权所以还是父域的设置.


  • 基础示例6.DNS 转发
    描述: 通过DNS转发可以将负责某一个域的解析转发到另外一台DNS服务器上然后由其负责该域的权威解析,其示意图如下;
    WeiyiGeek.DNS转发示例图

    WeiyiGeek.DNS转发示例图

关键参数解析:

1
2
3
forwarders : {address_list}; : 转发的服务器列表
forwarder only : 只有目的服务器权限解析
forwarder first : 优先转发查询

DNS转发配置示例说明:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
master:10.156.11.232  #负责DNS某一个域进行转发
slave:10.156.11.233 #负责某一个域的权威解析

# (1) 配置Slave这台服务器的权威解析, 更改 named.conf 和 iaskjob.com.zone
zone "askjob.com" {
type master;
file "iaskjob.com.zone";
}

---
$TTL 7200
@ IN SOA iaskjob.com (222 1H 15M 1W 1D)
IN NS dns
dns IN A 30.96.8.233
www IN A 5.5.5.5


# (2) 配置Master这台服务器的DNS转发, 同样需要更改named.conf和iask job.com. zone
options{
directory "/var/named";
# forwarders {对应的IP;}; #这个是对应全局的
}

zone "iaskjob.com" {
type forward; # 转发 对应局部
forwarders {30.98.8.233;}; # 这个对应的是转发到哪一个DNS域转发器(forwarder的复数)

}

WeiyiGeek.DNS转发-SLAVE服务器返回

WeiyiGeek.DNS转发-SLAVE服务器返回

PS : 如果要使用DNS域转发必须是Bind 9以后的版本;
PS : 如果要实现DNS转发生效的话, 必须将递归查询设置为NO (Recursion No)


4) 进阶配置示例

实例1.DNS主从区域传输介绍与配置

描述: 主服务器和从服务器介绍,从服务器即使从主服务器接收到其区域数据的副本,也仍然可以从本地存储的区域数据权威地回答查询,而无需递归。从服务器是它们所从属区域的权威服务器。

在DNS中的区域分为正向区域与反向区域,而区域传输又分为全量区域传输AXFR 和 增量区域传输IXFR

WeiyiGeek.DNS主从同步原理

WeiyiGeek.DNS主从同步原理

Q: DNS主从同步配置相关注意问题?

1.确保防火墙规则开放(建议关闭)
2.确保目录权限(系统默认named用户)
3.确保主从服务器时钟一致
4.搭建完毕后如若修改了主服务器域配置其Serail number 必须递增;

配置流程

  • Step 1.Master / Slave 服务器配置
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    # Master
    zone "imooc.com" {
    type master; # 关键点
    notify yes; # 关键点 vt.通告,通知;公布
    also-notify {30.96.8.233}; # 关键点 从DNS服务器IP
    file "imooc.com.zone"
    }

    # Slave
    zone "imooc.com" {
    type slave; # 关键点
    also-notify {30.96.8.232}; # 关键点 主DNS服务器IP
    file "slaves/imooc.com.zone" # /var/named/slaves/imooc.com.zone
    }

Tips : 修改zone后需要对serial number进行递增相加,来给从DNS服务器表示我们修改过zone从而进行同步.

WeiyiGeek.主从同步配置

WeiyiGeek.主从同步配置


实例2.DNS区域传输限制

Q: 为什么需要做区域限制传输?

答: 为了服务器的安全以及保护应用信息的敏感性;

Q: DNS传送域漏洞的原理及其测试结果?

1
2
$ dig @127.0.0.1 www.imooc.com axfr       # 全量区域的数据传输
$ dig @127.0.0.1 www.imooc.com ixfr # 增量区域的数据传输

WeiyiGeek.DNS传送域漏洞

WeiyiGeek.DNS传送域漏洞

Q: 如何控制区域传输控制的方式?

方式1.基于主机的访问控制 (常用)
方式2.事物签名(稍微复杂一点)


(1)DNS区域传输限制基于主机访问控制实现
就是一句话指定主机访问

1
2
3
4
5
6
7
zone "weiyigeek.top" {
type master;
nofity yes;
also-notify { 30.96.8.233; }; # 从 DNS
allow-transfer { 30.96.8.233; } # 允许DNS与传输的机器IP地址列表
file "imooc.com.zone"
}


(2)DNS区域传输限制基于DNS加密传输
描述:我们复习一下信息加密机DES(对称加密-RSA)、IDEA(非对称加密-DES);

  • 1.DES : 文件加密和解密使用相关的密钥,其优点是简单、快捷;

    WeiyiGeek.DES

    WeiyiGeek.DES

  • 2.IDEA : 非对称加密其密钥报考公钥与私钥,其安全性较 DES 方式高(例如A方已经获取B方的公钥并采用其加密,到了B方其采用私钥解密);

    WeiyiGeek.

    WeiyiGeek.

Q: DNS 事物签名加密分类?

  • TSIG:对称加密 allow-transfer {key keyfile} 事务签名的key
  • SIG0:非对称加密 (IBM提出)

1)配置TSIG对称加密流程

  • Step 1.先在Master上进行公密匙的生成

    1
    2
    3
    4
    # 语法
    $ dnssec-keyge n-a HMAC-MD5 (加密方式) -b 128 (加密位数) -n HOST/ZONE (基于主机和域的方式) jeson.key (公密匙文件名)
    # .key 为公匙
    # .private 为密匙
    WeiyiGeek.dnssec-keyge

    WeiyiGeek.dnssec-keyge

  • Step 2.添加内容

    1
    2
    3
    4
    5
    6
    $ vim /var/named/chroot/etc/jeson-key
    # Add Body(添加内容):
    key "jeson-key" {
    Algorithm HMAC-MD5;
    secret [Dnssec-keygen生成的公匙] # 3Mc/XT........7IzYg==
    }
  • step 3.修改named.conf文件

    1
    2
    3
    4
    5
    6
    7
    8
    9
    include "/var/named/chroot/etc/jeson-key";   # 注意文件名
    zone "imooc.com" IN {
    type master;
    notify yes;
    also-notify {172.16.102.16;};
    allow-transfer { key "jeson-key";};
    file "imooc.com.zone";

    };

    此时MASTER设置完成;

    WeiyiGeek.Master-DNS

    WeiyiGeek.Master-DNS

  • Step 4.在Slave上进行密匙的配置

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    $ scp jeson-key (/var/named/chroot/etc/的文件) root@slave:`pwd`   #将公匙传入 SLAVE服务器中 `pwd` == /var/named/chroot/etc/

    # 配置 Named.conf
    options {
    directory "/var/named";
    }
    include "/var/named/chroot/etc/jeson-key"; # 注意文件名
    server 30.96.8.232 { # 主DNS服务器
    keys {"jeson-key"}
    }

    zone "weiyigeek.com" {
    type master;
    file "weiyigeek.com.zone"
    }

    zone "imooc.com" {
    type slave;
    masters {30.96.8.232;};
    file "slaves/imooc.com.zone"
    }
  • Step 5.验证搭建然后在Slave服务上看看新增加的wec域名的A记录,

    1
    2
    3
    Oct 30 13:15:59 localhost named[4860]: client 172.16.102.16#52942: transfer of 'imooc.com/IN': AXFR-style IXFR started: TSIG jeson-key
    Oct 30 13:15:59 localhost named[4860]: client 172.16.102.16#52942: transfer of 'imooc.com/IN': AXFR-style IXFR ended
    Oct 30 13:15:59 localhost named[4860]: client 172.16.102.16#54395: received notify for zone 'imooc.com': TSIG 'jeson-key'
WeiyiGeek.执行效果

WeiyiGeek.执行效果


实例3.DNS部分二级域名解析

实验目的: 实现部分二级域名的解析而非全域;

例如针对于 vcsa.weiyigeek.top 的解析:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 主配置 named.conf 文件:
zone "vcsa.weiyigeek.top" {
type master;
file "private/vcsa.weiyigeek.top.zone";
};


# 区域空间:
$ cat /var/named/private/vcsa.weiyigeek.top.zone
$TTL 7200
@ IN SOA ns.weiyigeek.top. root.weiyigeek.top. (
20201201
3600
1200
84600
1200
)
@ IN NS ns
ns IN A 192.168.12.253
@ 640 IN A 192.168.12.251
t 641 IN A 192.168.12.250
v 642 IN CNAME vcsa.weiyigeek.top.

验证配置与启动:

1
2
3
4
5
6
7
8
9
10
root@ubuntu-253:~# named-checkzone vcsa.weiyigeek.top /var/named/private/vcsa.weiyigeek.top.zone
# zone vcsa.weiyigeek.top/IN: loaded serial 20201201
# OK
root@ubuntu-253:~# named-checkconf

# Debug 启动信息查看
$ named -u named -g
# 01-Dec-2020 15:50:17.862 zone weiyigeek.top/IN: sending notifies (serial 20200711)
# 01-Dec-2020 15:50:17.862 zone vcsa.weiyigeek.top/IN: sending notifies (serial 20201201)
# 01-Dec-2020 15:50:17.862 zone 12.168.192.in-addr.arpa/IN: sending notifies (serial 20200712)

测试结果:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
# 子域名 NS 记录查看
$ dig ns vcsa.weiyigeek.top @192.168.12.253
# ;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 2
# ;; ANSWER SECTION:
# vcsa.weiyigeek.top. 7200 IN NS ns.vcsa.weiyigeek.top.
# ;; ADDITIONAL SECTION:
# ns.vcsa.weiyigeek.top. 7200 IN A 192.168.12.253


# 子域名 A 记录查看
$ dig vcsa.weiyigeek.top @192.168.12.253
# ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
# ;; ANSWER SECTION:
# vcsa.weiyigeek.top. 577 IN A 192.168.12.251
$ dig t.vcsa.weiyigeek.top @192.168.12.253
# ;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
# ;; ANSWER SECTION:
# t.vcsa.weiyigeek.top. 641 IN A 192.168.12.250


# 子域名 CNAME 记录查看
$ dig v.vcsa.weiyigeek.top @192.168.12.253
# ;; flags: qr aa rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1
# ;; ANSWER SECTION:
# v.vcsa.weiyigeek.top. 642 IN CNAME vcsa.weiyigeek.top.
# vcsa.weiyigeek.top. 640 IN A 192.168.12.251


# 其他子域名不影响访问
$ dig s.weiyigeek.top @192.168.12.253
# ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
# ;; ANSWER SECTION:
# s.weiyigeek.top. 282 IN A 21.129.126.213


0x04 DNS服务命令

named 命令

描述: named 是一个域名系统(DNS)服务器,ISC的BIND 9发行版的一部分。同时 named 可执行文件也是互联网域名服务器服务端配置命令。

有关DNS的更多信息,请参见RFC 1033、RFC 1034RFC 1035;

Syntax & Options:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# 语法
named [ [-4] | [-6] ] [-c config-file] [-d debug-level] [-D string] [-E engine-name] [-f] [-g] [-L logfile] [-M option] [-m flag] [-n #cpus] [-p port] [-s] [-S #max-socks] [-t directory] [-U #listeners] [-u user] [-v] [-V] [-X lock-file] [-x cache-file]

# 选项
-4 # 即使主机能够使用IPv6,也只能使用IPv4。-4和-6互斥。
-6 # 即使主机能够使用IPv4,也只能使用IPv6。-4和-6互斥。
-c config-file # 指定named.conf配置文件路径,如果不指定则默认为/etc/named.conf
-d debug-level # 将守护进程的调试级别设置为调试级别。随着调试级别的增加,已命名的调试跟踪会变得更加冗长。
-D string # 指定用于标识流程清单中named实例的字符串。不检查字符串的内容。
-E engine-name # 适用时,指定用于加密操作的硬件,如用于签名的安全密钥存储区。当使用OpenSSL PKCS#11支持构建BIND时,默认为字符串“pkcs11”,它标识可以驱动加密加速器的OpenSSL引擎或
-f # 在前台运行服务器(例如,不要守护进程)。
-g # 在前台运行服务器并强制将所有日志记录到stderr。
-L logfile # 默认情况下日志文件,而不是系统日志。
-M option # external(支持系统提供的内存分配功能规划设计) , fill(内存块将在分配或释放时被标记值填充,以帮助调试内存问题)
-m flag # 可能的标志有使用量、跟踪、记录、大小和mctx。
-n cpus # 如果没有指定,named将尝试确定当前的CPU数量,并为每个CPU创建一个线程。如果无法确定cpu的数量,将创建一个工作线程。
-p port # 监听端口默认53
-s # 在退出时将内存使用统计信息写入stdout。
-S # max-socks #(使用时需要注意)在使用默认配置选项构建的系统上,默认值是21000,在使用“configure——with-tuning=small”构建的系统上,默认值是4096。
-t directory # Chroot到目录后处理命令行参数,但在阅读配置文件之前。
-U #listeners # 如果未指定,则named将根据检测到的数目计算默认值CPU
-u user # 在完成特权操作(例如创建监听特权端口的套接字)后,将Setuid设置为用户。
-v # Report the version number and exit.
-V # Report the version number and build options, and exit.
-X lock-file # 有助于防止重复命名的实例同时运行。使用此选项(将覆盖name .conf中的锁文件选项。如果设置为none锁定文件检查将被禁用。
-x cache-file #将数据从缓存文件加载到默认视图的缓存中。(不建议使用此选项)

# SIGNALS 信号 (向服务器发送任何其他信号的结果是未定义的。)
SIGHUP Force a reload of the server.
SIGINT, SIGTERM Shut down the server.

依赖配置文件:

1
2
/etc/named.conf          # The default configuration file.
/var/run/named/named.pid # The default process-id file.


named-checkconf 命令

描述 : named-checkconf - named 配置文件语法检查工具即检查配置文件是否有语法错误

Tips : named-checkconf检查命名配置文件的语法,而不是语义。解析文件并检查语法错误,以及它包含的所有文件。如果未指定文件,则输入/etc/named.conf默认为读取。

语法参数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
named-checkconf [-chjlvz] [-p [-x ]] [-t directory] {filename}

OPTIONS
-h #Print the usage summary and exit.

-j # When loading a zonefile read the journal if it exists.

-l # List all the configured zones. Each line of output contains the zone name, class (e.g. IN), view, and type
(e.g. master or slave).

-c # Check "core" configuration only. This suppresses the loading of plugin modules, and causes all parameters to plugin statements to be ignored.

-i # Ignore warnings on deprecated options.

-p # Print out the named.conf and included files in canonical form if no errors were detected. See also the -x option.

-t directory #Chroot to directory so that include directives in the configuration file are processed as if run by a similarly chrooted named.

-v # Print the version of the named-checkconf program and exit.

-x # When printing the configuration files in canonical form, obscure shared secrets by replacing them with strings of question marks ('?'). This allows the contents of named.conf and related files to be shared — for example, when submitting bug reports — without compromising private data. This option cannot be used without -p.

-z # Perform a test load of all master zones found in named.conf.

filename #The name of the configuration file to be checked. If not specified, it defaults to /etc/named.conf.

基础示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
# (0) 常规测试named.conf进行配置
/etc/bind$ named-checkconf /etc/bind/named.conf

# (1) 对named.conf中找到的所有主区域执行测试负载。
$ named-checkconf -z /etc/bind/named.conf
# zone weiyigeek.cn/IN: loaded serial 3
# zone weiyigeek.top/IN: loaded serial 2
# zone 168.192.in-addr.arpa/IN: loaded serial 4
# zone 12.168.192.in-addr.arpa/IN: loaded serial 1
# zone localhost/IN: loaded serial 2
# zone 127.in-addr.arpa/IN: loaded serial 1
# zone 0.in-addr.arpa/IN: loaded serial 1
# zone 255.in-addr.arpa/IN: loaded serial 1


# (2) named以及包含文件配置文件无错误则输出所有配置参数项
$ named-checkconf -p
acl "trusted" {
"localhost";
10.0.0.0/8;
192.168.0.0/16;
172.16.0.0/16;
};
options {
directory "/var/cache/bind";
listen-on-v6 {
"any";
};
allow-query-cache {
"any";
};
auth-nxdomain no;
dnssec-validation no;
allow-query {
"any";
};
forwarders {
223.6.6.6;
223.5.5.5;
114.114.114.114;
};
};
zone "weiyigeek.cn" {
type master;
file "db.weiyigeek.cn";
allow-transfer {
trusted;
};
};
zone "weiyigeek.top" {
type master;
file "db.weiyigeek.top";
allow-transfer {
trusted;
};
};
zone "168.192.in-addr.arpa" {
type master;
file "db.168.192";
allow-transfer {
trusted;
};
};
zone "12.168.192.in-addr.arpa" {
type master;
file "db.12.168.192";
allow-transfer {
trusted;
};
};
zone "." {
type hint;
file "/usr/share/dns/root.hints";
};
zone "localhost" {
type master;
file "/etc/bind/db.local";
};
zone "127.in-addr.arpa" {
type master;
file "/etc/bind/db.127";
};
zone "0.in-addr.arpa" {
type master;
file "/etc/bind/db.0";
};
zone "255.in-addr.arpa" {
type master;
file "/etc/bind/db.255";
};


named-checkzone 命令

named-compilezone 命令

描述: named-checkzone, named-compilezone - zone文件有效性检查或转换工具

  • named-checkzone 检查区域文件的语法和完整性。它执行与named相同的检查
    加载区。这使得named-checkzone在将区域文件配置为名称之前检查它们非常有用
    服务器。
  • named-compilezone 与前者类似,但它总是将区域内容转储到指定的文件中指定的格式。此外,它在默认情况下应用更严格的检查级别,因为转储输出将为作为一个实际的区域文件,由named加载。手动指定时,检查级别必须至少与指定的配置文件中指定的一样严格。


语法参数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
# 语法
named-checkzone [-d] [-h] [-j] [-q] [-v] [-c class] [-f format] [-F format] [-J filename] [-i mode] [-k mode]
[-m mode] [-M mode] [-n mode] [-l ttl] [-L serial] [-o filename] [-r mode] [-s style]
[-S mode] [-t directory] [-T mode] [-w directory] [-D] [-W mode] {zonename} {filename}

named-compilezone [-d] [-j] [-q] [-v] [-c class] [-C mode] [-f format] [-F format] [-J filename] [-i mode]
[-k mode] [-m mode] [-n mode] [-l ttl] [-L serial] [-r mode] [-s style] [-t directory]
[-T mode] [-w directory] [-D] [-W mode] {-o filename} {zonename} {filename}

# 参数
OPTIONS
-d
Enable debugging.

-h
Print the usage summary and exit.

-q
Quiet mode - exit code only.

-v
Print the version of the named-checkzone program and exit.

-j
When loading a zone file, read the journal if it exists. The journal file name is assumed to be the zonefile name appended with the string .jnl.

-J filename
When loading the zone file read the journal from the given file, if it exists. (Implies -j.)

-c class
Specify the class of the zone. If not specified, "IN" is assumed.

-i mode
Perform post-load zone integrity checks. Possible modes are "full" (default), "full-sibling", "local",
"local-sibling" and "none".

Mode "full" checks that MX records refer to A or AAAA record (both in-zone and out-of-zone hostnames).
Mode "local" only checks MX records which refer to in-zone hostnames.

Mode "full" checks that SRV records refer to A or AAAA record (both in-zone and out-of-zone hostnames).
Mode "local" only checks SRV records which refer to in-zone hostnames.

Mode "full" checks that delegation NS records refer to A or AAAA record (both in-zone and out-of-zone
hostnames). It also checks that glue address records in the zone match those advertised by the child. Mode
"local" only checks NS records which refer to in-zone hostnames or that some required glue exists, that is
when the nameserver is in a child zone.

Mode "full-sibling" and "local-sibling" disable sibling glue checks but are otherwise the same as "full"
and "local" respectively.

Mode "none" disables the checks.

-f format
Specify the format of the zone file. Possible formats are "text" (default), "raw", and "map".

-F format
Specify the format of the output file specified. For named-checkzone, this does not cause any effects
unless it dumps the zone contents.

Possible formats are "text" (default), which is the standard textual representation of the zone, and
"map", "raw", and "raw=N", which store the zone in a binary format for rapid loading by named. "raw=N"
specifies the format version of the raw zone file: if N is 0, the raw file can be read by any version of
named; if N is 1, the file can be read by release 9.9.0 or higher; the default is 1.
-l ttl
Sets a maximum permissible TTL for the input file. Any record with a TTL higher than this value will cause
the zone to be rejected. This is similar to using the max-zone-ttl option in named.conf.

-L serial
When compiling a zone to "raw" or "map" format, set the "source serial" value in the header to the
specified serial number. (This is expected to be used primarily for testing purposes.)

-m mode
Specify whether MX records should be checked to see if they are addresses. Possible modes are "fail",
"warn" (default) and "ignore".

-M mode
Check if a MX record refers to a CNAME. Possible modes are "fail", "warn" (default) and "ignore".

-n mode
Specify whether NS records should be checked to see if they are addresses. Possible modes are "fail"
(default for named-compilezone), "warn" (default for named-checkzone) and "ignore".

-o filename
Write zone output to filename. If filename is - then write to standard out. This is mandatory for
named-compilezone.

-r mode
Check for records that are treated as different by DNSSEC but are semantically equal in plain DNS. Possible modes are "fail", "warn" (default) and "ignore".

-s style
Specify the style of the dumped zone file. Possible styles are "full" (default) and "relative". The full
format is most suitable for processing automatically by a separate script. On the other hand, the relative
format is more human-readable and is thus suitable for editing by hand. For named-checkzone this does not
cause any effects unless it dumps the zone contents. It also does not have any meaning if the output
format is not text.

-S mode
Check if a SRV record refers to a CNAME. Possible modes are "fail", "warn" (default) and "ignore".

-t directory
Chroot to directory so that include directives in the configuration file are processed as if run by a
similarly chrooted named.

-T mode
Check if Sender Policy Framework (SPF) records exist and issues a warning if an SPF-formatted TXT record
is not also present. Possible modes are "warn" (default), "ignore".

-w directory
chdir to directory so that relative filenames in master file $INCLUDE directives work. This is similar to
the directory clause in named.conf.

-D
Dump zone file in canonical format. This is always enabled for named-compilezone.

-W mode
Specify whether to check for non-terminal wildcards. Non-terminal wildcards are almost always the result
of a failure to understand the wildcard matching algorithm (RFC 1034). Possible modes are "warn" (default)
and "ignore".

基础示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# (1) 对区域文件/var/cache/bind/db.weiyigeek.top进行有效性检查和转换。
~# named-checkzone db.weiyigeek.top /var/cache/bind/db.weiyigeek.top
zone db.weiyigeek.top/IN: loaded serial 2
OK

# (2) named-compilezone 编译 zone 会对 zone 文件做一个备份
$ named-compilezone -o test.zone db.12.168.192 /var/cache/bind/db.12.168.192
# zone db.12.168.192/IN: loaded serial 1
# dump zone to test.zone...done
# OK
$ /var/cache/bind# cat test.zone
# db.12.168.192. 604800 IN SOA weiyigeek.top. admin.weiyigeek.top. 1 604800 86400 2419200 604800
# db.12.168.192. 604800 IN NS ns1.weiyigeek.top.
# db.12.168.192. 604800 IN NS ns2.weiyigeek.top.
# 13.db.12.168.192. 604800 IN PTR s.weiyigeek.top.
# 18.db.12.168.192. 604800 IN PTR www.weiyigeek.top.
# 254.db.12.168.192. 604800 IN PTR ns1.weiyigeek.top.


tsig-keygen 命令

描述: ddns-confgen - TSIG密钥生成工具, TSIG -keygen 和 ddns-confgen 是用于生成用于TSIG签名的密钥的实用程序的调用方法。例如,生成的密钥可以用于保护对区域的动态DNS更新,或者用于rndc命令通道。

  • 使用tsig-keygen命令时,可以在命令行中指定一个域名作为生成密钥的名称。如果未指定名称,则缺省值为“tsig-key”。
  • 当使用ddns-confgen命令时,可以使用-k参数指定密钥名,默认为ddns-key。生成的密钥附带配置文本和指令,可以与nsupdate一起使用,并在设置动态DNS时进行命名,包括一个示例update-policy语句。(此用法类似于用于设置命令通道安全性的rndc-confgen命令。)

Tips : named本身可以配置一个本地DDNS key来使用nsupdate -l; 当一个区域被配置为update-policy local;时,它会这样做。ddns-confgen只在需要更详细的配置时才需要,例如如果要从远程系统使用nsupdate。

语法参数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
tsig-keygen [-a algorithm] [-h] [-r randomfile] [name]
ddns-confgen [-a algorithm] [-h] [-k keyname] [-q] [-r randomfile] [-s name] [-z zone]

-a algorithm
This option specifies the algorithm to use for the TSIG key. Available choices are: hmac-md5, hmac-sha1, hmac-sha224, hmac-sha256, hmac-sha384, and hmac-sha512. The default is hmac-sha256. Options are case-insensitive, and the “hmac-” prefix may be omitted.
-h
This option prints a short summary of options and arguments.
-k keyname
This option specifies the key name of the DDNS authentication key. The default is ddns-key when neither the -s nor -z option is specified; otherwise, the default is ddns-key as a separate label followed by the argument of the option, e.g., ddns-key.example.com. The key name must have the format of a valid domain name, consisting of letters, digits, hyphens, and periods.
-q (ddns-confgen only)
This option enables quiet mode, which prints only the key, with no explanatory text or usage examples. This is essentially identical to tsig-keygen.
-s name (ddns-confgen only)
This option generates a configuration example to allow dynamic updates of a single hostname. The example named.conf text shows how to set an update policy for the specified name using the “name” nametype. The default key name is ddns-key.name. Note that the “self” nametype cannot be used, since the name to be updated may differ from the key name. This option cannot be used with the -z option.
-z zone (ddns-confgen only)
This option generates a configuration example to allow dynamic updates of a zone. The example named.conf text shows how to set an update policy for the specified zone using the “zonesub” nametype, allowing updates to all subdomain names within that zone. This option cannot be used with the -s option.