前面我们做的所有实验,都是通过一个域名去访问web页面,实际上我们都是通过配置HOST解析来实现的,在实际生产中需要通过DNS进行解析,来获取域名对应的ip(或者ip对应的域名)。本章节我们将从如下几个方面说说dns:
1. dns的基本概述;
2. dns实现基本原理;
3. dns的记录类型;
4. A记录,NS记录,CNAME记录,PTR记录的实验!
在互联网中,使用ip地址与服务器进行通信是行不通的,因为IP地址不好记忆,同时IP地址可能会经常变更,所以此时DNS协议就应运而生,然而DNS解决了什么问题呢?
DNS主要用来管理域名与IP地址的对应关系表。
DNS(Domain Name System)是“域名系统”的英文缩写,它所提供的服务是用来将域名转换为IP地址的工作。DNS就是一位翻译官,基本工作原理如下:
由于因特网用户数量比较多,所以因特网在命名时采用的是层次树状结构的命名方法。
1. 互联网中的域名是有结构有规划的;
2. 由于域名进行了分级,在进行域名和ip地址解析时能更容易找到;
3. 其次域名具有全球唯一性。
根域:知道所有顶级域名服务器的域名和ip地址。
全世界只有13组根域服务器,其中10组设置在美国,另外三组设置在英国,瑞典,日本。
顶级域:指导所有顶级域名服务器下注册的所有二级域名的ip地址
顶级域有两种:通用域(com,cn)和国家域(hk,jp)
顶级域名由ICANN(互联网名称与数字地址分配机构)委任的注册机构负责运行;
二级域:负责一个区域的域名服务器(aliyun.com)
无需到ICANN进行申请,只需要到运行顶级域的注册机构(阿里,腾讯)去申请;
如果申请的域名没有被注册,也没有被注册为商标,仅需要缴费一笔年费即可得到域名;
三级域或主机:根据服务器所提供的业务功能,选择配置对应的主机名称解析记录,比如(www,ops)
DNS查询的结果通常会在本地域名服务器中进行缓存,如果本地域名服务器中有缓存的情况下,则会跳过如下DNS查询步骤,很快返回解析结果。
没有缓存的情况下,解析步骤如下:
1. 用户在浏览器中输入example.com,则由本地域名服务器开始递归查询;
2. 本地域名服务器采用迭代查询的方式,向根域名服务器进行查询。
3. 根域名服务器告诉本地域名服务器,下一步应该查询的顶级域名服务器. TLD的IP地址;
4. 本地域名服务器向顶级域名服务器.com TLD进行查询。
5. .com TLD服务器告诉本地域名服务器,下一步查询example.com权威域名服务器的ip地址;
6. 本地域名服务器向example.com权威域名服务器发送查询;
7. example.com权威域名服务器告诉本地域名服务器所查询的主机ip地址;
8. 本地域名服务器最后把查询到的ip地址相应给浏览器。
递归查询:
是指DNS服务器在收到用户发起的请求时,必须向用户返回一个准确的查询结果。如果DNS服务器在本地没有存储与之对应的信息,则该服务器需要询问其他的服务器,并将返回的查询结果提交给用户。
迭代查询:
是指DNS服务在收到用户发起的请求时,并不直接回复查询结果,而是告诉另一台DNS服务器的地址,用户在向这台DNS服务器提交查询请求,这样依次反复,直到返回查询结果。
A记录可实现将域名指向IP地址,也称为正向解析;
正向解析:域名---->dns服务器返回ip
PTR记录可以实现IP查询域名,也称为反向解析;
反向解析:IP----->DNS服务返回域名
当需要将域名指向另外一个域名,在由另外一个域名提供IP地址,就需要添加CNAME记录。
最常用的CNAME的场景有WAF,CDN
1. 客户端查询DNS服务,如果当前DNS无法提供权威解析,则返回一条NS记录;
2. 客户端在通过NS记录中提供的DNS权威服务器进行解析;
企业常规做法:购买域名,完成ICP备案,并使用公网DNS服务进行免费(付费)解析。
为什么需要:
1. 内网web服务,例如jenkins,jumpserver,wiki等,不适合解析至公网;
2. 内网中间件服务DB,MQ等,由于会经常迁移或扩容,应该使用域名对外提供,便于维护。
3. 服务器都要hostname,hostname应该设置为FQDN,需要维护主机名和主机的内网ip对应关系。
BIND是一个开源的,稳定的,应用广泛的DNS服务;
BIND提供域名解析服务,权威域名服务器,DNS调试工具
域名解析服务:将域名解析为IP地址;
权威域名服务:能从该服务器查询到完整域名对应的IP地址,则这台服务器就算权威解析;
DNS调试工具:主要提供DNS客户端调试工具,供客户端使用。
root@Client:~# sudo apt install -y bind9 bind9-utils
root@Client:~# systenctl start named
root@Client:~# systemcatl enable named
bind9:通过主程序包
bind9-utils:提供工具包(dig nslookup)
options{}:全局选项(监听端口,数据文件存储位置,缓存位置,权限等)
logging{}:服务日志选项
zone{}:自定义区域配置
include{}:包含文件
options 的参数设置会影响整个 BIND9 DNS环境的配置,具体各部分常用到的配置参数如下:
options{
listen-on: 用于配置监听的端口以及IPv4地址,默认的监听端口为:53;
listen-on-v6:用于监听 IPv6 地址以及端口;
directory: 用于指定读取DNS数据文件的文件夹,默认的文件夹的路径为:/var/cache/bind;
dump-file: 选项用来设置域名缓存数据库文件的位置,可以自己定义。默认的存储文件为:
named_dump.db;
statistics-file: 选项用来设置状态统计文件的位置,可以自己定义。;
memstatistics-file : 选项用来设置服务器输出的内存使用统计信息。默认保存在 /var/named/data 目录下,文件名为 named.memstats;
allow-query: 选项用来设置允许DNS查询的客户端地址,默认值为localhost, 可以设置为某个网段、任意地址、具体的某台主机三种情况。例如,要修改为任意地址,就在括号内的加入 any,也可以引用之前创建的 acl 内的所有地址;
recursion:用于设置递归查询,一般客户机和服务器之间属于递归查询,即当客户机向DNS服务器发出查询请求后,若DNS服务器本身不能解析,则会向另外的DNS服务器发出查询请求,得到结果后转交给客户机。此选项有yes和no两个值。这个选项用于设置 Failover 非常有用;
dnssec-enable: 选项用来设置是否启用DNSSEC支持,DNSSEC可以用来验证DNS数据的有效性,该选项有yes和no两个值,默认值为yes。
dnssec-validation:选项用来设置是否启用DNSSEC确认,默认值为yes,可以选择 auto。
bindkeys-file : 用来设置内置信任的密钥文件,其默认值为 /etc/named/iscdlv.key;
managed-keys-directory: 选项用于指定目录中的文件存储位置,跟踪管理 DNSSEC 密钥, 这部分的内容在后边会有介绍;
forwarders:DNS转发器。用于设定该DNS解析服务器无法进行当前域名解析的情况下,进行转发解析的DNS地址,其中 8.8.8.8 和 8.8.4.4 是谷歌的免费DNS服务器的网络地址;233.5.5.5 和 233.6.6.6 是阿里云的免费DNS地址。当设置了 forwarder 的转发器之后,所有的非本域的和在缓存中无法查找到的域名查询都转发都设置的DNS转发器,由DNS转发器 完成转发操作。因此这台转发器的缓存中就记录了丰富的域名信息。因此如果遇到非本域的查询,转发器的缓存就可以做到查询,从而减少了向外部的查询流量。
forward: 选择默认的IP地址即可;
rrset-order: 在 BIND 9 提供的负载均衡策略建立在一个名称(域名 - Name)使用多个资源记录 ( Records ) 的情况下,其实现的轮询机制并不是传统的负载均衡服务器实现的轮询机制 - 即追踪和记录每一次应答的资源顺序;
BIND 9 实现了一个类似 List 的数据结构,将所有的资源记录填入到 一个顺序表中,这个填入的次序随机,或者根据设定的参数随机;
格式:[class class_name] [type type_name] [name “domain_name”] order ordering
如果参数没有被赋值,那么默认的赋值为: class: ANY type: ANY Name: *
参数:
fixed : 根据 zone 文件定义资源记录的顺序按照顺序逐个进行解析;
random: 根据 zone 文件资源记录随机返回解析记录;
cyclic: 创建一个循环,循环输出资源记录;
none: 完全随机的资源返回形式;
}
ubuntu系统下安装bind9后的配置文件如下:
/etc/bind 配置文件路径
named.conf 主配置文件,(可以下options,logging,zone,include)
root@Client:/etc/bind# cat named.conf
## include引入定义全局选项的文件
include "/etc/bind/named.conf.options";
## 引入定义zone文件
include "/etc/bind/named.conf.local";
include "/etc/bind/named.conf.default-zones";
## 通过/etc/bind/named.conf.default-zones文件定义的zone区域,以下是记录各个zone中的详细信息
root@Client:/etc/bind# ls -l
total 48
-rw-r--r-- 1 root root 2403 5月 17 19:38 bind.keys
-rw-r--r-- 1 root root 237 8月 25 2020 db.0
-rw-r--r-- 1 root root 271 8月 25 2020 db.127
-rw-r--r-- 1 root root 237 8月 25 2020 db.255
-rw-r--r-- 1 root root 353 8月 25 2020 db.empty
-rw-r--r-- 1 root root 270 8月 25 2020 db.local
用户通过DNS服务器10.10.10.128解析www.example.com
1. 添加example.com区域配置文件;
2. 添加区域数据库文件,配置NS记录返回DNS权威 服务器地址;
3. 该区域的权威DNS地址为10.10.10.128
4. 添加该域的A记录解析
1. 定义zone区域;(可直接写在现有的zone的配置文件中,也可添加新的zone文件,在通过include进行导入。)
root@Client:/etc/bind# cat named.conf
include "/etc/bind/named.conf.options";
include "/etc/bind/named.conf.local";
include "/etc/bind/named.conf.default-zones";
## 添加新的zone文件
include "/etc/bind/laox.zone";
## 定义zone,并指定zone的详细内容在/etc/bind/example.com中
root@Client:/etc/bind# cat /etc/bind/laox.zone
zone "example.com" {
type master;
file "/etc/bind/example.com";
};
2. 编写zone区域的数据库文件 ;
## 定义zone的详细内容
root@Client:/etc/bind# cat /etc/bind/example.com
;DNS失效时间,单位不加默认为s
$TTL 1h
;区域名称 IN SOA example.com.(与区域名称一致) 邮箱
;区域名称可以用@,则表示当前区域
example.com. IN SOA example.com. root.example.com. (
2022071715 ;序列号,十进制,不能超过十位,通常使用日期时间戳2022071715
24h ;(refresh time)刷新时间,即每隔多久到主服务器查询一次
2h ;(retry time)重试时间,即刷新不成功多久后重试,应该小于refresh time
28d ;(expire time)过期时间,当辅助DNS无法联系主DNS时,辅助DNS在多长时间内认为缓存是有效的
2d ;权威应答的ttl;缓存dns服务器可以缓存记录多长时间
)
;给客户端返回NS记录
;Name Servers
example.com. IN NS ns1.example.com.
;A记录,配置权威域名的真实ip地址
ns1.example.com. IN A 10.10.10.128
;正常的域名解析
www IN A 1.1.1.1
opt IN A 2.2.2.2
xhz IN A 10.101.1.1
3. dig解析
用户通过DNS服务器10.10.10.129解析opt.example.com
1. 添加example.com区域配置文件;
2. 添加区域数据库文件,配置NS记录返回DNS权威 服务器地址;
3. 该区域的权威DNS地址为10.10.10.128
4. 添加该域的A记录解析
10.10.10.128配置
root@Client:/etc/bind# cat example.com
$TTL 1h
example.com. IN SOA example.com. root.example.com. (
2019080901
24h
2h
28d
2d
)
;Name Servers
;example.com. IN NS ns1.example.com.
;Other Servers
;ns1.example.com. IN A 10.10.10.128
.example.com. IN A 10.10.10.128
www IN A 1.1.1.1
opt IN A 2.2.2.2
xhz IN A 10.101.1.1
10.10.10.129配置
root@Route:/etc/bind# cat example.com
$TTL 1h
example.com. IN SOA example.com. root.example.com. (
2019080901
24h
2h
28d
2d
)
;Name Servers
example.com. IN NS ns1.example.com.
www.example.com. IN NS ns1.example.com.
opt.example.com. IN NS ns1.example.com.
;Other Servers
ns1.example.com. IN A 10.10.10.128
测试
用户通过DNS服务器10.10.10.128解析www.job.com
1. 添加job.com区域配置文件;
2. 添加区域数据库文件,配置NS记录返回DNS权威 服务器地址;
3. 该区域的权威DNS地址为10.10.10.128
4. 添加该域的CNAME解析记录,解析至opt.example.com域名上
配置:
## 前面opt。example.com的解析已经配置
root@Client:/etc/bind# cat job.com
$TTL 1h
job.com. IN SOA job.com. root.job.com. (
2019080901
24h
2h
28d
2d
)
;Name Servers
job.com. IN NS ns1.job.com.
;Other Servers
ns1.job.com. IN A 10.10.10.128
www IN CNAME opt.example.com.
测试
配置反向解析PTR--->ip---->FQDN
1. 反向区域文件名称为逆向网络地址,加.in-addr.arpa.后缀组成;
2. 反向区域数据库文件,例如10.0.0.200的name为200,完全格式为200.0.0.10.in-addr.arpa.
建议维护一个主机域,然后再维护主机域的反向解析,
128 PTR配置
root@ns1:/etc/bind# cat laox.zone
zone "0.0.10.in-addr.arpa" {
type master;
file "/etc/bind/0.0.10.zone";
};
root@ns1:/etc/bind#
root@ns1:/etc/bind#
root@ns1:/etc/bind# cat 0.0.10.zone
$TTL 1h
@ IN SOA 0.0.10.in-addr.arpa. root.example.com. (
2019080901
24h
2h
28d
2d
)
;Name Servers
@ IN NS ns1.example.com.
;Other Servers
128.10.10.10 IN PTR ns1.example.com.
11 IN PTR xhz.example.com.
12 IN PTR flf.example.com.
root@ns1:/etc/bind#
测试
## 通过哪个DNS来解析域名,正向解析
dig www.example.com @10.10.10.128
##通过ip解析对应的域名,反向解析
dig -x 10.0.0.11 @10.10.10.128
##通过dig仅查A记录
dig -t a example.com
##通过dig查看区域传送配置
dig -t AXFR example.com @10.10.10.128
#nslookup正向解析
nslookup opt.example.com
##nslookup 反向解析
nslookup 10.0.0.11