Bind9+NamedManager构建高可用DNS服务器
分类:linux日期:2018-10-29 - 10:11:04作者:老谢
这两天在学习DNS,经过两天的折腾对DNS终于有了一些了解,以下内容大部分来自网络,本文只是整理记录以便自己回顾学习的目的,本文建立在已知DNS作用的情况下。
1. 基本概念
1.1 域名
域名分为三个部分,用“.”(点)分割。严格的域名最后还有一个”.”,但一般省略不写。
举例来说,www.example.com真正的域名是www.example.com.root,简写为www.example.com.。因为,根域名.root对于所有域名都是一样的,所以平时是省略的。
根域名的下一级,叫做”顶级域名”(top-level domain,缩写为TLD),比如.com、.net;再下一级叫做”次级域名”(second-level domain,缩写为SLD),比如www.example.com里面的.example,这一级域名是用户可以注册的;再下 一级是主机名(host),比如www.example.com里面的www,又称为”三级域名”,这是用户在自己的域里面为服务器分配的名称,是用户可以任意分配的。
总结一下,域名的层级结构如下。
主机名.次级域名.顶级域名.根域名
# 即
host.sld.tld.root -类型 标识此域名的类型(com/net/org/edu/gov/info/xyz/cc/...) -域名 域名称 -主机名 该域中的某台主机名称 例如:laoxie.me www: 主机名 xj123:域名称 info: 类型 |
1.2 DNS服务器
每个域名代表一IP,而DNS就是用来在IP与域名之间进行转换的服务,由DNS服务器处理DNS客户端请求,返回DNS记录给DNS客户端此过程成为递归查询(Recursive Query),由DNS服务器向其他DNS服务器请求返回并存入自己的DNS缓存,此过程成为迭代查询(Iterative Query),DNS服务器按级别可以分为:
- 1.根域名服务器(.root)
- 2.顶级域名服务器(.com .cn .net等)
- 3.权威域名服务器(例如:阿里万网提供的dns9.hichina.com,dns10.hichina.com等,腾讯DNSPod提供的 f1g1ns1.dnspod.net,f1g1ns2.dnspod.net等,自己申请搭建的权威域名服务器等)
- 4.本地域名服务器(设备连上网要么会自动分配,或者自己手动指定的本地域名服务器)
- 5.公共域名服务器(例如:google提供的8.8.8.8,国内公共域名服务器:114.114.114.114等)
按用途也可以分为:
- 1.主DNS服务器(Primary DNS Server ,Master):一个域的主服务器保存该域的zone配置文件,该域所有的配置、更改都在该服务器上进行
- 2.从服务器(Second DNS Server,Slave):从服务器一般作为冗余负载使用,一个域的从服务器从该域的主服务器上抓取zone配置文件,从服务器不进行信息修改,所有的修改与主服务器同步
- 3.缓存服务器(Caching only Server):DNS缓存服务器不存在任何zone文件,仅仅依靠缓存作为客户端提供服务,通常用于负载均衡及加速访问使用
DNS域名解析流程(laoxie.me):
- 1.客户端查询本机DNS缓存laoxie.me对应的IP地址(hosts文件配置,机器一启动就会加载到本机DNS缓存中)
- 2.如果没有找到,客户端查询本地配置的域名服务器(即:本地域名服务器,可以是第三方提供的公共域名服务器)
- 3.如果本地域名服务器没有查到,则由本地域名服务器迭代查询根域名服务器
- 4.根域名服务器返回.xyz顶级域名对应的NS记录(即解析.xyz顶级域名的权威域名服务器)
- 5.本地域名服务器根据.xyz的NS记录,查询出xj123.info二级域名的NS记录(即xj123.info二级域名的权威域名服务器)
- 6.本地域名服务器根据xj123.info的NS记录,查询出laoxie.me域名的IP地址并缓存起来
- 7.本地域名服务器返回客户端laoxie.me域名对应的IP地址,客户端收到IP地址并缓存起来
原理:
- 1.从”根域名服务器”查到”顶级域名服务器”的NS记录和A记录(IP地址)
- 2.从”顶级域名服务器”查到”次级域名服务器”的NS记录和A记录(IP地址)
- 3.从”次级域名服务器”查出”主机名”的IP地址
1.3 资源记录
在DNS服务器上,DNS的信息通过一个叫做资源记录(RR,Resource Record)的格式进行保存,RR不仅能够保存域名到IP地址的对应信息,还能够保存很多其它信息,一个ZONE必须以SOA启示,称为“起始授权记录”,FQDN指完全限定域,如mail.xj123.ifno即为一个FQDN。
资源记录(RR,Resource Record)常用的属性: - NAME(名称) - CLASS(类别) - TYPE(类型) - RDATA(数据) NAME CLASS TYPE RDATA www IN(Internet) A 192.168.1.1 mail IN A 192.168.1.2 server1 IN CNAME www IN MX 10 mail.linuxcast.net |
- SOA:Start Of Authority,起始授权记录; 一个区域解析库有且只能有一个SOA记录,而且必须放在第一条;
- NS:Name Service,域名服务记录;一个区域解析库可以有多个NS记录;其中一个为主的;
- A: Address, 地址记录,FQDN –> IPv4;
- AAAA:地址记录, FQDN –> IPv6;
- CNAME:Canonical Name,别名记录;
- PTR:Pointer,IP –> FQDN
- MX:Mail eXchanger,邮件交换器;
- 优先级:0-99,数字越小优先级越高;
#资源记录的定义格式:
语法:name [TTL] IN RR_TYPE value
SOA: name: 当前区域的名字;例如”mageud.com.”,或者“2.3.4.in-addr.arpa.”; value:有多部分组成 (1) 当前区域的区域名称(也可以使用主DNS服务器名称); (2) 当前区域管理员的邮箱地址;但地址中不能使用@符号,一般使用点号来替代; (3) (主从服务协调属性的定义以及否定答案的TTL) 例如: baidu.com. 86400 IN SOA baidu.com. admin.magedu.com. ( 2017010801 ; serial 2H ; refresh 10M ; retry 1W ; expire 1D ; negative answer ttl ) NS: name: 当前区域的区域名称 value:当前区域的某DNS服务器的名字,例如ns.magedu.com.; 注意:一个区域可以有多个ns记录; 例如: baidu.com. 86400 IN NS ns1.baidu.com. baidu.com. 86400 IN NS ns2.baidu.com. MX: name: 当前区域的区域名称 value:当前区域某邮件交换器的主机名; 注意:MX记录可以有多个;但每个记录的value之前应该有一个数字表示其优先级; 例如: baidu.com. IN MX 10 mx1.baidu.com. baidu.com. IN MX 20 mx2.baidu.com. A: name:某FQDN,例如www.baidu.com. value:某IPv4地址; 例如: www.baidu.com. IN A 1.1.1.1 www.baidu.com. IN A 1.1.1.2 bbs.baidu.com. IN A 1.1.1.1 AAAA: name:FQDN value: IPv6 PTR: name:IP地址,有特定格式,IP反过来写,而且加特定后缀;例如1.2.3.4的记录应该写为4.3.2.1.in-addr.arpa.; value:FQND 例如: 4.3.2.1.in-addr.arpa. IN PTR www.baidu.com. CNAME: name:FQDN格式的别名; value:FQDN格式的正式名字; 例如: web.baidu.com. IN CNAME www.baidu.com. 注意: (1) TTL可以从全局继承; (2) @表示当前区域的名称; (3) 相邻的两条记录其name相同时,后面的可省略; (4) 对于正向区域来说,各MX,NS等类型的记录的value为FQDN,此FQDN应该有一个A记录; |
1.4 ZONE
在DNS服务器中,一般一个域通过一个ZONE文件保存该域的相关信息,zone文件的格式是标准化的,不同的资源记录对应不同的写法,一个典型的zone配置文件内容如下:
STTL ID @ IN SOA @rname.invalid. ( 0 : serial (序列号,DNS服务器修改过一次序列号加1,从服务器发现序列号和自己不一样就会自动更新) 1D : refresh (刷新时间,1D=1天) 1H : retry (重试, 1H=1小时) 1W : expire 3H ); minimum (上面一般直接使用默认的就可以) NS @ MX 10 mail.linuxcast.net www IN A 192.168.1.100 mail IN A 192.168.1.200 |
1.5 高级查询
默认dig命令只能查询我们通过dig命令查询其他类型的资源记录:
$ dig -t mx linuxcast.net $ dig -x www.linuxcast.net 进行逆向解析 $ dig -t soa linuxcast.net |
2. 什么是BIND
现在使用最为广泛的DNS服务器软件是BIND(Berkeley Internet Name Domain),最早有伯克利大学的一名学生编写,现在最新的版本是9,由ISC(Internet Systems Consortium)编写和维护,BIND支持先今绝大多数的操作系统(Linux,UNIX,Mac,Windows),BIND服务的名称称之为named,DNS默认使用UDP、TCP协议,使用端口为53(domain),953(mdc,远程控制使用)。
BIND在9.x版本后支持DLZ模式,可以将DNS记录存入MySQL数据库,但为了从头学起BIND,还是使用配置文件的方式更好,而NamedManager虽然也提供了WEB界面,但实际上是操作Linux上的文件。
2.1 BIND配置文件说明
1、BIND配置文件保存在两个位置: /etc/named.conf - BIND服务主配置文件 /var/named/ - zone文件(域的dns信息) 如果安装了bind-chroot(其中chroot是 change root 的缩写),BIND会被封装到一个伪根目录内,配置文件的位置变为: /var/named/chroot/etc/named.conf - BIND服务主配置文件 /var/named/chroot/var/named/ - zone文件 chroot是通过相关文件封装在一个伪根目录内,已达到安全防护的目的,一旦程序被攻破,将只能访问伪根目录内的内容,而不是真实的根目录 2、BIND安装好之后不会有预制的配置文件,但是在BIND的文档文件夹内(/usr/share/doc/bind-9.9.4),BIND为我们提供了配置文件模板,我们可以直接拷贝过来: cp -r /usr/share/doc/bind-9.9.4/sample/etc/* /var/named/chroot/etc/ cp -r /usr/share/doc/bind-9.9.4/sample/var/* /var/named/chroot/var/ 3、配置BIND服务的主配置文件(/var/named/chroot/etc/named.conf),命令:vim /var/named/chroot/etc/named.conf; |
3. 正式开始配置
NamedManager 是一个基于Web的DNS管理系统,可用来添加、调整和删除DNS的zones/records数据。它使用Bind作为底层DNS服务,提供一个现代Ajax的Web界面,支持 IPv4和IPv6。该应用程序很稳定,在生产环境中使用没有任何问题。过多的介绍在此就不做说明了,下面说下NamedManager环境部署过程:
Bind9+NamedManager
#地址规划 #目的:两台均配置BIND9及NamedManager,在192.168.10.1上配置NamedManager-WEB ns1.demo.com 192.168.10.1 ns2.demo.com 192.168.10.2 |
开始配置
hostname ns1.demo.com vim /etc/sysconfig/network #修改主机名为ns1.demo.com cat /etc/hosts 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 192.168.20.1 ns1.demo.com 192.168.20.2 ns2.demo.com cd wget http://repos.jethrocarr.com/pub/amberdms/linux/centos/6/amberdms-custom/i386/namedmanager-bind-1.8.0-1.el6.noarch.rpm wget http://repos.jethrocarr.com/pub/amberdms/linux/centos/6/amberdms-custom/i386/namedmanager-www-1.8.0-1.el6.noarch.rpm yum install perl httpd mod_ssl mysql-server php php-intl php-ldap php-mysql php-soap php-xml vim /etc/httpd/conf/httpd.conf #ServerName修改为 ns1.demo.com:80 主机名一定要与实际的主机名一致 service mysqld start service httpd start chkconfig mysqld on chkconfig httpd on mysqladmin -u root password 123456 #初始化MySQL密码,5.7以后的版本会自动生成默认密码,可以在日志中查看到自动生成的默认密码 rpm -Uvh namedmanager-www-1.8.0-1.el6.noarch.rpm cd /usr/share/namedmanager/resources/ ./autoinstall.pl This script setups the NamedManager database components: * NamedManager MySQL user * NamedManager database * NamedManager configuration files THIS SCRIPT ONLY NEEDS TO BE RUN FOR THE VERY FIRST INSTALL OF NAMEDMANAGER. DO NOT RUN FOR ANY OTHER REASON Please enter MySQL root password (if any): 123456 //输入mysql密码 Searching ../sql/ for latest install schema... ../sql//version_20131222_install.sql is the latest file and will be used for the install. Importing file ../sql//version_20131222_install.sql Creating user... Updating configuration file... DB installation complete! You can now login with the default username/password of setup/setup123 at http://localhost/namedmanager cd yum install bind php-process rpm -Uvh namedmanager-bind-1.8.0-1.el6.noarch.rpm cp /etc/named.conf /etc/named.conf.bak vim /etc/named.conf options { listen-on port 53 { any; }; // listen-on-v6 port 53 { ::1; }; 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"; allow-query { any; }; allow-query-cache { any; }; //DNS查询的缓存功能。实际上不建议开启此功能,即删除这一行配置。如果打开了,当DNS解析修改后,因为缓存原因,需等待一段时间才能生效。 recursion yes; forward first; forwarders { 223.5.5.5; 223.6.6.6; 8.8.8.8; 8.8.4.4; }; dnssec-enable yes; dnssec-validation yes; dnssec-lookaside auto; bindkeys-file "/etc/named.iscdlv.key"; managed-keys-directory "/var/named/dynamic"; }; logging { channel default_debug { file "data/named.run"; severity dynamic; }; }; zone "." { type hint; file "named.ca"; }; include "/etc/named.rfc1912.zones"; include "/etc/named.root.key"; include "/etc/named.namedmanager.conf"; #vi /etc/cron.d/namedmanager-bind 会自动创建一个crond任务,用于解析记录同步到/var/named #/usr/share/namedmanager/bind/namedmanager_bind_configwriter.php 同步脚本 |
如果要bind可以在chroot的模式下运行
yum install bind-chroot #建立“/etc/named.namedmanager.conf”文件的硬连接 ln /etc/named.namedmanager.conf /var/named/chroot/etc/named.namedmanager.conf 如果不建立硬连接named启动时,会提示找不到“/etc/named.namedmanager.conf”。 这是因为: bind-chroot是bind的一个功能,使bind可以在一个chroot的模式下运行。也就是说,bind运行时的/(根)目录,并不是系统真正的/(根)目录,只是系统中的一个子目录而已。 这样做的目的是为了提高安全性。因为在chroot的模式下,bind可以访问的范围仅限于这个子目录的范围里,无法进一步提升,进入到系统的其他目录中。 chroot可以改变程序运行时所参考的根目录(/)位置,即将某个特定的子目录作为程序的虚拟根目录,并且对程序运行时可以使用的系统资源,用户权限和所在目录进行严格控制,程序只在这个虚拟的根目录下具有权限,一旦跳出该目录就无任何权限。例如在centos中,/var/name/chroot实际上是根目录(/)的虚拟目录,所以虚拟目录中的/etc目录实际上是/var/named/chroot/etc目录,而/var/named目录实际上是/var/named/chroot/var/named目录。chroot功能的优点是:如果有黑客通过Bind侵入系统,也只能被限定在chroot目录及其子目录中,其破坏力也仅局限在该虚拟目录中,不会威胁到整个服务器的安全。 |
启动named服务
service named start chkconfig named on cp /etc/namedmanager/config-bind.php /etc/namedmanager/config-bind.php.bak vim /etc/namedmanager/config-bind.php ....... $config["api_url"] = "http://192.168.10.1/namedmanager"; // 应用程序的安装位置 $config["api_server_name"] = "dns.kevin.cn"; // 此处必须与httpd配置里的Name Server名称一致 $config["api_auth_key"] = "Dns"; ...... |
设置防火墙
setenforce 0 getenforce vim /etc/sysconfig/selinux ....... SELINUX=disabled ....... iptables -F iptables -P INPUT DROP iptables -P FORWARD DROP iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A INPUT -i lo -p all -j ACCEPT iptables -A INPUT -p icmp -j ACCEPT iptables -A INPUT -p tcp --dport 22 -j ACCEPT iptables -A INPUT -p tcp --dport 53 -j ACCEPT iptables -A INPUT -p udp --dport 53 -j ACCEPT iptables -A INPUT -p tcp --dport 80 -j ACCEPT iptables -A INPUT -p tcp --dport 443 -j ACCEPT service iptables save chkconfig httpd on chkconfig mysqld on chkconfig named on |
打开http://192.168.10.1/namedmanager默认用户名setup/setup123,登录进以后添加ns服务器,API_KEY在/etc/namedmanager/config-bind.php中配置,上述配置中为Dns,然后在192.168.20.2中相同配置,但只需要安装namedmanager-bind-1.8.0-1.el6.noarch.rpm这个包即可,不需要Apache和MySQL,然后在namedmanager中添加,注意需要填写正确的KEY以及域和对应的NS记录,否则无法成功同步文件!
#参考资料
https://www.cnblogs.com/kevingrace/p/8735193.html
https://www.cnblogs.com/f-ck-need-u/p/7367503.html#auto_id_0
https://guozeyu.com/2016/08/self-host-dns/
https://www.cnblogs.com/Kelly123/p/4225290.html
2018.11.08
最近发现两台DNS服务器的日志已经好几天无法同步了,手动执行了crond里面的日志脚本依然显示同步失败,一时半会找不到问题,先放着留以后更新吧,至少DNS服务和ZONE文件的同步是正常的……
找到问题了,不去修改zone配置就没有配置日志同步。
2018.12.12 关闭Bind的递归查询
有一台NS服务器突然无法访问,一查才发现流量跑完了,看了下历史记录发现上个月开始流量猛增,最高一天跑到接近70G的流量,显然这是非常不正常的,突然想到会不会是递归查询没关,被拿去当作递归DNS服务器用了,于是先把服务器加入了Zabbix监控中,关闭递归查询后带宽正常,一打开瞬间流量增加:
问题妥妥找到了,作为权威DNS服务器,不需要对外提供递归查询,于是乎关闭递归查询即可,关闭方法是在options中添加allow-recursion { none; };即可关闭递归查询功能,例如:
options { listen-on port 53 { any; }; // listen-on-v6 port 53 { ::1; }; 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"; allow-query { any; }; // allow-query-cache { any; }; recursion yes; allow-recursion { none; }; forward first; forwarders { 223.5.5.5; 223.6.6.6; 8.8.8.8; 8.8.4.4; }; dnssec-enable yes; dnssec-validation yes; dnssec-lookaside auto; bindkeys-file "/etc/named.iscdlv.key"; managed-keys-directory "/var/named/dynamic"; }; |
收藏备用哈。