DNS:Domain Name Service 应用层协议,采用C/S构架
使用端口53/udp用于地址解析, 53/tcp用于主从同步,953/tcp用于rndc(remove netservice domain controler)
DNS名称解析name resolving FQDN<--->IP
nsswitch名称解析framework
使用本地stub resolver 读取配置文件/etc/nsswitch.conf,通过库调用读取本地是否有对应记录,没有则通过库调用执行dns解析。
本地hosts文件结构
IPADDR FQDN Ailases
域名结构
根域
一级域名: Top Level Domain: tld
com, edu, mil, gov, net, org, int,arpa
三类:组织域、国家域(.cn, .ca, .hk, .tw)、 反向域
二级域名
三级域名
最多127级域名
一条域名的解析过程:
首先查找本地/etc/hosts是否有记录,有则使用本地记录(可以修改优先级),没有找到则向本地DNS服务器发送请求,服务器,首先查询自己缓存,缓存中有直接返回值,没有则向根域名服务器发送请求(对于DNS服务器只是单向的,自顶而下,不知上级域名服务器是哪一个,但是都有根服务器的地址),根返回(这里是com)服务器中一个,本地NS继续向com服务器发送域名解析查询,域名服务器返回目标服务器NSIP(如果存在),本地NS继续向目标NS服务器发送域名解析查询,目标NS返回查询结果,本地NS服务器把记录加入缓存。
迭代查询:对于local-NS而言,它所工作方式就是迭代查询,每次NS向不同服务服务器发送请求并返回结果;
递归查询:对于client而言,它的查询就是递归的,它把请求给local ns,等待ns返回结果;
1.Bind中的socket采用的是epoll模型
2.Bind业务处理主要要关注一个run函数和isc_app_run函数
3.Bind运行主要是两个线程和一个do while循环
main() { ... setup();//初始化工作 / * Start things running and then wait for a shutdown request or reload. */ do { result = isc_app_run(); //启动APP if (result == ISC_R_RELOAD) { ns_server_reloadwanted(ns_g_server); //如果重启加载 } else if (result != ISC_R_SUCCESS) { ... result = ISC_R_SUCCESS; } } while (result != ISC_R_SUCCESS); ...}
在setup函数里初始化配置相关,比较庞杂,这里主要关注create_managers里,有两个重要的函数isc_taskmgr_create、isc_socketmgr_create2这两个函数分别起两个线程,分别是run和watcher。分别处理任务队列。和监听socket管理相关。
这个do while循环,主要是result = isc_app_run();这个函数实际上等待各种结束程序信号,处理业务,如果需要重启服务调用ns_server_reloadwanted。
run主要执行的代码是dispatch(manager),dispath主要执行的是(event->ev_action)( (isc_task_t *)task,event);处理事件相关
watch主要执行的代码是result = watch_fd(manager, fd, msg);在watch_fd中,关键代码是epoll_ctl(manager->epoll_fd, EPOLL_CTL_ADD, fd, &event),这里重新注册epoll事件,然后epoll_wait再等待,而后再处理,如此反复。
DNS主从
主DNS服务器
从DNS服务器
缓存DNS服务器(转发器)
主DNS服务器:管理和维护所负责解析的域内解析库的服务器
从DNS服务器:从主服务器或从服务器“复制”(区域传输)解析库副本
序列号:解析库版本号,主服务器解析库变化时,其序列递增
刷新时间间隔:从服务器从主服务器请求同步解析的时间间隔
重试时间间隔:从服务器请求同步失败时,再次尝试时间间隔
过期时长:从服务器联系不到主服务器时,多久后停止服务
“通知”机制:主服务器解析库发生变化时,会主动通知从服务器
1在配置文件定时同步间隔时间refresh time同步
2修改文件后,使用rndc -c 从服务器key文件 notify,通知从更新需要同步
区域传输:
完全传输axfr:传送整个解析库
增量传输ixfr:传递解析库变化的那部分内容
bind berkely Internet name domain
资源记录:
域domain和区域zone:
domain 逻辑概念
zone 物理概念
主main
从slave
提示区hint(定义根)
转发区forward(直接定义到哪里找)
主配置文件和区域数据文件配置
主配置文件 /etc/named.conf
区域数据文件 /var/named/
option { diretory "/var/named" ; }; zone "." IN { type hint; file "named.ca"; #数据文件位置,相对于前面定义目录的位置 }; zone "magedu.com." IN { type slave; #slave需要定义主服务器地址 file "xx.db"; master {master1_ip;master2_ip; }; };
最基本的一个named.conf配置文件
options { directory "/var/named" ; }; zone "." IN { type hint; file "named.ca"; }; zone "localhost" IN { type master; file "named.localhost"; }; zone "0.0.127.in-addr.arpa" IN { type master; file "med.loopback"; };
检查配置文件
[root@localhost ~]# chmod 640 /etc/named.conf [root@localhost ~]# chown root:named /etc/named named/ named.iscdlv.key named.root.key named.conf named.rfc1912.zones [root@localhost ~]# chown root:named /etc/named.conf [root@localhost ~]# ls -l /etc/named.conf -rw-r-----. 1 root named 233 Jul 28 17:46 /etc/named.conf [root@localhost ~]# named-checkconf /etc/named.conf:2: unknown option ‘option‘
少了个s修改配置文件
[root@localhost ~]# named-checkconf [root@localhost ~]# named-checkzone "." /var/named/named.ca zone ./IN: has 0 SOA records zone ./IN: not loaded due to errors. [root@localhost ~]# named-checkzone "0.0.127.in-addr.arpa" /var/named/named.loopback zone 0.0.127.in-addr.arpa/IN: loaded serial 0 OK
错误日志位置/var/log/messages
Jul 28 17:36:56 localhost systemd: Started Generate rndc key for BIND (DNS). Jul 28 17:36:56 localhost systemd: Starting Berkeley Internet Name Domain (DNS)... Jul 28 17:36:57 localhost bash: zone localhost/IN: loaded serial 0 Jul 28 17:36:57 localhost bash: zone 0.0.127.in-addr.arpa/IN: loading from master file med.loopback failed: file not found Jul 28 17:36:57 localhost bash: zone 0.0.127.in-addr.arpa/IN: not loaded due to errors. Jul 28 17:36:57 localhost bash: _default/0.0.127.in-addr.arpa/IN: file not found Jul 28 17:36:57 localhost systemd: named.service: control process exited, code=exited status=1 Jul 28 17:36:57 localhost systemd: Failed to start Berkeley Internet Name Domain (DNS). Jul 28 17:36:57 localhost systemd: Unit named.service entered failed state. Jul 28 17:36:57 localhost systemd: named.service failed. named-checkconfig#只检查语法错误,不检查逻辑错误,重启服务时候,就会反应出来,这里file有个文件名写错了
在主配置文件中定义zone,在/var/named/下创建对应文件名的zone文件:
$TTL 600 magedu.com.(或者用@) IN SOA ns1.nmagedu.com.(NS) mail.magedu.com. ( 20170727 2H 同步 间隔 5M 重试时间 2D expiretime 6H 缓存时间) (与上面相同可省) IN NS ns1(后面可省与域相同) IN MX 10 mail ns1 IN A 172.16.253.116 mail IN A 172 www IN A 172 WWW IN A 172 ftp IN CNAME www
反向区域 必须写完整FQDN
$TTL 600 0.0.172.in-addr.arpa(或者@) IN SOA ns1.nmagedu.com.(NS) mail.magedu.com. ( 20170727 2H 同步 间隔 5M 重试时间 2D expiretime 6H 缓存时间) (与上面相同可省) IN NS ns1magedu.com. IN MX 10 mail 1 IN PTR ns1.magedu.com 1 IN PTR www.magedu.com.
本文出自 “庭前夜末空看雪” 博客,请务必保留此出处http://12550795.blog.51cto.com/12540795/1958375
原文地址:http://12550795.blog.51cto.com/12540795/1958375