DNS服务基础知识
DNS:Domain Name System (域名系统)
DNS 是互联网上解决网络中机器命名的一种系统。在网络中,一台主机去访问另外一台主机时,必须要 知道目标主机的IP地址,虽然网络上的节点都可以用IP地址来标识,并且可以通过IP地址被访问。但对 于自然人而言,一组组由数字组成的IP地址,是难以被理解和记忆的。于是设计出了域名系统,用一组 有意义的字符来表示某个特定主机或某个网络,再将网络中主机IP地址和域名之间做成一个映射表。
DNS 就是负责维护主机IP地址和域名映射关系的服务,同时也提供域名解析服务,即人类通过域名访问 某个主机或节点时,由DNS服务将人类可读的域名转换为机器可读的IP地址,再通过IP地址找到对应的 主机。
域名 (Domain Name)
域名,又称网域,顾名思义,是一个域的名称。 是一串用点号分隔的字符,可以用来标识网络中某台主 机或某个节点,由DNS服务维护域名和主机IP地址之间的映射关系,当我们在网络中访问某个域名时, 实际上访问的是该域名对应的IP地址所标识的主机。
FQDN:(Fully Qualified Domain Name)全限定域名
域名是一个域的名称,一个网域或一个节点,可以有多台主机,所以为了精确表示域里面的某台主机, 我们在使用域名时,还需要加上主机名,FQDN指的就是同时带有主机名和域名的名称。
域名的组成
域名由英文字母,数字和英文连字符(-) 组成,且不区分大小写。
域名是分层次的,允许定义子域,子域名与上级域名之间用 . (点号)分隔,最上层节点的域名称为顶级 域名(TLD,Top-Level Domain),第二层节点的域名称为二级域名,依此类推。级别最低的域名写在最 左边,而级别最高的域名写在最右边。每一层级的域名长度不能超过63个字符,多级域名加起来不能超 过255个字符。域名最多可以有127级。
域名的管理
域名由因特网域名与地址管理机构(ICANN,Internet Corporation for Assigned Names and Numbers) 管理,这是为承担域名系统管理、IP地址分配、协议参数配置,以及主服务器系统管理等职能而设立的 非盈利机构。
ICANN为不同的国家或地区设置了相应的顶级域名,这些域名通常都由两个英文字母组成。例如:.uk代 表英国、.fr代表法国、.jp代表日本。中国的顶级域名是.cn,.cn下的域名由CNNIC进行管理。
一级域名:又称顶级域名,可分为三类,一类代表国家和地区(cn,hk,......),一类代表各类组织 (com,edu,......),以及反向域
二级域名:某个具体组织,单位,机构,商业公司或个人使用,需要向域名管理机构申请(付费)才能获得 使用权
二级域名以下的域名,由使用该域名的组织自行分配
DNS服务工作原理
主机中DNS客户端配置
当一台主机接入互联网时,在配置网络时,通常有两种方式,一种是从DHCP服务自动获得IP地址,另外 一种是手动指定静态地址;
从DHCP服务自动获取IP时,通常也会自动获得DNS服务器地址,手动配置静态地址时,也需要手动配置 DNS服务器地址;
当用户使用主机 发送/接收 邮件,或浏览网页时,就是由主机上配置的DNS服务器地址负责将域名转换 成对应的IP地址。
Rocky中手动配置的DNS服务器地址
[root@rocky86 ~]# cat /etc/sysconfig/network-scripts/ifconfig-eth1
DEVICE=eth1
NAME=con-eth1
IPADDR=10.0.0.88
PREFIX=24
GATEWAY=10.0.0.2
DNS1=10.0.0.2
DNS2=114.114.114
#查看DNS
[root@rocky86 ~]# cat /etc/resolv.conf
# Generated by NetworkManager
search localdomain
nameserver 10.0.0.2
nameserver 114.114.114.114
查看Ubuntu 中的DNS
[root@ubuntu ~]# cat /etc/netplan/00-installer-config.yaml
# This is the network config written by 'subiquity'
network:
renderer: NetworkManager
ethernets:
eth0:
#dhcp4: true
addresses: [10.0.0.206/24]
gateway4: 10.0.0.2
nameservers:
search: [magedu.com,baidu.org]
addresses: [223.5.5.5,8.8.8.8]
version: 2
[root@ubuntu ~]# resolvectl status
Global
Protocols: -LLMNR -mDNS -DNSOverTLS DNSSEC=no/unsupported
resolv.conf mode: stub
Current DNS Server: 223.5.5.5
DNS Servers: 223.5.5.5
Link 2 (eth0)
Current Scopes: DNS
Protocols: +DefaultRoute +LLMNR -mDNS -DNSOverTLS DNSSEC=no/unsupported
Current DNS Server: 223.5.5.5
DNS Servers: 223.5.5.5 8.8.8.8
DNS Domain:
DNS服务解析域名流程
-
当客户端主机决定访问 百度一下,你就知道 这个域名时,首先会查询本机缓存;
-
如果本机缓存没有解析记录,则会向其配置的DNS服务器发起解析请求;
-
DNS代理解析服务器会先查询其缓存是否有这条解析记录,如果有,则直接返回,如果没有,则继 续向上解析;
-
DNS代理解析服务器会向根域名服务器发起解析请求,根域名服务器返回 com 域名的DNS地址;
-
DNS代理解析服务器继续向 com 域名服务器发起解析请求,com 域名服务器返回 baidu.com 域名服务器DNS地址;
-
DNS代理解析服务器继续向 baidu.com 域名服务器发起解析请求,baidu.com 域名服务器返 回 www.baidu.com 主机的IP;
-
DNS代理解析服务器将 www.baidu.com 的IP地址存入本机缓存,再读取缓存,将 IP地址发送给 客户端主机;
-
客户端主机通过IP地址顺利访问 百度一下,你就知道;
注意:DNS服务只负责域名解析,也就是说,DNS服务,只负责返回与域名对应的IP地址,但该IP地址在网络 上是否是可达的,并不由DNS决定
DNS查询类型
递归查询
是指DNS服务器在收到用户发起的请求时,必须向用户返回一个准确的查询结果。如果DNS服务器本地 没有存储与之对应的信息,则该服务器需要询问其他服务器,并将返回的查询结果提交给用户。
一般客户机和本地DNS服务器之间属于递归查询,即当客户机向DNS服务器发出请求后,若DNS服务器 本身不能解析,则会向另外的DNS服务器发出查询请求,得到最终的肯定或否定的结果后转交给客户 机。
此查询的源和目标保持不变,为了查询结果只需要发起一次查询。
递归算法:客户端向LocalDNS发起域名查询-->localDNS不知道域名对应的IP-->但它知道谁知道->他代 为帮客户端去查找-->最后再返回最终结果。
迭代查询
是指DNS服务器在收到用户发起的请求时,并不直接回复查询结果,而是告诉另一台DNS服务器的地 址,用户再向这台DNS服务器提交请求,这样依次反复,直到返回查询结果。
一般情况下(有例外)本地的DNS服务器向其它DNS服务器的查询属于迭代查询,如:若对方不能返回权 威的结果,则它会向下一个DNS服务器(参考前一个DNS服务器返回的结果)再次发起进行查询,直到返 回查询的结果为止。此查询的源不变,但查询的目标不断变化,为查询结果一般需要发起多次查询。
迭代算法:客户端向LocalDNS发起域名查询-->localDNS不知道域名对应的IP-->但它知道谁知道并推荐 客户端应该找谁-->客户端自己去找它。
DNS缓存
DNS缓存是将解析数据存储在靠近发起请求的客户端的位置,也可以说DNS数据是可以缓存在任意位 置,最终目的是以此减少递归查询过程,可以更快的让用户获得请求结果。
Windows系统
#显示DNS缓存
C:\Users\44301>ipconfig/displaydns
Windows IP 配置
ytbackend.godarkmode.com
----------------------------------------
记录名称. . . . . . . : ytbackend.godarkmode.com
记录类型. . . . . . . : 1
生存时间. . . . . . . : 92
数据长度. . . . . . . : 4
部分. . . . . . . . . : 答案
A (主机)记录 . . . . : 165.22.214.237
......
#清除DNS缓存
C:\Users\44301>ipconfig/flushdns
Windows IP 配置
已成功刷新 DNS 解析缓存。
CentOS系统
#查看DNS缓存
[root@rocky86 ~]# nscd -g
nscd configuration:
0 server debug level
4s server runtime
5 current number of threads
32 maximum number of threads
0 number of times clients had to wait
no paranoia mode enabled
3600 restart internal
5 reload count
passwd cache:
yes cache is enabled
yes cache is persistent
yes cache is shared
211 suggested size
......
......
#清空DNS缓存
[root@rocky86 ~]# nscd -i hosts
Ubuntu系统
#查看DNS缓存
[root@ubuntu ~]# resolvectl statistics
DNSSEC supported by current servers: no
Transactions
Current Transactions: 0
Total Transactions: 1152
Cache
Current Cache Size: 0
Cache Hits: 11
Cache Misses: 1399
DNSSEC Verdicts
Secure: 0
Insecure: 0
Bogus: 0
Indeterminate: 0
#清空DNS缓存
[root@ubuntu ~]# resolvectl reset-statistics
DNS解析类型
DNS服务器里面有两个区域,即 正向查找区域 和 反向查找区域
正向解析:将域名解析成IP地址
反向解析:根据IP地址得到该IP地址指向的域名
hosts文件
hosts文件是一个没有扩展名的系统文件,可以直接用文本编辑工具修改,在该文件中直接定义域名与IP 地址的对应关系,当主机访问某个域名时,会先从hosts文件中寻找与该域名对应的IP地址,如果找到, 则直接请求该IP地址,如果找不到,才会将该域名提交DNS服务请求解析该域名对应的IP地址。
操作系统规定,在进行DNS请求以前,先检查系统自己的Hosts文件中是否有这个域名和IP的映射关系。 如果有,则直接访问这个IP地址指定的网络位置,如果没有,再向已知的DNS服务器提出域名解析请 求。也就是说Hosts的IP解析优先级比DNS要高。
hosts文件是引入DNS服务之前的解析方案
早期的 internet 网络规模非常小,一个hosts文件就可以定义所有的域名与IP地址的映射关系,管理机 构提供该文件下载地址,并定期更新文件内容,以此来反映网络上的变化。
但随着时间的推移,接入 internet 的主机和域名越来越多,通过一个中心文件管理所有域名与IP地址映 射关系己经不再可取,于是便引入了DNS服务
#Windows系统中的hosts文件
%windir%\System32\drivers\etc\hosts
# %windir% 是windows 系统中的环境变量写法,表示 Windows 安装目录,上述路径一般是
C:\Windows\System32\drivers\etc
#Linux系统中的hosts文件
/etc/hosts
DNS检测工具
dig命令
dig:(Domain Information Groper) 域名信息查询工具
dig 命令不会查询本地 hosts文件中定义的域名和IP对应关系
#安装
[root@ubuntu ~]# apt install bind9
#查询来源
root@ubuntu ~]# dpkg -S /usr/bin/dig
bind9-dnsutils: /usr/bin/dig
#命令格式
dig [@global-server] [domain] [q-type] [q-class] {q-opt}
{global-d-opt} host [@local-server] {local-d-opt}
[ host [@local-server] {local-d-opt} [...]]
dig [-t type] name [@SERVER] [query options]
@global-server #指定DNS服务器
domain #要查询的域名
q-type #要查询的记录类型(a,any,mx,ns,soa,hinfo,axfr,txt,...),默认
a
q-class #要查询的解析类型(in|hs|ch),默认 in
q-opt #选项
d-opt #查询选项
#q-opt 项
-h #显示帮助
-v #显示版本号
-4 #仅查询IPV4的DNS服务器
-6 #仅查询IPV6的DNS服务器
-b address[#port] #使用指定客户端IP去查询DNS
-c class (specify query class)
-f filename #从文件中获取要查询的域名
-i (use IP6.INT for IPv6 reverse lookups)
-k keyfile (specify tsig key file)
-m (enable memory usage debugging)
-p port #指定DNS服务查询端口
-q name (specify query name)
-r (do not read ~/.digrc)
-t type #指定要查询的资源记录类型A|NS|AAA|PTR|...
-u #以微秒显示打印时间
-x dot-notation #反向解析
-y [hmac:]name:key (specify named base64 tsig key)
#d-opt 项
+[no]trace #是否追踪查询过程
+[no]cmd #是否在查询结果中显示头信息
+[no]recurse #是否进行递归解析查询
+[no]all #是否显示所有信息,如果否,要指明具体显示内容
+[no]answer #是否显示answer部份
+[no]question #是否显示question部份
+[no]authority #是否显示authority部份
+[no]comment #是否显示comment部份
+[no]stat #是否显示status部份
+[no]short #是否只显示关键信息
#常用组合
dig domain
dig @dns-erver domain | dig domain @dns-server
dig -t q-type domain | dig domain q-type
git -x IP | dig -t ptr reverseIP.in-addr.arpa #reverseIP 表示将要查询的IP倒序输出
查询结果说明
[root@ubuntu ~]# dig
#dig命令版本和参数
; <<>> DiG 9.18.12-0ubuntu0.22.04.1-Ubuntu <<>> #此处查询参数为空
;; global options: +cmd #默认选项,此项表示显示头部软件版本和参数信息
#查询结果
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 12947 #QUERY 表示是执行查询操作,NOERROR 表示解析成功
;; flags: qr rd ra; QUERY: 1, ANSWER: 13, AUTHORITY: 0, ADDITIONAL: 1
# opcode: QUERY 执行查询操作
# status: NOERROR 解析成功
# id: 12947 此次查询的ID,在dns协议中,通过ID编号匹配查询请求和返回结果
# flags: qr rd ra 标志位
# qr(query,查询标志,代表查询操作)
# rd(recursion desired, 表示客户端希望进行递归查询)
# ra(recursive available, 表示DNS服务器支持递归查询)
# aa(Authoritative Answer, 权威回复,如果查询结果由管理域名的域名服务器而不是缓存服务器提供的,则称为权威回复)
#QUERY: 1 查询数,表示1个查询,对应下面 QUESTION SECTION中的记录数
#ANSWER: 13 查询结果,表示有13个查询结果,对应下面 ANSWER SECTION 中的记录数
#AUTHORITY: 0 权威域名服务器记录数量,此处表示有0个权威域名服务器
#ADDITIONAL: 1 额外记录数量,此处表示有1个额外记录,此处缺失该部份内容
#选项
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 65494
#EDNS: Extended DNS 扩展用户数据报文协议
#version:0 协议版本为 0
#flag:; 标记位为空
#udp:65494 数据包大小
#查询域名,此处表示查根域
;; QUESTION SECTION:
;. IN NS
#具体查询结果
#第一列是要要询的域名
#第二列是TTL(time to live),表示该记录的缓存时间,单位是秒
#第三列是要查询的信息类型,IN代表类别为IP协议,即Internet
#第四列是要查询的记录类型,NS表示name server,即域名服务器
#第五列表示查询得到的值
;; ANSWER SECTION:
. 2221 IN NS h.root-servers.net.
. 2221 IN NS a.root-servers.net.
. 2221 IN NS e.root-servers.net.
. 2221 IN NS i.root-servers.net.
. 2221 IN NS b.root-servers.net.
. 2221 IN NS k.root-servers.net.
. 2221 IN NS f.root-servers.net.
. 2221 IN NS d.root-servers.net.
. 2221 IN NS j.root-servers.net.
. 2221 IN NS g.root-servers.net.
. 2221 IN NS c.root-servers.net.
. 2221 IN NS m.root-servers.net.
. 2221 IN NS l.root-servers.net.
#本次查询统计信息
;; Query time: 0 msec #本次查询消耗时长
;; SERVER: 127.0.0.53#53(127.0.0.53) (UDP) #DNS服务器为10.0.0.2 端口是53
;; WHEN: Tue May 30 15:46:07 CST 2023 #查询时间
;; MSG SIZE rcvd: 239 #返回内容长度为239字节
host命令
host 命令可以根据域名查询得到对应的服务器IP地址
host 命令不会查询本地 hosts文件中定义的域名和IP对应关系
host [option] hostname [server]
#常用选项
-a #显示所有信息
-c #指定查询类型 HS|CH|IN
-C #查询SOA
-d #同 -v
-i #IP6.INT reverse lookups IP6.INT反向查找
-l #lists all hosts in a domain, using AXFR 使用AXFR列出域中的所有主机
-m #set memory debugging flag (trace|record|usage) 设置内存调试标志(跟踪|记录|使用)
-N #changes the number of dots allowed before root lookup is done 更改在完成根查找之前允许的点数
-p #指定端口
-r #不递归查询
-R specifies number of retries for UDP packets
-s a SERVFAIL response should stop query
-t #指定查询类型 CNAME|NS|SOA|TXT|DNSKEY|AXFR|...
-T #使用TCP进行DNS查询
-U #使用UDP进行DNS查询
-v #显示执行过程
-V #显示命令版本
-w #如果没有查询结果,则阻塞,一直等待
-W N #等待N秒后超时
-4 #仅查询IPV4的DNS server
-6 #仅查询IPV4的DNS server
nslookup 命令
nslookup:(name server lookup),一个命令行下的网络工具,主要用来查询DNS记录,查看域名解析 是否正常,也可用来诊断网络问题
nslookup 支持交互式和非交互式两种执行方式,在Windows系统中和Linux系统中都可以使用
nslookup 命令不会查询本地 hosts文件中定义的域名和IP对应关系,也不能查询dns的递归或者迭代
nslookup [-option] [name | -] [server]
#非交互式选项
-type #指定查询类型 A|AAAA|CNAME|...
-query #
set
server IP/DNS Name #指定DNS服务器,可以用IP地址或域名
root
-a
-d
-t type
rndc命令
rndc 是 bind 程序的客户端工具,默认使用 TCP的 953 端口连接 bind 服务器,进行管理
rndc [-b address] [-c config] [-s server] [-p port] [-k key-file ] [-y key] [-r] [-V] command
#常用子命令
status #查看BIND服务状态
reload #重载主配置文件和区域解析库文件
reload zonename #重载区域解析库文件
retransfer zonename #手动启动区域传送,而不管序列号是否增加
notify zonename #重新对区域传送发通知
reconfig #重载主配置文件
querylog #开启或关闭查询日志文件/var/log/message
trace #递增debug一个级别
trace LEVEL #指定使用的级别
notrace #将调试级别设置为 0
flush #清空DNS服务器的所有缓存记录
whois 命令
whois 命令可以查询域名注册信息
#安装
[root@ubuntu ~]# apt install whois -y
#格式
whois [OPTION]... OBJECT...
#常用选项
-H #不显示相关法律声明
--help #显示帮助信息
--version #显示版本信息
#下列选项需要 whois.ript.net 和 RIPE-like 服务器支持
-x #精确匹配
-b #输出简略内容
-a #搜索所有数据库镜像
-s SOURCE[,SOURCE] #从指定数据库中查询
-q [version|sources|types] #查询服务器信息
自建DNS服务
ubuntu 中的 systemd-resolved 服务
在 ubuntu 系统中,虽然在网卡中配置了 DNS 服务器的IP地址,但在使用相关命令进行 DNS 解析时, 默认的 DNS 服务器使用的是 127.0.0.53,而并不是我们在网卡上配置的DNS 服务器地址。
[root@ubuntu ~]# cat /etc/netplan/00-installer-config.yaml
# This is the network config written by 'subiquity'
network:
renderer: NetworkManager
ethernets:
eth0:
#dhcp4: true
addresses: [10.0.0.206/24]
gateway4: 10.0.0.2
nameservers:
search: [magedu.com,magedu.org]
addresses: [223.6.6.6,8.8.8.8]
version: 2
[root@ubuntu ~]# nslookup www.baidu.com
Server: 127.0.0.53
Address: 127.0.0.53#53
Non-authoritative answer:
Name: www.baidu.com
Address: 140.143.156.192
systemd-resolved 服务为本地应用程序提供了网络名字解析服务, 系统通过它对外进行 dns 请求。
[root@ubuntu ~]# ll /etc/resolv.conf
lrwxrwxrwx 1 root root 39 Apr 21 2022 /etc/resolv.conf -> ../run/systemd/resolve/stub-resolv.conf
[root@ubuntu ~]# cat /etc/resolv.conf
......
nameserver 127.0.0.53 #默认DNS 配置在此处
options edns0 trust-ad
search baidu.com baidu.org
#直接修改上述文件,将
[root@ubuntu ~]# vim /etc/resolv.conf
......
#nameserver 127.0.0.53
nameserver 223.6.6.6
#测试
[root@ubuntu ~]# nslookup www.baidu.com
Server: 223.6.6.6
Address: 223.6.6.6#53
Non-authoritative answer:
Name: www.baidu.com
Address: 140.143.156.192
#但是只要再次重启网络相关,该内容会被还原
[root@ubuntu ~]# netplan apply
[root@ubuntu ~]# cat /etc/resolv.conf | grep nameserver
nameserver 127.0.0.53
#修改软链接文件指向,保证永久生效
[root@ubuntu ~]# ll /etc/resolv.conf
lrwxrwxrwx 1 root root 39 Apr 21 2022 /etc/resolv.conf ->
../run/systemd/resolve/stub-resolv.conf
[root@ubuntu ~]# rm -f /etc/resolv.conf
[root@ubuntu ~]# ln -sv /run/systemd/resolve/resolv.conf /etc/resolv.conf
'/etc/resolv.conf' -> '/run/systemd/resolve/resolv.conf'
[root@ubuntu ~]# ll /etc/resolv.conf
lrwxrwxrwx 1 root root 32 Jun 1 11:26 /etc/resolv.conf -> /run/systemd/resolve/resolv.conf
[root@ubuntu ~]# nslookup www.baidu.com
Server: 223.6.6.6
Address: 223.6.6.6#53
Non-authoritative answer:
Name: www.baidu.com
Address: 140.143.156.192
设置全局DNS
[root@ubuntu ~]# vim /etc/systemd/resolved.conf
......
DNS=223.5.5.5 223.6.6.6
#重启服务
[root@ubuntu ~]# systemctl restart systemd-resolved.service
#查看
[root@ubuntu ~]# cat /etc/resolv.conf
......
nameserver 223.5.5.5
nameserver 223.6.6.6
bind安装和配置
bind:(Berkeley Internet Name Domain)
bind 是一款实现DNS服务的开放源码软件,由伯克利大学开发,能够提供双向解析,转发,子域授权, view 等功能,使用广泛,目前Internet上半数以上的DNS服务器都是由Bind来实现的。
安装
[root@ubuntu ~]# apt install -y bind9
[root@ubuntu ~]# apt list bind* --installed
Listing... Done
bind9-dnsutils/jammy-updates,now 1:9.18.12-0ubuntu0.22.04.1 amd64
[installed,automatic]
bind9-host/jammy-updates,now 1:9.18.12-0ubuntu0.22.04.1 amd64
[installed,automatic]
bind9-libs/jammy-updates,now 1:9.18.12-0ubuntu0.22.04.1 amd64
[installed,automatic]
bind9-utils/jammy-updates,now 1:9.18.12-0ubuntu0.22.04.1 amd64
[installed,automatic]
bind9/jammy-updates,now 1:9.18.12-0ubuntu0.22.04.1 amd64 [installed]
#服务端包
启动服务
[root@ubuntu ~]# systemctl enable --now named.service
Synchronizing state of named.service with SysV service script with
/lib/systemd/systemd-sysv-install.
Executing: /lib/systemd/systemd-sysv-install enable named
查看端口占用
named默认会占用TCP和UDP的53端口, 953是给管理工具使用的
将其它机器的DNS指向本机
[root@rocky ~]# hostname -I
10.0.0.150 192.168.122.1
[root@rocky ~]# cat /etc/resolv.conf
# Generated by NetworkManager
search localdomain
nameserver 10.0.0.206
#解析成功,因为DNS服务器默认己经开启了远程监听53端口
[root@rocky ~]# dig www.baidu.com
; <<>> DiG 9.11.36-RedHat-9.11.36-3.el8 <<>> www.baidu.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 12323
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
; COOKIE: 7b6b6d69fde55cbb0100000064783fe167f3e047ae5b4cd6 (good)
;; QUESTION SECTION:
;www.baidu.com. IN A
;; ANSWER SECTION:
www.baidu.com. 600 IN A 140.143.156.192
;; Query time: 266 msec
;; SERVER: 10.0.0.206#53(10.0.0.206)
;; WHEN: Thu Jun 01 14:51:14 CST 2023
;; MSG SIZE rcvd: 87
相关配置说明
Bind 的配置说明
配置文件解析流程
bind 配置文件
[root@ubuntu bind]# dpkg -L bind9
......
/etc/bind
/etc/bind/bind.keys
/etc/bind/db.0 #db.* 名具体解析规则文件
/etc/bind/db.127
/etc/bind/db.255
/etc/bind/db.empty
/etc/bind/db.local
/etc/bind/named.conf #主配置文件
/etc/bind/named.conf.default-zones #中间配置文件,该文件中定义了域名和具体解析规则文件的对应关系
/etc/bind/named.conf.local #中间配置文件,引用
/etc/bind/zones.rfc1918,被注释
/etc/bind/named.conf.options #bind配置项
/etc/bind/zones.rfc1918 #中间配置文件,该文件中定义了域名和具体解析规则文件的对应关系
主配置文件 /etc/bind/named.conf
[root@ubuntu bind]# cat /etc/bind/named.conf
......
include "/etc/bind/named.conf.options";
include "/etc/bind/named.conf.local";
include "/etc/bind/named.conf.default-zones";
选项配置文件 /etc/bind/named.conf.options
[root@ubuntu ~]# cat /etc/bind/named.conf.options
options {
directory "/var/cache/bind";
......
// forwarders {
// 0.0.0.0;
// };
//========================================================================
// If BIND logs error messages about the root key being expired,
// you will need to update your keys. See https://www.isc.org/bind-keys
//========================================================================
dnssec-validation auto;
listen-on-v6 { any; };
};
该文件主要包括以下几部份内容,默认只有全局配置部份
配置 | 配置字段 | 备注 |
---|---|---|
全局配置 | options{}; | 全局配置选项 |
日志子系统配置 | logging{}; | 运行日志 |
网络自定义集合 | acl | 将某个网段或某个具体IP地址定义在一个集合里面 |
视图 | view | 配合acl将不同的请求来源用不同的解析规则返回,实现智能 DNS |
#常用全局配置选项
options {
#此配置表示DNS服务只监听了本机127.0.0.1的53端口,如果对外提供DNS服务,可以将此行注释或值改成any
listen-on port 53 { 127.0.0.1; };
#监听IPV6的53端口,配置方法同上
listen-on-v6 port 53 { ::1; };
#监听本机所有IPV6地址,不想监听IPV6地址,可以将 any 改成 none
listen-on-v6 { any; };
#此配置表示仅本机可以使用DNS服务的解析查询功能,如果对外提供DNS服务,可以将此行注释或值改成any
allow-query { localhost; };
#是否启用加密验证,在使用转发的时候,将此项改为 no
dnssec-validation auto;
#转发服务器
forwarders { 10.0.0.207; };
#转发策略,具体见后续章节
forward first;
};
中间配置文件 /etc/bind/named.conf.default-zones
该文件中定义了要解析的域名与具体解析规则之间的对应关系
zone "ZONE_NAME" IN { #IN 可以省略不写
type {master|slave|hint|forward}; #类型 master,slave 用于DNS主从,forward表示转发
file "file_path"; #具体解析规则文件路径
};
allow 访问控制指令
在named配置中有四个allow开头的字段,主要用来实现访问控制
字段 | 说明 |
---|---|
allow-query{}; | 允许查询本DNS的主机,白名单,注释就代表所有主机都可使用本机当DNS |
allow-transfer{}; | 允许区域传送的主机,白名单,注释代表所有,一般用在主从DNS配置时指 定从节点 |
allow-recursion{}; | 允许递归的主机,建议全局使用 |
allow-update{}; | 允许可以远程更新解析规则的主机 |
acl 地址集合
ACL:将一个或多个网段(或具体IP地址)定义在一个集合里面,并通过统一的名称进行调用。
ACL 只能先定义后调用,因此一般放在配置文件的最上面,在 options 之前定义。
ACL 有四个内置值
ACL | 说明 |
---|---|
none | 排除所有主机 |
any | 所有主机 |
localhost | 本机 |
localnet | 本机IP同子网掩码运算后得到的网段 |
view 视图
view:视图,将ACL和具体的解析规则对应起来,实现根据条件解析,实现智能DNS
-
每个view用来匹配一个ACL;
-
一个bind服务可以可以定义多个view,每个view 中可定义的一个或多个zone;
-
不同的view中可以对同一个域名进行解析,返回不同的解析结果;
-
如果定义了view,则所有的zone规则都要写在view中了,不能再直接写在 /etc/named.conf 中 了;
-
客户端请求到达时,是自上而下检查每个view所对应的ACL的,也就是说,如果请求被命中了,就 进入解析,不再向后匹配;
具体解析规则 /etc/bind/db.*
该文件定义域名的具体解析规则,该文件有多条资源记录组成,每一行都是一条资源记录,在RFC文档 中,DNS解析记录被称为Resource Recode(资源记录),缩写为 RR
Resource Recode 定义
NAME TTL CLASS TYPE VALUE
#字段说明
NAME #资源记录名称,根据TYPE不一样,写法会有不同
TTL #缓存有效期,默认单位是秒,也可以加单位{ M(分), H(时), D(天),
W(周) }
CLASS #资源记录类别
TYPE #记录类型,具体值见下表
VALUE #此记录对应的具体值,根据TYPE不一样,写法会有不同
CLASS 字段说明
值 | 说明 |
---|---|
IN | the Internet/互联网,最常用的 |
CS | CSNET,己被废弃 |
CH | CHAOS ,一种早期协议 |
HS | Hesiod |
TYPE字段说明
常用的TYPE字段值有A,AAAA,CNAME,MX,NS,PTR,SOA 等
值 | 说明 |
---|---|
A | internet Address,将FQDN解析成IPV4地址,这是最常用的一种解析类型 |
AAAA | IPV6 internet Address,将FQDN解析成IPV6地址 |
CNAME | the canonical name for an alias,记录别名,将域名解析到另一个域名 |
HINFO | host information,主机信息 |
KEY | 安全密钥记录 |
MD | 被废弃,使用 MX |
MF | 被废弃,使用 MX |
MINFO | mailbox or mail list information,邮箱或邮件列表信息 |
MX | Mail eXchanger,用于邮件交换,指定邮件服务器 |
NS | Name Server,将解析指向另外一个DNS,表示由被指定的DNS解析当前记录 |
PTR | a domain name pointer,域名指针,用IP地址反向解析域名 |
SOA | a marks the start of a zone of authority,标记权威区域的开始 |
SRV | service and protocol,服务和协议 |
TXT | text strings,文本字符串,此类型值长度限定不超过512个字符 |
WKS | a well known service description/众所周知的服务描述 |
A 记录 和 AAAA记录
A 记录也称主机记录,是将主机域名解析到指定的物理机IPV4地址上
AAAA 记录是IPV6地址的主机记录,是将主机域名解析到指定物理机的IPV6地址上
A 记录是DNS解析服务中最常见的资源记录
www.linux-baidu.com. 86400 IN A 10.0.0.210
blog.linux-baidu.com. 86400 IN A 10.0.0.206
blog.linux-baidu.com. 86400 IN A 10.0.0.210 #如果有多条A记录,且有A记录的IP与DNS机器IP相同,则优先返回
*.linux-baidu.com. 86400 IN A 10.0.0.210 #泛解析,匹配所有以 linux-baidu.com结束的域名或主机名
linux-baidu.com. 86400 IN A 10.0.0.167
@ 86400 IN A 10.0.0.167 #@代表域名,此条记录含义同上
CNAME 别名记录
记录别名,将域名解析到另一个域名
abc.linux-baidu.com. 86400 IN CNAME def.baidu.com. #将 abc.linux-baidu.com 解析到 def.baidu.com
MX 记录
邮件交换 (MX) 记录将一个域的电子邮件定向到托管该域用户帐号的服务器(SMTP服务器)。
一个域可以定义多条MX记录,但每条MX记录的优先级不同,如果邮件通过最高优先级记录无法递送, 则采用第二优先级,以此类推。
每个MX记录的value之前有一个数字(0-99),表示此服务器的优先级,数字越小优先级越高;
对MX记录而言,任何一个MX记录后面的服务器名字,都应该在后续有一个A记录
linux-baidu.com. 86400 IN MX 10 mx1.linux-baidu.com.
linux-baidu.com. 86400 IN MX 20 mx2.linux-baidu.com.
mx1.linux-baidu.com. 86400 IN A 10.0.0.206
mx2.linux-baidu.com. 86400 IN A 10.0.0.208
NS 记录
域名服务器 (NS) 记录用于确定哪些服务器为一个网域提供DNS解析服务。
一般来说,为了服务的安全可靠,一个域名,至少应该有两条NS记录,保证服务的冗余,防止出现单点 失败。
linux-baidu.com. 86400 IN NS dns1.linux-baidu.com.
linux-baidu.com. 86400 IN NS dns2.linux-baidu.com.
dns1.linux-baidu.com. 86400 IN A 10.0.0.206
dns2.linux-baidu.com. 86400 IN A 10.0.0.208
PTR 记录
PTR记录是A记录的逆向记录,又称做IP反查记录或指针记录,负责将IP反向解析为域名
#A记录
blog.linux-baidu.com. 86400 IN A 10.0.0.167
#与其对应的PTR记录
#IP地址反着写,后面跟 .in-addr.arpa.
167.0.0.10.in-addr.arpa. 86400 IN PTR blog.linux-baidu.com.
SOA 记录
SOA记录是起始授权记录,用于设置当前DNS服务器的某些规则,SOA记录要放在整个文件的最开始。
SOA 记录表示此DNS是该域名的权威解析服务器,当在查询的过程中,各级缓存都没有要查询的内容 时,最后会通过递归查询的方式到达此DNS服务器,并请求此域名的SOA记录。
SOA记录同样符合 NAME TTL CLASS TYPE VALUE 这五个字段的格式定义,但VALUE字段值较多
VALUE 字段中从左到右具体内容如下:
字段 | 说明 |
---|---|
DNS服务器名称 | 描述性字段,表示当前DNS服务器名称 |
服务器管理员邮箱 | 邮箱中的@要写成 |
当前数据库的版本号 | 主从服务器要同步数据,此字段就是数据更新的标识 |
从服务器拉取数据的时间间隔 | 从服务器拉取数据的时间间隔 |
从服务器同步失败后重试时间间隔 | 上次同步失败后,间隔多久重试 |
从服务器同步失败超过多长时间从服 务器失败 | 同步失败时长超过此值,则认为从服务器数据无效 |
不存在的记录缓存时长 | 当查询一个不存在的解析记录时,该记录在指定时间内直 接返回不存在 |
linux-baidu.com. 86400 IN SOA linux-dns. admin.linux-dns.com. (123 3H 15M 1D 1W)
#服务器名 linux-dns
#管理员邮箱 amdin@linux-dns.com
#版本号 123
#从服务器更新间隔 3H
#失败重试间隔 15M
#从服务器数据失效时长 1D
#无效记录缓存时长 1W
TXT 记录
TXT记录是对域进行标识和说明的一种方式,一般用于验证记录,该记录的值可以是人工可读文本,也 可以是机器可读文本,也可为空。