DNSDomainNameServer应用层协议属于CS架构使用tcp和udp(常用)的53号端口;我们知道Domain Name Server应用层协议属于C/S架构使用tcp和udp(常用)的53号端口; 我们知道当我们访问互联网上的资源时
DNSDomainNameServer应用层协议属于CS架构使用tcp和udp(常用)的53号端口;我们知道Domain Name Server应用层协议属于C/S架构使用tcp和udp(常用)的53号端口; 我们知道当我们访问互联网上的资源时都需要具有一个IP地址但是我们要访问的资源有很多我们是无法记住各个资源的IP地址的所以我们有个解决办法就是使用主机名来对应IP地址因为人类对于记忆名字还是比较拿手的那么问题又来了还是数量的问题当名字很多时我们还是无法记住所以又有一个解决办法出现了那就是把名字和IP地址都记录在文件中需要访问资源的时候让计算机自己查找文件来实现访问资源那么问题又出现了还是数量的问题当计算机不算多的时候使用文件记录还可以但是互联网上那么多主机仅仅使用一个文件来记录当计算机查找IP地址时的速度可想而知有多么慢并且网络上的主机名是随时都会修改增加和删除的我们也无法实时的到最新的对应关系所以dns服务就出现了它可以解决现在互联网主机不断增多已经无法使用hosts文件来记录主机名的状况 我们把这些数据都放在服务器上是为了方便并且希望它可以增加速度但是把这些数据单纯的放在服务器上然后去查找真的会节省时间吗答案是否定的没准还会浪费时间那因为多了一步交互的过程所以为了加速其实在服务器启动时就已经对本地的所有名字和地址的对应关系分别做了hash并且把它放在内存中当有客户端来请求数据时直接比对hash值不同则响应回答发送最新的对应关系数据并且在hash后得到的都是16进制数服务器会对它们做分类处理比如首个字符相同则存在一起这样的话在查找时只需在16个字符中查找即可然后再分层往下查找所以会节省很多时间因为是在内存中中所以会更快又该但是了互联网上的主机真的是多的无法查清啊所以我们使用一台或者一个群组来管理这些主机名和ip的对应关系是不现实的因此就想出了一个解决办法把主机名的命名名称分层每个服务器之管理自己下一层的域名<分布式查找 tcp面向连接的协议稳定 udp无连接的协议速度快 当主机想要通过主机名来访问网络资源时首先会调用一个底层的库文件这个文件会扮演成客户端根据本地事先配置的dns服务器地址到这台服务器去请求主机名对应的IP地址待服务器返回IP地址后就可以通过这个IP地址来访问资源了这一步对于访问资源其实是多余的很浪费时间所以我们就想让它越快越好因此选择了udp协议 BINDBekerlay Internat Name Domain IANA分配域名的机构任何人想自己构建网站并且需要通过域名来访问那么就需要到这个机构去注册域名各地都会有相关的注册机构各种手续办完之后就可以在全世界范围内访问记得域名了可能会等一段时间机构录入信息和各地服务器更新学习都需要时间 本地名称解析配置文件/etc/hosts主机名找IP地址 格式 IP地址 主机名 例子 192.168.10.10 www.guowei.com DNS树状结构namespace DNS树状结构最上层为根(.)下面有很多顶级域名(com,org,net等)之下还有二级域名(一般企业或个人注册的域名就属于二级域名) Top Level Domaintld 组织域comedumilgovnetint等 国家域cniqhk等 反向域 DNS查询类型 递归查询把请求发送给别人让它去代替自己查询然后等待结果即可一般主机通过自己的服务器查询就是递归 迭代查询一步一步的按级查找不是一定会直接得到结果可能会经过多次查找一般服务器帮主机查找就是迭代 名称服务器域内负责解析本域名内的名称的主机域只是一个概念上的区域它需要一个或一组主机来实现它那个它就是名称服务器一般使用"ns"命名 根服务器世界上有13组根服务器 解析类型 正向解析FQDN→Ip 反向解析Ip→FQDN 正反向各需要一个解析库来分别负责本地域名的正反和反向解析 FQDN完全合格域名 例子 www.guowei.com. 查找过程自顶向下查找 比如查找www.guowei.com 这个主机时首先会去寻找根(.)跟一看不是自己直接管理的主机但是是属于自己管理的com域中的主机所以就将com域的信息发给客户端客户端再去com域找com域发现是自己管理的主机就将www主机的IP地址返回给客户端客户端就可以连接www.guowei.com了 详细过程 Client→hosts文件→DNS ServerLocal Cache→DNS Server(recursion递归)→Server Cache→iteration(迭代)→自顶向下查找过程 客户端首先会检查hosts文件如果没有则会检查本地缓存如若还没有则会到事先设置的主dns服务器查询服务器首先会检查自己的缓存如若没有才会去迭代查询最后将结果返回给客户端 DNS服务器的类型 主DNS服务器维护所负责解析的域内 解析库服务器解析库由管理员维护可以使手动的也可以使用软件 辅助(从)DNS服务器从主DNS服务器或其他的从DNS服务器那里"复制"(区域传送)一份解析库文件 主从服务器需要保持数据的统一故从服务会定期到主服务器那里更新数据主从之间根据序列号的大小来标识数据的新旧 序列号解析库的版本主服务器解析库内容发生改变序列号增大(越大越新) 刷新时间间隔从服务器从主服务器那里请求同步解析库的时间间隔 重试时间间隔从服务器从主服务器那里请求同步解析库失败时再次尝试的时间间隔 过期时长从服务器始终联系不到主服务器时多久放弃从服务器角色停止提供服务(不会抢占成为主服务器) 区域传送 全量传送传送整个解析库数据 增量传送仅传送解析库变化的那部分数据 缓存DNS服务器没有在互联网上注册域名只是让客户端将它当做DNS服务器当客户端请求解析时它会去请求真正提供DNS解析服务的服务器帮它解析然后将DNS服务器返回的结果保存一份在自己的本地缓存中然后再发送给客户端这样可以减轻公网带宽的负担提供的是递归查询 转发器 子域授权每个域的名称服务器都是通过其上级名称服务器在解析库中进行授权的 guowei.com. 授权过程 类似根域授权tld .com. IN NS ns1.com. .com. IN NS ns2.com. ns1.com. IN A 9.9.9.9 ns2.com. IN A 10.10.10.10 guowei.com.在.com(9.9.9.9)的名称服务器上的解析库中添加资源记录 guowei.com. IN NS ns1.guowei.com. guowei.com. IN NS ns2.guowei.com. ns1.guowei.com. IN A 6.6.6.1 ns2.guowei.com. IN A 6.6.6.2 guowei.com.(6.6.6.1)本地设置 guowei.com. IN NS ns1.guowei.com. ns1.guowei.com. IN A 6.6.6.1 www.guowei.com. IN A 3.3.3.1 域名注册 中国代理商万网新网 外国代理商godaddy BIND的安装配置 dns服务程序包名bind程序名named 程序包 bind主程序 bind-libsband和相关命令使用的函数库 bind-utils客户端查找主机名的相关命令(host,dig,nslookup) bind-chroot将bind主程序的根目录限制到/var/named/chroot Note测试环境可以不装生产环境建议安装 bind 服务脚本/etc/rc.d/init.d/named 主配置文件/etc/named.conf,/etc/named.rfc1912.zones,/etc/rndc.key 全局配置options { } 日志子系统配置logging { } 区域定义本机能够为哪些zone提供解析就要定义哪些zone zone "ZONE_NAME.zone" IN { } 注意任何服务程序如果期望其能够通过网络被其他主机访问至少应该监听在一个能与外部主机通信的ip地址上 解析库文件/var/named/ZONE_NAME.zone 注意 1.一台物理服务器可同时为多个区域提供解析 2.必须要有根区域文件 3.应该有两个实现localhost和本地回环地址的解析库用来联系自己 rndcremote name domain controller默认与bind安装在同一主机且只能通过127.0.0.1来连接named进程提供辅助性的管理功能使用953/tcp 缓存名称服务器的配置 监听外部地址即可 dnssec与dns的安全有关对dns服务解析时的每一个解析包文都要加数字签名做校验但配置麻烦测试环境建议关闭在配置文件中即可关闭 "dnssec-enable no" 主zone DNS名称服务器 正向解析 1.在主配置文件中定义区域/etc/named.conf options { listen-on port 53 { 192.168.10.20; 127.0.0.1; }; // 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; }; recursion yes; // dnssec-enable yes; // dnssec-validation yes; /* Path to ISC DLV key */ bindkeys-file "/etc/named.iscdlv.key"; managed-keys-directory "/var/named/dynamic"; }; /etc/named.rfc1912.zones zone "guowei.com" IN { type master ; file "guowei.com.zone" ; }; zone "10.168.192.in-addr.arpa" IN { type master ; file "10.168.192.in-addr.arpa.zone" ; }; 2.定义区域解析库文件/var/named/guowei.com.zone 宏定义: $TTL 时间(s) $ORIGIN 域名(guowei.com.) 资源记录: /var/named/guowei.com.zone $TTL 86400 (代指区域) IN SOA na1.guowei.com.(区域名或者主dns服务器名) admin.guowei.com.(管理员邮箱地址) ( 2018103001 序列号 1H 更新时间 5M 失败后重连时间 7H 失效时间 1D 缓存时间 ) guowei.com.(与上一条内容相同则可以省略) IN NS ns1.guowei.com. guowei.com. IN NS ns2.guowei.com. guowei.com. IN MX 10 mail.guowei.com. ns1 IN A 192.168.10.20 ns2.guowei.com. IN A 192.168.10.1 mail IN A 192.168.10.20 www.guowei.com. IN A 192.168.10.20 web.guowei.com. IN CNAME www.guowei.com. 反向解析 区域名称网络地址反写.in-addr.arpa. 192.168.10. →10.168.192.in-addr.arpa. 定义区域 zone "ZONE_NAME" IN { type {master|slave|forward}; file "网络地址.zone" ; }; 区域解析库文件 不需要A,AAAA,MX等记录以NS及PTR为主 /var/named/10.168.192.in-addr.arpa.zone $TTL 86400 10.168.192.in-addr.arpa. IN SOA ns1.guowei.com. admin.guowei.com. ( 2018103001 10M 5M 1H 1D ) 10.168.192.in-addr.arpa. IN NS ns1.guowei.com. 10.168.192.in-addr.arpa. IN NS ns2.guowei.com. 20 IN PTR ns1.guowei.com. 1 IN PTR ns2.guowei.com. 20 IN PTR mail.guowei.com. 20 IN PTR www.guowei.com. 检查配置文件语法是否有错 named-checkconf [区域配置文件] named-checkzone 检查解析库文件语法是否正确 例如named-checkzone "guowei.com" /var/named/guowei.com.zone Note最后需要修改区域文件的权限(640)属主为root属组为named 从zone DNS名称服务器 定义从区域正向解析 zone "guowei.com" IN { type slave; masters { MASTRT_IP; }; file "slaves/guowei.com.zone"; }; 定义从服务器反向解析 zone "10.168.192.in-addr.arpa" IN { type slave; masters { MASTER_IP; }; file "slaves/10.168.192.in-addr.arpa.zone 一般我们修改DNS配置的时候都是修改主服务器不会修改从服务器所以我们希望传送过来的文件dns服务使用的用户named对它具有读写权限默认named用户或组对/var/named/目录没有写权限但是对/var/named/slaves/目录具有读写权限所以一般默认会将文件放在这个目录中否则无法从主服务器传输配置文件到从服务器 我们上面说过从服务器会定时到主服务器那里同步解析库文件的数据并且当主服务器修改以后还会主动通知从服务器来做同步那么是怎么通知的那其实很简单就是在主服务器的区域配置文件中要设置从服务器的NS和A的记录让主服务器可以找到从服务器即可 主从复制 1.主从都应该是一台独立的服务器 2.主服务器的区域解析库文件中必须有一条NS记录是指向从服务器的 3.从服务器只需定义区域无需提供解析库文件解析库文件应该放置于/var/named/slaves/目录中 4.主服务器允许从服务器做区域传送一般这个是需要管理员做限制的只允许从服务器做传送其他的都应该被禁止 5.主从服务器时间应该同步可以通过使用ntp进行同步 6.bind程序的版本应该保持一致如果不一致从应该比主新 因为正反域都是独立的区域所以可以独立设置因此正反、主从服务器可以使用多个主机例如A为正主B为反主C为正从D为反从如果是三个dns主机一主两从可以使两个主机是同一个主机的从也可以使一个主机是另一个从的从 测试命令dignslookuphost digDNS lookup utility dig用于测试dns系统因此不会查询hosts文件 dig [-t type] name [server] [query options] 选项 -x IP_ADDR反向解析 -t typeA,PTR,SOA,MX等 [no]trace跟踪解析过程 [no]recurse进行递归解析 模拟全量区域传送 dig -t axfr zone_name server_ipaddr nslookupquery Internet name servers interactively nslookup [options] [FQDN] [server] 交互式模式 nslookup> server IP指明使用哪个DNS server进行查询 set typeany列出所有正解信息 set qRR_TYPE指明查询的资源记录类型 hostDNS lookup utility host [-a] FQDN [server] 选项 -a列出该主机所有相关信息 -l列出该domain所管理的所有主机名对应的数据 -t typeAPTRSOAMX等 rndcname server control utility 当dns服务启动时rndc也会跟着启动它就像服务器一样监听在953端口我们可以通过客户端键入rndc命令来管理dns服务但是默认情况下rndc不允许远程使用只可以在本地使用因为如果rndc出现bug被不良人利用岂不是完蛋了 COMMAND reload重载主配置文件和区域解析库文件 重载意义重大啊别看我们在学习测试时往往随意就重新启动服务但是在生产环境中服务不是随便就能够重启的否则可能会造成在成巨大的损失可能会被炒呦切记 reload zone重载区域解析库文件 retransfer zone手动启动其余传送过程且不管序列号是否增加 notify zone重新对区域传送发通知 reconfig重载主配置文件 querylog开启或关闭查询日志 一般情况处于关闭状态除非是出现问题时排错时才建议启动为了确保突发证况下日志文件不丢失一般日志都是同步写入的这样的话就会加大内存与磁盘的I/O增加服务器负载所以建议关闭 trace递增debug级别 trace LEVEL直接设置debug级别 可以通过rndc-h来查看选项帮助 自己定义授权子域分布式数据库 正向解析区域子域授权 在上一级服务器中需要定义子区域 stk.guowei.com. IN NS ns1.stk.guowei.com. stk.guowei.com. IN NS ns2.stk.guowei.com. ns1.stk.guowei.com. IN A 192.168.20.1 ns2.stk.guowei.com. IN A 192.168.20.2 在子域中配置主机名 stk.guowei.com. IN NS ns1.stk.guowei.com. stk.guowei.com. IN NS ns2.stk.guowei.com. ns1.stk.guowei.com. IN A 192.168.20.1 ns2.stk.guowei.com. IN A 192.168.20.2 www.stk.guowei.com. IN A 192.168.20.10 ftp.stk.guowei.com. IN A 192.168.20.20 定义转发服务器 注意被要求转发的服务器需要能够为请求者做递归否则转发请求不予进行 转发的意义 我们假设一种情况在guowei.com.域中有stk.guowei.com.这个子域当子域中www这个主机想访问父域guowei.com.中的www主机时如果不设置转发则子域中www主机会直接找根来解析父域中的www主机这是很不合理的所以我们在这种情况下就需要设置转发功能父域查找子域中的主机时就不需要因为父域是知道子域服务器的位置的 全部转发凡是非本机所负责解析的请求都转交给指定服务器请求他代为查询在主配置文件的options中定义 options { ... forward {first|only}; forwarders { IP }; } first表示当客户端请求的主机解析不是自己所管理的就转发给指定服务器如果他没有返回解析结果就自己找根去解析递归不成就迭代 only表示当客户端请求的主机解析不是自己所管理的就转发给指定服务器哪怕他不给解析也不做处理就像把自己的希望放到了别人的手里仅递归 区域转发仅转发对特定的区域的请求至指定服务器在区域配置文件中定义 zone "ZONE_NAME" IN { type forward; forward {first|only}; forwarders { IP; }; }; Note使用yum安装的dnssec是启用的所以做转发服务器的时候可能会不好使建议关闭(学习测试环境中) dnssec-enable no; dnssec-validation no; BIND中基础的与安全相关的配置 acl将一个或多个主机归并为一个集合并通过一个统一的名称调用 acl ACL_NAME { IP; NET/prelen; >192.168.10.0/24; …; }; bind有四个内置的acl可以直接调用的 none没有主机 any任意主机 local本机 localnet本机的IP同掩码运算后得到的网络地址 注意只能先定义后使用因此其一般定义在配置文件中options的前面 访问控制的指令(可以在options中设置也可以在zone中) allow-query { }允许做查询的主机类似设置白名单一般是any allow-transfer { }允许区域传送的主机白名单 allow-recursion { };允许递归的主机白名单 allow-update { };允许更新区域数据库中的内容一般不允许通过其他服务更新比如使用DHCP更新每次重启服务或重新开机时ip地址可能会有变动而导致错误建议不允许任何人更新>"none" BIND view(视图)自上而下检查 视图的作用是可以根据不同用户访问同一域名时所处的位置不同而指定不同的服务器为其解析(通过指定不同的解析库文件来实现) 一个bind服务器可以定义多个view每个view可以定义一个或多个zone 每个view用来匹配一组客户端 多个view内可能需要对同一个区域解析但是用不同的区域解析库文件 view VIEW_NAME { … match-clients { }; 匹配的客户端 }; 可以通过view来实现仅对自己本地管理的客户端进行递归来自其他的客户端不予递归 Note1.一旦使用了view所有的zone都只能定义在view中(包括".") 2.仅有必要在匹配到允许递归请求的客户所在view中定义根区域 3.客户端请求到达时是自上而下检查每个view所服务的客户端列表的(像优先被匹配的应该放在上面) 智能DNS提供商 dnspoddns.la
注根据马哥视频做的学习笔记如有错误欢迎指正侵删
转:https://www.cnblogs.com/guowei-Linux/p/11072884.html
【文章原创作者:
阿里云代理 http://www.558idc.com/aliyun.html处的文章,转载请说明出处】