你有没有一个这样的问题困扰的你呢?如果我们记忆IP地址你能记住多少个?5个?10个?20个?我想你只能记住常用的IP对吧?但是我们想访问我们想要的某个站点的页面,你能会使用IP地址访问么?显然不会,就像我们日常使用的百度这样的网站,你会输入它的IP去访问么?肯定不会,我想大部分人不知道百度的IP地址是多少的?我们都是通过这样的方式去访问,但是你知道,网络中并不能直接使用字母进行解析的,那如何实现这样的功能呢?DNS就是帮助我们进行地址转换,是的我们获取到IP地址去上网的。这样大大减轻了我们的记忆内存。
一、DNS
1、DNS概念
DNS(Domain Name System,域名系统)是互联网的一项服务。它将域名和IP地址相互映射的一个分布式数据库,能够使人方便地访问互联网。
2、使用的端口
(1)53/TCP 53/UDP
(2)不同协议的端口作用是什么呢?
53/UDP:提供客户端查询功能53/TCP和53/UDP:实现dns主从复制功能
3、DNS域名
开头我们述说DNS是分布式数据库,想必大家猜到了DNS是层级结构的。
从图中可以看出DNS的层级结构
(1)根域(Top Level Domain,tld)
(2)顶级域
(a)组织域, com,org,gov,mil等(b)国家域,cn,ca,hk,tw等(c)反向域,arpa
(3)二级域 ...
4、DNS服务器类型
(1)主DNS服务器
作用:管理和维护负责解析的域内解析库的服务器
。 (2)从DNS服务器
作用:从主服务器或从服务器“复制”(区域间传输)解析库副本。这里我们需要注意一下,区域传输分为两种(a)完全传输(axfr):传送整个解析库;(b)增量传输(ixfr):传递解析库变化的内容;
是不是大家想,主从DNS服务器时如何工作的呢?
有两种工作机制“PUSH”和“PULL”。当主DNS服务器配置文件中序列号发生递增,重新DNS服务;主DNS服务器会主动向从DNS服务器同步信息;这个过程称为'PUSH'。如果区域传输终端,没有同步成功,从服务器会根据配置文件中的”retry“指定的时间重新尝试同步信息,这个过程称为“PULL”。
5、DNS解析
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-->二级域名-->...
6、DNS资源类型
区域解析库由众多的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)同一个值可能有多个不同定义的名字;通过多个不同的名字指向同一个值进行定义。此仅表示通过多个不同的名字可以找到同一个主机。
(1)SOA:Start Of Authority,起始授权记录。
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记录,必须位于解析库的第一条记录。
(2)NS,Name Server ,名称服务
value:当前区域的某DNS服务器名称
注意:
(a)相邻的两个资源记录的NAME相同时,后续可省略。
(b)任何一个NS记录后面的服务器名字,都应该在后续有一个A记录。
(3)MX,Mail eXchange,邮件转换
value:当前区域的某邮件服务器的主机名
注意:
(1)在一个区域内可以有多个MX记录,但是每个MX记录前应该有一个数字(0-99),表示服务器的优先级,数字越小优先级越高。
(2)任何一个MX记录后应该有一个A记录。
(4)A 记录
value:主机名对应的IP地址
对于A记录有以下几种定义格式:
(a)可以使用FQDN
(b)可以使用泛域名 *.ZONE_NAME,这种方式的好处是避免用户写错名称时给错误答案,将错误答案指向某特性的地址。
(c)如果一个网段中地址不确定可以是使用 $GGENERATE #-# NAME$ 后面对应的地址也是,网段加$
示例:$GENERATE 100-150 host$ IN A 192.168.4.$
(5)AAAA记录
(6)PTR PoinTeR IP,反向域名解析
格式:IP PTR FQDN完整格式:135.4.168.192-in.adder.arpa IN PTR dns1如果192.168.4为网络地址,可以这样写 135 IN PTR DNS1
注意:主机地址要反着写。
(7)CNAME 别名
有时候我们访问一个网站是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服务了。
二、实现管理DNS
1、bind安装包
bind-libs.x86_64 #库包 bind-libs-lite.x86_64 # bind-license.noarch #认证包bind-utils.x86_64 #提供对dns服务器的测试工具程序bind-chroot #为bind提供一个伪装的根目录以增强安全性
2、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.htmloptions { #全局设置 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的配置。
3、DNS转发服务器
(1)全局转发:对非本机所负责区域的请求,全转发给指定的服务器。
options{ forward first|only; forwarders { IP; };};
(2)特定区域转发:仅转发对特定区域的请求,比全局转发优先级高。
zone "ZONE_NAME" IN { tyep forward; forward first|only; forwarders { IP; }};
4、从DNS服务器
(1)应该为一台独立的名称服务器
(2)主服务器区域解析文件中必须有一条NS记录指向从DNS服务器
(3)从服务器只需要定义区域,而无须提供解析库;解析库文件应该放置于/var/named/slaves
目录下。
(4)主服务器得允许从服务器区域传送
(5)主从服务器的时间应该保持一致
(6)Bind程序版本应该保持一致;如果不一致,建议主服务器低,从服务器高。
(7)修改网卡配置文件/etc/sysconfig/network-scripts-ifcfg-INTERFACE
,添加DNS记录。
5、允许动态更新
如果想启用此功能,可以在/etc/named.rfc1912.zones
文件中定义之。
三、管理命令
1、dig命令
作用:只能用于测试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:递归解析
2、host命令
格式:
host [-aCdlnrsTwv] [-c class] [-N ndots] [-R number] [-t type] [-W wait] [-m flag] [-4] [-6] {name} [server]
选项:
-t:指定RR类型
3、nslookup
格式:nslookup [-option] [name | -] [server]
nslookup>server IP: 指明使用哪个DNS server进行查询set q=RR_TYPE: 指明查询的资源记录类型NAME: 要查询的名称
4、rndc命令(953/tcp)
格式: 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:将调试级别设置为0flush:清空DNS服务器的所有缓存记录
四、实战
(1)搭建主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 dns1dns1 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
(2)搭建从DNS服务器
在主机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
(3)实现转发功能
假如一个公司有三台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
#重启服务
在客户端主机上测试
(4)实现父域与子域的关系
在前面实验的基础上,执行如下操作:
(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)重启服务测试
(5)主从服务器
案例前提:准备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;};”这样就限制了。
注意:通过以上几个实验总结出需要注意的一些地方
1、在做实验过程中一定要关闭dnssec功能;
2、复制文件/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 dns1dns1 A 192.168.4.132webserver IN A 192.168.4.132www 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服务器起到了,达到了容错功能。是不是有点小小的成就感呢?
六、DNS的管理功能
你是不是有这样的想法,只想让某个IP或者某个IP端的地址进行访问,实现访问控制功能。DNS服务给我们提供了很好的解决方法。
1、选项
allow-query {}; | 允许查询的主机,相当于白名单 |
allow-transfer {}; | 允许区域传送的主机 |
allow-recursion{}; | 允许递归的主机,这个选项建议在options中使用 |
allow-update{}; | 允许更新区域数据库中的内容 |
2、acl
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功能,所有本机也不能访问了。实现我们的预期效果。
七、view
大家小时候去网吧的时候有没有遇到这样一个问题,如果你玩问道在电信1玩,而你的网络是联通的网络,这样开始玩游戏的过程中,我们的屏反应会迟钝,频很高;但是网络提供一个网络转换程序,如果你切换到电信网络,问道游戏运行流畅;这相当于我们这里view的功能。实现只能DNS解析,不过不需要我们手动切换网络。
(1)一个bind服务器可以定义多个view;每个view可以定义多个zone。每个view匹配一组客户端。
(2)如果多个view对同一个zone进行解析时,使用不同的zone解析库文件。
实战
如果我们在北京和广州有两台DNS服务器,北京和广州用户通过访问的时候,我希望北京访问直接在北京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)
当当当,成功!!!