你有没有一个这样的问题困扰的你呢?若是咱们记忆IP地址你能记住多少个?5个?10个?20个?我想你只能记住经常使用的IP对吧?可是咱们想访问咱们想要的某个站点的页面,你能会使用IP地址访问么?显然不会,就像咱们平常使用的百度这样的网站,你会输入它的IP去访问么?确定不会,我想大部分人不知道百度的IP地址是多少的?咱们都是经过www.baidu.com这样的方式去访问,可是你知道,网络中并不能直接使用字母进行解析的,那如何实现这样的功能呢?DNS就是帮助咱们进行地址转换,是的咱们获取到IP地址去上网的。这样大大减轻了咱们的记忆内存。html
DNS(Domain Name System,域名系统)是互联网的一项服务。它将域名和IP地址相互映射的一个分布式数据库,可以令人方便地访问互联网。git
(1)53/TCP 53/UDPweb
(2)不一样协议的端口做用是什么呢?数据库
53/UDP:提供客户端查询功能 53/TCP和53/UDP:实现dns主从复制功能
开头咱们述说DNS是分布式数据库,想必你们猜到了DNS是层级结构的。 vim
从图中能够看出DNS的层级结构数组
(1)根域(Top Level Domain,tld)缓存
(2)顶级域安全
(a)组织域, com,org,gov,mil等 (b)国家域,cn,ca,hk,tw等 (c)反向域,arpa
(3)二级域 ...bash
(1)主DNS服务器服务器
做用:管理和维护负责解析的域内解析库的服务器
。 (2)从DNS服务器
做用:从主服务器或从服务器“复制”(区域间传输)解析库副本。 这里咱们须要注意一下,区域传输分为两种 (a)彻底传输(axfr):传送整个解析库; (b)增量传输(ixfr):传递解析库变化的内容;
是否是你们想,主从DNS服务器时如何工做的呢?
有两种工做机制“PUSH”和“PULL”。当主DNS服务器配置文件中序列号发生递增,从新DNS服务;主DNS服务器会主动向从DNS服务器同步信息;这个过程称为'PUSH'。若是区域传输终端,没有同步成功,从服务器会根据配置文件中的”retry“指定的时间从新尝试同步信息,这个过程称为“PULL”。
DNS解析分为两种
(a)正向解析:FQDN-->IP (b)反向解析: IP-->FQDN
注意:正向解析是两个不一样的名称空间,是两个不一样的解析树,若是为子域则写DNS服务IP。
DNS查询类型:
(a)递归查询 (b)迭代查询
一次完整的DNS查询请求的过程:Client-->host文件-->DNS server Local Cache -->DNS server(recursion)-->Server Cache-->Iteration(迭代)-->Root-->TLD-->二级域名-->...
区域解析库由众多的RR(resource record)组成。存在不一样的类型:A,AAAA,SOA,CNAME,MX,PTR,NS。
资源记录的格式:
NAME [TTL] IN RR_TYPE VALUE
下面有几点须要注意的:
(a)$TTL变量,全局继承此处的缓存周期,默认单位为秒。
(b)@代替/etc/named.rfc1912.zones
配置的ZONE_NAME.
(c)同一个名字能够经过多条记录定义多个不一样的值,此时DNS服务器会以轮询方式进行相应。
(d)同一个值可能有多个不一样定义的名字;经过多个不一样的名字指向同一个值进行定义。此仅表示经过多个不一样的名字能够找到同一个主机。
value的构成:
(a)当前区域的主DNS服务器的 FQDN,也可使用/etc/named.rfc1912.zones
配置的ZONE_NAME。
(b)当前区域管理员的邮箱地址,但地址中不能使用”@“,通常使用“.”替代。由于在配置文件中“@”表示特殊含义 。
(c)主从服务区域传输相关定义以及否认的答案的同一TTL。
@ IN SOA @ rname.invalid. ( 0 ; serial #解析库序列号,主服务器解析库变化时,递增,最长只能为十位数组成,通常为了方便管理这样管理“当前日期+版本号” 1D ; refresh #刷新时间,从服务器从主服务器请求同步解析库的时间 1H ; retry #重试时间,从服务器从主DNS服务器请求失败时,再次尝试的时间 1W ; expire #过时时长,从服务器联系不到主服务器时,多久后中止服务 3H ) ; minimum #错误解析存活时长
注意:一个区域解析库只能有且仅有一个SOA记录,必须位于解析库的第一条记录。
value:当前区域的某DNS服务器名称
注意:
(a)相邻的两个资源记录的NAME相同时,后续可省略。
(b)任何一个NS记录后面的服务器名字,都应该在后续有一个A记录。
value:当前区域的某邮件服务器的主机名
注意:
(1)在一个区域内能够有多个MX记录,可是每一个MX记录前应该有一个数字(0-99),表示服务器的优先级,数字越小优先级越高。
(2)任何一个MX记录后应该有一个A记录。
value:主机名对应的IP地址
对于A记录有如下几种定义格式:
(a)可使用FQDN
(b)可使用泛域名 *.ZONE_NAME,这种方式的好处是避免用户写错名称时给错误答案,将错误答案指向某特性的地址。
(c)若是一个网段中地址不肯定能够是使用 $GGENERATE #-# NAME$ 后面对应的地址也是,网段加$
示例:$GENERATE 100-150 host$ IN A 192.168.4.$
格式:IP PTR FQDN 完整格式:135.4.168.192-in.adder.arpa IN PTR dns1 若是192.168.4为网络地址,能够这样写 135 IN PTR DNS1
注意:主机地址要反着写。
有时候咱们访问一个网站是www主机不必定是真正的主机。有可能使用了这种别名机制
示例: www IN CNAME websrv
咱们在访问一个网址时,有可能为以下地址www.test.server.com
对整个地址来讲真正的,test为server的子域。server为com的子域。n那么父域如何对子域进行受权呢?
子域受权:每一个域的名称服务器,都是经过父域服务器在解析库进行受权。
如图所述:想必你们多DNS的名称,过程有了必定的了解,下面经过看上面这张图,能够看出子域与父域的管理。经过观察图中,一个zone可有多个RR组成。能够粗略的看出DNS的容错功能,实现负载的做用。父域经过委派子域进行管理。
如图所示:DNS是工做在内核中的,用户是没有办法直接管理DNS服务,那要如何管理DNS服务呢?前人想出了Bind进行管理DNS服务。这样用户经过用户空间借助于Bind管理工具或配置文件就能够管理DNS服务了。
bind-libs.x86_64 #库包 bind-libs-lite.x86_64 # bind-license.noarch #认证包 bind-utils.x86_64 #提供对dns服务器的测试工具程序 bind-chroot #为bind提供一个假装的根目录以加强安全性
服务脚本/etc/rc.d/init.d/named
和/usr/lib/systemcd/system/named.service
主配置文件/etc/named.conf
/etc/named/rfc1912.zones
存放根服务器地址 /var/named/name.ca
解析库文件 /var/named/ZONE_NAME_ZONE
注意:
(1)一台物理服务器可同时为多个区域提供解析。
(2)必需要有根文件:name.ca。
(3)应该有两个实现localhost和本地回环的解析库。
主配置文件/etc/namd.conf
// 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. #这个文件是一个参考例子 // // See the BIND Administrator's Reference Manual (ARM) for details about the // configuration located in /usr/share/doc/bind-{version}/Bv9ARM.html options { #全局设置 listen-on port 53 { 127.0.0.1; }; #IPv4监听的端口和IP地址 listen-on-v6 port 53 { ::1; }; #IPv6监听的端口 directory "/var/named"; #zone配置文件存放目录 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 { localhost; }; #容许询问 /* - If you are building an AUTHORITATIVE DNS server, do NOT enable recursion. - If you are building a RECURSIVE (caching) DNS server, you need to enable recursion. control to limit queries to your legitimate users. Failing to do so will cause your server to become part of large scale DNS amplification attacks. Implementing BCP38 within your network would greatly reduce such attack surface */ recursion yes; #是否递归查询 dnssec-enable yes; #是否支持DNSSEC开关 dnssec-validation yes; #是否进行DNSSEC确认开关 /* Path to ISC DLV key */ bindkeys-file "/etc/named.iscdlv.key"; managed-keys-directory "/var/named/dynamic"; pid-file "/run/named/named.pid"; session-keyfile "/run/named/session.key"; }; logging { #日志信息 channel default_debug { file "data/named.run"; #存放的文件位置 severity dynamic; #工做模式 }; }; zone "." IN { #根域 type hint; #zone类型 file "named.ca"; #文件名称 }; include "/etc/named.rfc1912.zones"; include "/etc/named.root.key";
建议通常不要在这个文件中配置zone,能够在/etc/named.rfc1912.zones
文件下进行配置。
/var/named/named.localhost
文件
$TTL 1D @ IN SOA @ rname.invalid. ( 0 ; serial 1D ; refresh 1H ; retry 1W ; expire 3H ) ; minimum NS @ A 127.0.0.1 AAAA ::1
通常这个文件做为一个模板文件进行zone的配置。
(1)全局转发:对非本机所负责区域的请求,全转发给指定的服务器。
options{ forward first|only; forwarders { IP; }; };
(2)特定区域转发:仅转发对特定区域的请求,比全局转发优先级高。
zone "ZONE_NAME" IN { tyep forward; forward first|only; forwarders { IP; } };
(1)应该为一台独立的名称服务器
(2)主服务器区域解析文件中必须有一条NS记录指向从DNS服务器
(3)从服务器只须要定义区域,而无须提供解析库;解析库文件应该放置于/var/named/slaves
目录下。
(4)主服务器得容许从服务器区域传送
(5)主从服务器的时间应该保持一致
(6)Bind程序版本应该保持一致;若是不一致,建议主服务器低,从服务器高。
(7)修改网卡配置文件/etc/sysconfig/network-scripts-ifcfg-INTERFACE
,添加DNS记录。
若是想启用此功能,能够在/etc/named.rfc1912.zones
文件中定义之。
做用:只能用于测试DNS系统,不会查询hosts文件进行解析。
格式:
dig [@server] [-b address] [-c class] [-f filename] [-k filename] [-m] [-p port#] [-q name] [-t type] [-x addr] [-y [hmac:]name:key] [-4] [-6] [name] [type] [class] [queryopt...]
simple usage: dig @server name type
选项:
-b:绑定源IP -4:仅使用IPv4 -t:指定RR类型,默认为A记录,atfr(反向解析) -x:反向解析 +[no]trace:跟踪解析过程 +[no]recure:递归解析
格式:
host [-aCdlnrsTwv] [-c class] [-N ndots] [-R number] [-t type] [-W wait] [-m flag] [-4] [-6] {name} [server]
选项:
-t:指定RR类型
格式:nslookup [-option] [name | -] [server]
nslookup> server IP: 指明使用哪一个DNS server进行查询 set q=RR_TYPE: 指明查询的资源记录类型 NAME: 要查询的名称
格式: rndc [-b source-address] [-c config-file] [-k key-file] [-s server] [-p port] [-V] [-y key_id] {command}
reload:重载主配置文件和区域解析库文件 retranfer:手动启动区域传送,而无论序列号是否增减; notify:从新对区域传送发通知; reconfig:重载主配置文件 querylog:开启或关闭查询日志文件`/var/log/message` trace:递增debug一个级别 trace LEVEL:指定使用的级别 notrace:将调试级别设置为0 flush:清空DNS服务器的全部缓存记录
(a)[root@localhost ~]# yum install -y bind
#安装包 (b)[root@localhost ~]# vim /etc/named.conf
#修改主配置文件
方式一:
方式二:
(c)[root@localhost ~]# vim /etc/ named.rfc1912.zones
#修改zone文件
zone "test.com" IN { type master; file "test.com.zone" #此地方能够写绝对路径和相对路径,若是写相对路径,默认为`/var/named/test.com.zone`,所以在`/var/named`目录下文件名必定要与这里的文件名一致。 };
(d)[root@localhost ~]# named-checkconf
#使用命令对配置文件检查
/etc/named.rfc1912.zones:27: missing ';' before '}' #此时检查为27行处没有加";"修改完再检查便可。
注意:修改rfc1912.zones文件时,要以“;”结尾;参数与选项之间必须有空格隔开。
(e)修改zone文件[root@localhost named]# cp named.localhost test.com.zone
可是这里有一个问题,bind程序是以who的身份运行呢?下面经过命令查询看下: [root@localhost named]# ps aux |grep named
named 4002 0.2 1.2 161124 13028 ? Ssl 09:55 0:00 /usr/sbin/named -u named
经过命令查看咱们看到是以name身份运行的,可是咱们在复制文件时,文件名时root,以下图;因此在复制过来之后记得修改文件的权限。
方法一:修改文件的所属组
[root@localhost named]# chgrp named test.com.zone
方法二:复制模板文件时,直接加“-p”
[root@localhost named]# cp -p named.localhost test.com.zone
[root@localhost named]# vim test.com.zone
#修改ZONE文件
$TTL 1D @ IN SOA dns1 mail.test.com. ( 0 ; serial 1D ; refresh 1H ; retry 1W ; expire 3H ) ; minimum NS dns1 dns1 A 192.168.4.132
(f)加载zone文件
[root@localhost named]# rndc reload
(g)查看是否能够解析
[root@localhost named]# dig-t ns test.com @192.168.4.132
#在本机测试
在另一台机器上测试
修改这台机器上的DNS
测试
[root@localhost/etc/sysconfig/network-scripts]#dig -t ns test.com @192.168.4.132
在主机IP地址为192.168.4.144搭建从服务器
(a)安装bind包
(b)编辑/etc/named.conf
(c)编辑配置zone文件/etc/named.rfc1912zones
zone "test.com" IN { type slave; #修改类型 masters { 192.168.4.132; }; #主DNS服务器的地址 file "slaves/test.com.slave.zone"; #从DNS服务文件存放的位置 };
(d)启动bind服务,使其生效
[root@localhost~]#systemctl restart named
[root@localhost~]#ls /var/named/slaves/test.com.slave.zone
(e)测试
[root@localhost~]#dig www.test.com @192.168.4.144
假如一个公司有三台DNS服务器,A,B,C而且这三台主机不在同一个位置;A机器能够直接链接互联网,而B,C不能够直接链接互联网。用户使用电脑想访问www.qq.com,只能经过专线先到C再到A,而后才能访问www.qq.com,经过C转发到A。
方式一:全局转发
(1)分别在CentOS 6和CentOS 7 主机上设置,CentOS 7为转发
(A)在CentOS 6主机上配置
[root@localhost ~]# vim /etc/named.conf
[root@localhost ~]# vim /etc/named.rfc1912.zones
zone "test.com" IN { type master; file "test.com.zone"; };
重启服务
[root@localhost ~]# service named restart
(B)在CentOS 7主机上配置
[root@localhost~]#vim /etc/named.conf
切记,作这个实验室必定要关闭dnssec功能;dnssec-enable no; dnssec-validation no。
重启服务
[root@localhost~]#systemctl restart named
(C)修改客户端机器的dns
[root@localhost~]#vim /etc/sysconfig/network-scripts/ifcfg-ens33
(D)在客户端机器上测试
[root@localhost~]#dig www.test.com @192.168.4.148
在这里给你们提个醒:本身搞这个明明很简单的搞了一个多小时都没有成功,缘由在于没有关闭dnssce功能。
方式二:特定区域转发
在CentOS 主机上配置
[root@localhost~]#vim /etc/named.rfc1912.zones
zone "test.com" IN { type forward; forward first; forwarders {192.168.4.132;}; };
[root@localhost~]#systemctl restart named
#重启服务
在客户端主机上测试
在前面实验的基础上,执行以下操做:
(A)在CentOS 7主机上
[root@localhost~]#vim /etc/named.rfc1912.zones
建立zone
zone "do.test.com" IN { type master; file "do.test.com.zone"; };
[root@localhost/var/named]#vim do.test.com.zone
#配置解析库
$TTL 1D @ IN SOA dns1 rname.invalid. ( 0 ; serial 1D ; refresh 1H ; retry 1W ; expire 3H ) ; minimum NS dns1 dns1 A 192.168.4.148 webserver A 192.168.4.148 www CNAME webserver
(B)[root@localhost named]# vim test.com.zone
#在CentOS 6主机上修改解析库
[root@localhost named]# service named restart
#重启服务
(C)重启服务测试
案例前提:准备4台虚拟机
(A)CentOS6主机做为主DNS服务器,同上面的配置相似,这里就再也不阐述。
(B)在CentOS 7两台主机上作从DNS服务器,进行以下配置:
[root@localhost ~]# vim /etc/named.conf
[root@localhost~]#vim /etc/named.rfc1912.zones
#建立zone
zone "test.com" IN { type slave; masters {192.168.4.132;}; file "slaves/test.com.slave.zone"; };
启动bind的服务便可以同步到/var/named/slaves
目录下
[root@localhost~]#systemctl restart named
[root@localhost~]#ll /var/named/slaves/test.com.slave1.zone
-rw-r--r--. 1 named named 382 Sep 20 19:08 /var/named/slaves/test.com.slave1.zone
若是主从服务器想指定从DNS服务器,能够在/etc/named.conf
配置文件中添加选项 allow-transfer {IP;};
在从服务器上添加“allow-transfer {none;};”在主DNS服务器上“allow-transfer {IP;};”这样就限制了。
注意:经过以上几个实验总结出须要注意的一些地方
一、在作实验过程当中必定要关闭dnssec功能;
二、复制文件/var/named/named.localhost
作模板时,必定要加选项“-a”或“-p”选项。复制完成后必定看全部者、所属组和权限。
如何实现上述的拓扑图呢?先从底部网上一步一步的搭建
(1)实现主从DNS服务器
(a)修改主DNS服务器
[root@localhost~]#vim /etc/named.conf
#修改主配置文件
[root@localhost~]#vim /etc/named.rfc1912.zones
#建立zone
zone "test.com" IN { type master; file "test.com.zone"; };
[root@localhost ~]# vim /var/named/test.com.zone
#建立解析库文件
$TTL 1D @ IN SOA dns1 test.com. ( 2 ; serial 1D ; refresh 1H ; retry 1W ; expire 3H ) ; minimum IN NS dns1 dns1 A 192.168.4.132 webserver IN A 192.168.4.132 www IN CNAME webserver
[root@localhost~]#vim /var/named/named.ca
#修改根服务器文件
[root@localhost ~]# service named restart
#重启bind服务
(b)配置从DNS服务器
主配置文件和配置从服务器同样,这里就再也不阐述[root@localhost~]#vim /etc/named.rfc1912.zones
zone "localhost" IN { type master; file "named.localhost"; allow-update { none; }; };
[root@localhost~]#systemctl restart named
#重启服务[root@localhost~]#ll /var/named/slaves/test.com.slave.zone
#查看是否成功
(2)配置子域
[root@localhost~]#vim /etc/named.rfc1912.zones
#建立zone
zone "com" { type master; file "com.zone"; };
[root@localhost~]#vim /var/named/com.zone
#建立解析库
$TTL 1D @ IN SOA dns1 rname.invalid. ( 0 ; serial 1D ; refresh 1H ; retry 1W ; expire 3H ) ; minimum NS dns1 test NS dns2 dns1 A 192.168.4.147 dns2 A 192.168.4.132 www A 192.168.4.66
[root@localhost~]#systemctl restart named
#重启bind服务
(3)根
[root@localhost~]#vim /etc/named.rfc1912.zones
zone "." IN { type master; file "root.zone"; };
删除配置文件中/etc/named.conf
以下内容
[root@localhost/var/named]#vim root.zone
#建立解析库
$TTL 1D @ IN SOA dns1 rname.invalid. ( 0 ; serial 1D ; refresh 1H ; retry 1W ; expire 3H ) ; minimum NS dns1 com NS dns2 dns1 A 192.168.4.146 dns2 A 192.168.4.147
[root@localhost/var/named]#systemctl restart named
重启服务
这样咱们搭建完成了。是不是颇有成就感呢?哈哈。当你们看到这里的时候是否是发现咱们没有对从DNS服务器作设置呢?若是主DNS挂了,那么从DNS能工做么?下面咱们就来讲道说道。
假设主DNS服务器down(IP 192.168.4.132 )
[root@localhost ~]# ifconfig eth0 down
#将主DNS服务器down掉
[root@localhost ~]# rndc flush
#清除主DNS服务器的缓存
在Client客户机测试 (IP 192.168.4.149)
[root@localhost~]#dig www.test.com @192.168.4.147
如图所示,没有解析成功,说明咱们的从DNS服务器没有起做用,没有实现负载均衡做用。有没有想过为何出现这种状况呢?由于咱们没有在com域中没有添加这条域,下面咱们在com域中添加此从DNS服务器的dns记录测试
在com域中添加以下记录
[root@localhost/var/named]#vim com.zone
[root@localhost/var/named]#rndc flush
#清除缓存
在client客户机上测试
[root@localhost~]#dig www.test.com @192.168.4.148
这样说明咱们从DNS服务器起到了,达到了容错功能。是否是有点小小的成就感呢?
你是否是有这样的想法,只想让某个IP或者某个IP端的地址进行访问,实现访问控制功能。DNS服务给咱们提供了很好的解决方法。
allow-query {}; | 容许查询的主机,至关于白名单 |
allow-transfer {}; | 容许区域传送的主机 |
allow-recursion{}; | 容许递归的主机,这个选项建议在options中使用 |
allow-update{}; | 容许更新区域数据库中的内容 |
acl:是把某个IP或IP端合并为一个集合,经过一个统一的名称调用;能够把这个理解为bash函数的功能。
(1)acl内置的选项
none | 没有一个主机 |
any | 任意主机 |
localhost | 本机 |
localnet | 本机的IP同掩码运算后获得的网络地址 |
注意:acl只能先定义再使用;建议通常定义再options的前面。
(2)示例
[root@localhost ~]# vim /etc/named.conf
从新启动服务而后在本机测试[root@localhost ~]# dig www.test.com @127.0.0.1
因为咱们设置了acl功能,全部本机也不能访问了。实现咱们的预期效果。
你们小时候去网吧的时候有没有遇到这样一个问题,若是你玩问道在电信1玩,而你的网络是联通的网络,这样开始玩游戏的过程当中,咱们的屏反应会迟钝,频很高;可是网络提供一个网络转换程序,若是你切换到电信网络,问道游戏运行流畅;这至关于咱们这里view的功能。实现只能DNS解析,不过不须要咱们手动切换网络。
(1)一个bind服务器能够定义多个view;每一个view能够定义多个zone。每一个view匹配一组客户端。
(2)若是多个view对同一个zone进行解析时,使用不一样的zone解析库文件。
若是咱们在北京和广州有两台DNS服务器,北京和广州用户经过访问www.test.com的时候,我但愿北京访问直接在北京DNS解析并返回,广州与它相同,如何实现嗯?
在一台因为我电脑有两个不一样的IP段,在一台机器上实现这个功能
(a)修改/etc/named.conf
文件
(b)建立/etc/named.rfc1912.zones.test
和/etc/named.rfc1912.zones.app
分别修改
(3)建立zone文件/var/named/app.com.zone
和/var/named/app.com.zone
分别修改
(4)重启dns服务 [root@localhost named]# service named restart
在Clinet客户机上测试(IP 192.168.4.148和172.18.253.86)
当当当,成功!!!