简介
DNS的出现及演变
网络出现的早期是使用 IP 地址进行通信. 那时就几台主机通信. 但是随着接入网络主机的增多.这种数字表示的地址非常不便于记忆, UNIX 上就出现了建立一个叫做 hosts 的文件(Linux 和 Windows 也继承保留了这个文件). 这个文件中记录着主机名称和 IP 地址的对应表. 这样只要输入主机名,系统就会去加载Hosts 文件并查找对应关系. 找到对应的 IP ,就可以访问这个 IP 的主机了.
但是后来主机的急速增加.无法保证所有人都能拿到统一的最新的 Hosts 文件,就出现了文件服务器上集中存放 Hosts 文件,以提供下载使用. 互联网规模进一步扩大,这种方式也不堪重负. 而且把所有地址解析记录形成的文件都同步到所有客户机似乎也不是一个好办法,这个时候 DNS 系统出现了,随着 解析规模继续扩大, DNS系统也在不断的演化. 直到现今的多层架构体系.
DNS概述
DNS (Domain Name System 域名系统) , 因特网上作为域名和 IP 地址相互映射的一个分布式数据库. 能够使用户更方便的访问互联网. 而不用去记住能够被访问机器直接读取的 IP 数串,通过主机名,最终得到该主机名对应的 IP 地址的过程叫做域名解析(或主机名解析). DNS 协议运行在 UDP 协议之上. 使用端口号 53.
DNS 的分布式数据库是以域名为索引的, 每个域名实际上就是一棵很大的的逆向树路径. 这棵逆向树称为域名空间(domain name space).树最大深度不得超过127层.树中每个节点都有一个可以长达63个字符的文本标号.
DNS域名解析过程
首先, 客户端现在本地缓存中查找有没有域名缓存,如果没有, 客户端发出 DNS 请求翻译 IP 地址或主机名. DNS 服务器收到客户端请求后:
1) 检查 DNS 服务器的缓存, 若查到请求的地址或者名字, 即像客户端发出应答信息.
2) 若没有查找,则在数据库中查找, 若查到请求的地址或者名字, 即像客户机发出应答信息.
3) 若没有查到, 则将请求发送给根域 DNS 服务器,并依序从根域查找顶级域名, 由顶级查找二级域, 二级域查找三级, 直至找到要解析的地址或者名字, 即像客户机所在网络的 DNS 服务器发出应答信息, DNS 服务器收到应答后先在缓存中存储,然后将解析结果发给客户机.
4) 若没有找到,则返回错误信息.
DNS的分类
主 DNS 服务器: 就是一台存储着原始资料的 DNS 服务器.
从 DNS 服务器: 使用自动更新方式从主 DNS 服务器同步数据的 DNS 服务器.也成辅助 DNS 服务器.
缓存服务器: 不负责本地解析, 返佣递归方式转发客户机查询请求. 并返回结果给客户机的 DNS 服务器, 同事缓存查询回来的结果, 也叫递归服务器.
转发器: 这台 DNS 服务器发现非本机负责查询请求时, 不在想根域发起请求, 而是直接转发给指定的一台或者多台服务器,自身并不缓存查询结果.
DNS中记录类型
SOA |
可以理解为一段为自己dns做备注说明的文本,一般与ns一致 比如:dns.laonanhai.com sa.laonanhai.com 示例: a.shifen.com. 579 IN SOA dns.baidu.com. sa.baidu.com. ( |
NS |
域的授权名称服务器 baidu.com. 64899 IN NS ns2.baidu.com. |
MX |
域的邮件交换器,要跟着一个优先级值,越小越高 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. |
A |
IPV4主机地址 |
AAAA |
IPV6主机地址 |
PTR |
解析IP的指针,反向记录 |
CNAME |
权威(正式)名称,定义别名记录 www.baidu.com. 1154 IN CNAME www.a.shifen.com. |
DNS命名规范
- 26个英文字母.
- 0-9 是个数字.
- "-" (英文中的连接符号).
- 最多63字节长度.
DIG,NSLOOKUP,HOST的介绍
HOST
host 命令也是大多系统,软件库调用的解析命令.
[root@test1 ~]# host baidu.com baidu.com has address 39.156.69.79 baidu.com has address 220.181.38.148 baidu.com mail is handled by 20 jpmx.baidu.com. baidu.com mail is handled by 20 mx50.baidu.com. baidu.com mail is handled by 10 mx.maillb.baidu.com. baidu.com mail is handled by 20 mx1.baidu.com. baidu.com mail is handled by 15 mx.n.shifen.com.
NSLOOKUP
nslookup 能够反映出是哪个 dnsserver 返回的结果.
[root@test1 ~]# nslookup baidu.com Server: 172.16.0.2 Address: 172.16.0.2#53 Non-authoritative answer: Name: baidu.com Address: 39.156.69.79 Name: baidu.com Address: 220.181.38.148
DIG
dig 返回整个解析的过程详细路径.类似 traceroute
[root@test1 ~]# dig baidu.com ; <<>> DiG 9.11.4-P2-RedHat-9.11.4-16.P2.el7_8.2 <<>> baidu.com ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 1525 ;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; MBZ: 0x0005, udp: 512 ;; QUESTION SECTION: ;baidu.com. IN A ;; ANSWER SECTION: baidu.com. 5 IN A 220.181.38.148 baidu.com. 5 IN A 39.156.69.79 ;; Query time: 26 msec ;; SERVER: 172.16.0.2#53(172.16.0.2) ;; WHEN: 五 5月 15 10:32:42 CST 2020 ;; MSG SIZE rcvd: 70
单机部署 bind9
Bind 是一款开放源码的 DNS 服务器软件, Bind 由美国加州大学 Berkeley 分校开发和维护的, 全名为 Berkeley Internet Name Domain 它是目前世界上使用最为广泛的 DNS.
软件安装
dnf install bind-utils bind bind-devel bind-chroot
修改配置文件
options { version "1.1.1"; // 版本 listen-on port 53 { 172.16.0.61; }; // 监听的地址 directory "/var/named/chroot/etc/"; // 存放 A记录位置 pid-file "/run/named/named.pid"; // pid dump-file "/var/named/chroot/var/data/binddump.db"; Statistics-file "/var/named/chroot/var/log/named_stats"; secroots-file "/var/named/chroot/var/data/named.secroots"; // recursing-file "/var/named/chroot/var/data/named.recursing"; allow-query { any; }; // 允许所有地址像我发起解析请求 zone-statistics yes; // 启用 zone 状态 memstatistics-file "/var/named/chroot/var/log/mem_stats"; // 内存状态 empty-zones-enable no; // 是否支持空 zone forwarders {114.114.114.114;8.8.8.8; }; // 转发的dns recursion yes; // dns采用递归的查询 dnssec-enable yes; // 关闭安全功能 dnssec-validation no; // 关闭互联网认证 managed-keys-directory "/var/named/dynamic"; session-keyfile "/run/named/session.key"; /* https://fedoraproject.org/wiki/Changes/CryptoPolicy */ }; // dns 日常管理 key "rndc-key" { algorithm hmac-md5; secret "X2mRmAlsf/5ULFpLBGBhSQ=="; }; controls { inet 127.0.0.1 port 953 allow { 127.0.0.1; } keys { "rndc-key"; }; }; // 日志配置 保留十份日志每份10m人日志级别waring logging { channel warning { // // named.conf // // Provided by Red Hat bind package to configure the ISC BIND named(8) DNS // server as a caching only nameserver (as a localhost DNS resolver only). // // See /usr/share/doc/bind*/sample/ for example named configuration files. // options { version "1.1.1"; // 版本 listen-on port 53 { 172.16.0.61; }; // 监听的地址 directory "/var/named/chroot/etc/"; // 存放 A记录位置 pid-file "/run/named/named.pid"; // pid dump-file "/var/named/chroot/var/data/binddump.db"; Statistics-file "/var/named/chroot/var/log/named_stats"; secroots-file "/var/named/chroot/var/data/named.secroots"; // recursing-file "/var/named/chroot/var/data/named.recursing"; allow-query { any; }; // 允许所有地址像我发起解析请求 zone-statistics yes; // 启用 zone 状态 memstatistics-file "/var/named/chroot/var/log/mem_stats"; // 内存状态 empty-zones-enable no; // 是否支持空 zone forwarders {114.114.114.114;8.8.8.8; }; // 转发的dns recursion yes; // dns采用递归的查询 dnssec-enable yes; // 关闭安全功能 dnssec-validation no; // 关闭互联网认证 managed-keys-directory "/var/named/dynamic"; session-keyfile "/run/named/session.key"; /* https://fedoraproject.org/wiki/Changes/CryptoPolicy */ }; // dns 日常管理 key "rndc-key" { algorithm hmac-md5; secret "X2mRmAlsf/5ULFpLBGBhSQ=="; }; controls { inet 127.0.0.1 port 953 allow { 127.0.0.1; } keys { "rndc-key"; }; }; // 日志配置 保留十份日志每份10m人日志级别waring logging { channel warning { file "/var/named/chroot/var/log/dns_warning" versions 10 size 10m; severity warning; print-category yes; print-severity yes; print-time yes; }; // 访问日志 channel general_dns { file "/var/named/chroot/var/log/dns_log" versions 10 size 100m; severity info; print-category yes; print-severity yes; print-time yes; }; category default { warning; }; category queries { general_dns; }; }; // zone "." IN { // type hint; // file "named.ca"; // }; include "/var/named/chroot/etc/view.conf";
编辑秘钥文件
# 生成秘钥文件命令 # rndc-confgen -r /dev/urandom -a
[root@test1 ~]# cat /etc/rndc.key key "rndc-key" { algorithm hmac-md5; secret "X2mRmAlsf/5ULFpLBGBhSQ=="; };
配置 rndc 文件
rndc(Remote Name Domain Controllerr)是一个远程管理bind的工具,通过这个工具可以在本地或者远程了解当前服务器的运行状况,也可以对服务器进行关闭、重载、刷新缓存、增加删除zone等操作。
使用rndc可以在不停止DNS服务器工作的情况进行数据的更新,使修改后的配置文件生效。
[root@test1 ~]# cat /etc/rndc.conf key "rndc-key" { algorithm hmac-md5; secret "X2mRmAlsf/5ULFpLBGBhSQ=="; }; options { default-key "rndc-key"; default-server 127.0.0.1; default-port 953; };
配置 view 视图
[root@djcy-61 log]# cat /var/named/chroot/etc/view.conf view "View" { zone "host.io" { type master; // 主 file "host.io.zone"; // zone 文件名称 allow-transfer { 172.16.0.62; // 那些地址可以向我请求数据 }; notify yes; // 发生文件变更时通知那些主机来取数据 also-notify { 172.16.0.62; }; }; zone "tcc.com" { type master; file "tcc.com.zone"; allow-transfer { 172.16.0.62; }; notify yes; also-notify { 172.16.0.62; }; }; };
配置 zone 解析文件
1 Serial:用来作为 slave 与 master 更新的依据。 master每次修改zone 文件这个需要都要加1.
2 Refresh:指定自动同步时间.
3 Retry:如果到了 Refresh 的时间,但是 slave 却无法连接到 master 时, 那么在多久之后,slave 会再次的主动尝试与主机连线;
4 Expire:如果 slave 一直无法与 master 连接上,那么经过多久的时间之后, 则命令 slave 不要再连接 master 了!
5 Minimun:和TTL类似.
[root@djcy-61 log]# cat /var/named/chroot/etc/host.io.zone $ORIGIN host.io. $TTL 600 ; 10 minutes @ IN SOA dns.host.io. dnsadmin.host.io. ( 2002 ; serial // 每次更新记录这里要 + 1 900 ; refresh (15 minutes) 600 ; retry (10 minutes) 86400 ; expire (1 day) 3600 ; minimum (10 minutes) ) NS dns.host.io. $TTL 60 ; 1 minute dns A 172.16.0.61 bjcy-61 A 172.16.0.61 bjcy-62 A 172.16.0.62 bjcy-81 A 172.16.0.81 bjcy-82 A 172.16.0.82 bjcy-200 A 172.16.0.200 bjcy-210 A 172.16.0.210 bjcy-220 A 172.16.0.220
修改目录权限检查配置文件及启动
chown -R named.named /run/named/ chown -R named.named /var/named/ [root@djcy-61 ~]# named-checkconf [root@djcy-61 ~]# named-checkzone "host.io" /var/named/chroot/etc/host.io.zone zone host.io/IN: loaded serial 2002 OK [root@djcy-61 ~]# named-checkzone "tcc.com" /var/named/chroot/etc/tcc.com.zone zone tcc.com/IN: loaded serial 2003 OK systemctl start named systemctl enable name
从节点配置
安装软件
dnf install bind-utils bind bind-devel bind-chroot
配置主配置文件
options { version "1.1.1"; // 版本 listen-on port 53 { 172.16.0.62; }; // 监听的地址 directory "/var/named/chroot/etc/"; // 存放 A记录位置 pid-file "/run/named/named.pid"; // pid dump-file "/var/named/chroot/var/data/binddump.db"; Statistics-file "/var/named/chroot/var/log/named_stats"; secroots-file "/var/named/chroot/var/data/named.secroots"; // recursing-file "/var/named/chroot/var/data/named.recursing"; allow-query { any; }; // 允许所有地址像我发起解析请求 zone-statistics yes; // 启用 zone 状态 memstatistics-file "/var/named/chroot/var/log/mem_stats"; // 内存状态 empty-zones-enable no; // 是否支持空 zone forwarders {114.114.114.114;8.8.8.8; }; // 转发的dns recursion yes; // dns采用递归的查询 dnssec-enable yes; // 关闭安全功能 dnssec-validation no; // 关闭互联网认证 managed-keys-directory "/var/named/dynamic"; session-keyfile "/run/named/session.key"; /* https://fedoraproject.org/wiki/Changes/CryptoPolicy */ }; // dns 日常管理 key "rndc-key" { algorithm hmac-md5; secret "X2mRmAlsf/5ULFpLBGBhSQ=="; }; controls { inet 127.0.0.1 port 953 allow { 127.0.0.1; } keys { "rndc-key"; }; }; // 日志配置 保留十份日志每份10m人日志级别waring logging { channel warning { file "/var/named/chroot/var/log/dns_warning" versions 10 size 10m; severity warning; print-category yes; print-severity yes; print-time yes; }; // 访问日志 channel general_dns { file "/var/named/chroot/var/log/dns_log" versions 10 size 100m; severity info; print-category yes; print-severity yes; print-time yes; }; category default { warning; }; category queries { general_dns; }; }; // zone "." IN { // type hint; // file "named.ca"; // }; include "/var/named/chroot/etc/view.conf";
配置view视图文件
[root@djcy-62 ~]# cat /var/named/chroot/etc/view.conf view "View" { zone "host.io" { type slave; masters {172.16.0.61; }; masterfile-format text; file "slave.host.io.zone"; }; zone "tcc.com" { type slave; masters {172.16.0.61; }; masterfile-format text; file "slave.tcc.com.zone"; }; };
编辑秘钥文件
# 生成秘钥文件命令 # rndc-confgen -r /dev/urandom -a
[root@test1 ~]# cat /etc/rndc.key key "rndc-key" { algorithm hmac-md5; secret "X2mRmAlsf/5ULFpLBGBhSQ=="; };
配置 rndc 文件
[root@test1 ~]# cat /etc/rndc.conf key "rndc-key" { algorithm hmac-md5; secret "X2mRmAlsf/5ULFpLBGBhSQ=="; }; options { default-key "rndc-key"; default-server 127.0.0.1; default-port 953; };
检查配置修改权限并启动
chown -R named.named /run/named/ chown -R named.named /var/named/ [root@djcy-61 ~]# named-checkconf systemctl start named systemctl enable name # 如果没问题回自动同步文件 [root@djcy-62 etc]# pwd /var/named/chroot/etc [root@djcy-62 etc]# ll total 20 drwxr-x--- 3 named named 23 Aug 2 17:08 crypto-policies -rw-r--r-- 1 named named 405 Aug 2 17:15 db-mJETa6Wy -rw-r--r-- 1 named named 189 Aug 2 17:15 db-YAKlPalf drwxr-x--- 2 named named 6 Jul 7 22:14 named drwxr-x--- 3 named named 25 Aug 2 17:08 pki -rw-r--r-- 1 named named 498 Aug 2 23:14 slave.host.io.zone -rw-r--r-- 1 named named 346 Aug 2 23:17 slave.tcc.com.zone -rw-r--r-- 1 named named 318 Aug 2 17:23 view.conf
添加解析记录
A记录
[root@djcy-61 ~]# cat /var/named/chroot/etc/host.io.zone 2002 ; serial # 加一 bjcy-224 A 172.16.0.224 # 新增 [root@djcy-61 ~]# rndc reload # reload 同步 WARNING: key file (/etc/rndc.key) exists, but using default configuration file (/etc/rndc.conf) server reload successful
解析
[root@djcy-61 ~]# dig -t A bjcy-224.host.io @172.16.0.61 +short 172.16.0.224
CNAME记录
也就是把域名解析到另外一个域名上
[root@djcy-61 ~]# cat /var/named/chroot/etc/host.io.zone 2003 ; serial bjcy-61 A 172.16.0.61 www CNAME bjcy-61.host.io. [root@djcy-61 ~]# rndc reload WARNING: key file (/etc/rndc.key) exists, but using default configuration file (/etc/rndc.conf) server reload successful
解析
[root@djcy-61 ~]# host www.host.io www.host.io is an alias for bjcy-61.host.io. bjcy-61.host.io has address 172.16.0.61
MX记录
[root@djcy-61 ~]# cat /var/named/chroot/etc/host.io.zone 2004 ; serial max MX 5 172.16.0.50 [root@djcy-61 ~]# rndc reload WARNING: key file (/etc/rndc.key) exists, but using default configuration file (/etc/rndc.conf) server reload successful
解析
[root@djcy-61 ~]# host max.host.io max.host.io mail is handled by 5 172.16.0.50.host.io.
PTR记录
配置view
[root@djcy-61 ~]# cat /var/named/chroot/etc/view.conf zone "16.172.in-addr.arpa" { type master; file "16.172.zone"; allow-transfer { 172.16.0.62; }; notify yes; also-notify { 172.16.0.62; }; };
配置zone文件
[root@djcy-61 ~]# cat /var/named/chroot/etc/16.172.zone $TTL 3600 ; 1 hour @ IN SOA dns.host.io. dnsadmin.host.io. ( 2004 ; serial 900 ; refresh (15 minutes) 600 ; retry (10 minutes) 86400 ; expire (1 day) 3600 ; minimum (1 hour) ) NS dns.host.io. 61.0 IN PTR bjcy-61.host.io. 62.0 IN PTR bjcy-62.host.io. 81.0 IN PTR bjcy-81.host.io. 82.0 IN PTR bjcy-82.host.io. 200.0 IN PTR bjcy-200.host.io.
权限重启
[root@djcy-61 ~]# chown named.named -R /var/named/ [root@djcy-61 ~]# rndc reload WARNING: key file (/etc/rndc.key) exists, but using default configuration file (/etc/rndc.conf) server reload successful
从节点配置view文件
[root@djcy-61 etc]# cat view.conf zone "16.172.in-addr.arpa" { type master; file "16.172.zone"; allow-transfer { 172.16.0.62; }; notify yes; also-notify { 172.16.0.62; }; };
权限及重启
[root@djcy-61 ~]# chown named.named -R /var/named/ [root@djcy-61 ~]# rndc reload WARNING: key file (/etc/rndc.key) exists, but using default configuration file (/etc/rndc.conf) server reload successful
智能DNS
主要根据 ACL 来源限制,给出不同的后端服务器
主配置文件配置
vim /etc/named.conf
acl group1 { 192.168.1.0/24; }; acl group2 { 172.16.0.0/24; };
view视图配置
vim /var/named/chroot/etc/view.conf view "GROUP1" { match-clients { group1; }; zone "host.io" { type master; file "group1.host.io.zone"; }; }; view "GROUP2" { match-clients { group2; }; zone "host.io" { type master; file "group2.host.io.zone"; }; };
zone文件配置
group1.host.io.zone 同 group2.host.io.zone 只有解析IP有区别 [root@djcy-61 ~]# cat /var/named/chroot/etc/host.io.zone $ORIGIN host.io. $TTL 600 ; 10 minutes @ IN SOA dns.host.io. dnsadmin.host.io. ( 2002 ; serial 900 ; refresh (15 minutes) 600 ; retry (10 minutes) 86400 ; expire (1 day) 3600 ; minimum (10 minutes) ) NS dns.host.io. $TTL 60 ; 1 minute dns A 172.16.0.61 bjcy-62 A 172.16.0.62
DNS压测监控
压测
需要下载源码包 编译之后生成一个 queryperf 命令.
下载bind源码:wget http://ftp.isc.org/isc/bind9/9.7.3/bind-9.7.3.tar.gz 解压bind源码:tar zxf bind-9.7.3.tar.gz 进入解压后bind源码目录:cd bind-9.7.3/contrib/queryperf/ 编译:./configure make 会在当前目录下出现queryperf,可以将它拷贝至/usr/bin/下 编辑域名记录文件(test.txt),格式如下: www.baidu.com A www.baidu.com A www.baidu.com A www.baidu.com A www.baidu.com A 压测命令:queryperf -d test.txt -s 8.8.8.8
监控
系统基础性能
使用zabbix自带模板即可。Cpu、内存、主机存活、磁盘空间、主机运行时间、系统load.
Loopback地址绑定状态监控
该架构中,dnsserver在集群中充当realserver的角色,在dr中,需要绑定loopback地址方能通信,因此当loopback地址没有绑定上时,lvs健康检测通过,但是当请求到达dnsserver时,请求被拒绝,dns集群会出现异常。
Dns数据与master一致性监控
此处我的方案是分为两部分:
一是通过写zabbix自定义discovery,扫出dns配置中所有zone,然后分别对比slave和master每个zone的serial值,当slave与master的值持续5分钟不一致时报警
二是写脚本,每15分钟扫一遍master上所有域名解析结果,与每个slave的结果做对比,当出现结果不一致情况时,报警
Dns响应时间监控
远端一组主机跑在fullnat下(提供高可用),通过dig命令检测dnsserver的响应时间。
Dns每秒请求数监控
在每台dns主机上,编写zabbix脚本,分析named_stats文件,获取每秒请求数
#!/bin/bash #rndc stats STATS='/var/named/chroot/var/log/named_stats' if [[ $# -ne 1 ]] then echo "$0 [querys]" exit 2 else which=$1 fi if [[ -f "${STATS}" ]] then echo > ${STATS} rndc stats >/dev/null 2>&1 else echo "${STATS} not found." exit 2 fi case ${which} in querys) RESULT=`awk '{if ($2=="QUERY") {print $1}}' ${STATS}` ;; *) echo "$0 [querys]" exit 2 ;; esac echo ${RESULT}
Dns可用性监控
远端一组主机跑在fullnat下(提供高可用),通过host命令检测dnsserver的可用性,脚本与lvs健康检测脚本类似。