一、DNS( Domain Name System)--域名系统,是一种组织成域层次结构的计算机和网络服务系统,用于TCP/IP网络,提供将主机名和域名与IP地址相互转换的服务。它的基本工作原理用下图来表示。
域名虽然便于人们记忆,但计算机只能通过IP地址互相通信, 它们之间的转换工作就称为域名解析,而DNS就是提供域名解析服务的系统.DNS是一个具有树状层次结构的联机分布式数据库系统,是C/S架构,其树状层次结构
二、域与区域
对于常见的www.magedu.com,它不是一个域名,而是一个主机名,也称为FQDN,即Full Qualified Domain Name完全限定域名,
树状层次中最顶端的称为根域(.),根域下面的几个域称为顶级域(Top level Domain),简写为TLD,
TLD:
组织域: .com,.net,.org,...
国家域: .cn, .tw, .hk, .jp, .iq, .ir
反向域: IP --> FQDN
再下面是二级域,三级域,...
对于分布式数据库系统,每个域名都只负责其直接下级域名的解析,在.magedu下有一台为www的主机,那它的FQDN即为www.magedu.com,因为DNS的主机名是自底向上的,授权是自底向下的.
DNS中域与区域的区别:
对于DNS来说,域是一个逻辑概念,区域是一个物理概念
区域传送的类型:(主从服务器进行数据传送时)
完全区域传送: axfr
增量区域传送: ixfr
区域类型:
主区域: master
从区域: slave
提示区域: hint,根域为hint区域
转发区域: forward
三、区域文件
对于一个域来说,一般都有域本身负责解析域的数据库,这样的一个数据库文件就是域的区域文件,数据库中的每一行(每一个条目)称作一个资源记录(resource record),简写为RR。这样的一个数据库文件就是域的区域文件,在区域文件中分号代表注释。
资源记录的格式:
NAME(名称) [TTL(缓存时间)] IN(internet上的RR) RRT(资源记录类型) VALUE(值)
www.magedu.com. IN A 1.1.1.1
1.1.1.1 IN A www.magedu.com.
注意:如果TTL值均相同,可以在RR上方统一定义TTL值,对其下面的条目均有效.
资源记录类型:
SOA(START Of Authority):
ZONE NAME TTL IN SOA FQDN ADMINISTRATOR_MAILBOX(
serial number(最长10位数字)
refresh
retry
expire
na ttl)
注意:
1、这条资源记录类型必须是区域文件的第一条;
2、时间单位:M(分),H(小时),D(天),W(周),默认单位是秒
3、邮箱格式: admin@magedu.com --> admin.magedu.com.
NS(nameserver): ZONE NAME --> FQDN
magedu.com. 600 IN NS ns.magedu.com.
ns.magedu.com. 600 IN A 1.1.1.2
MX(Mail eXchange): ZONE NAME --> FQDN
ZONE NAME TTL IN MX PRIORITY(优先级) VALUE
优先级: 0-99, 数字越小, 级别越高
magedu.com. 600 IN MX 10 mail.magedu.com.
mail.magedu.com. 600 IN 1.1.1.3
A(Adress): FQDN --> ipv4
AAAA: FQDN --> ipv6
PTR(pointer): IP --> FQDN
CNAME(canonical name):FQDN --> FQDN
www2.magedu.com. 600 IN CNAME www.magedu.com.
四、DNS服务器的递归和迭代查询
在.magedu域内配置一台主机专门用于DNS服务的请求和解析, 主机名为ns.magedu.com,同时在.magedu域下有一台主机, 主机名为www.magedu.com, 这台主机想请求解析www.fin.example.com的IP地址,过程如下:
1、www.magedu.com把请求直接提交给DNS服务器ns.magedu.com;
2、ns.magedu.com本身并不负责www.fin.example.com的解析,同时本地也没有缓存, 于是就把请求直接交给根域;
3、根域接到请求,会把负责解析.com域的DNS服务器作为结果返回给ns.magedu.com,这时,ns.magedu.com会继续向.com的DNS服务器发送请求,得到一个负责解析.example.com域的DNS服务器的结果;
4、继续发送请求,直到返回www.fin.example.com的IP地址结果;
5、ns.magedu.com再将返回的结果发送给www.magedu.com,完成请求.
综上, www.magedu.com向ns.magedu.com请求的查询过程称为递归查询, 而ns.magedu.com向根域及其子域请求的查询过程称为迭代查询,一般情况下域名服务器对于本地客户端(stub resolver)的请求都是递归查询,对于DNS服务器的请求都是迭代查询.
五、DNS服务器的类型
主服务器
从服务器
缓存服务器
转发服务器
六、DNS服务器的安装与配置
1、简单配置
目前使用的最多的DNS服务器软件是BIND(Berkeley Internet Name Domain),在RED HAT5.8上安装bind97配置DNS服务器.
首先配置好yum源,安装bind97和bind97-utils
# yum -y install bind97 bind97-utils
编辑配置文件/etc/named.conf,定义区域
options{ directory "/var/named"; allow-resursion { 192.168.1.0/24; 127.0.0.0/8; }; notify yes; }; zone "." IN { type hint; file "named.ca"; }; zone "localhost" IN { type master; file "named.localhost"; allow-tranfer{none;}; }; zone "0.0.127.in-addr.arpa" IN { type master; file "named.loopback"; allow-tranfer{none;}; }; zone "51test.com" IN { type master; file "51test.com.zone"; allow-tranfer{ 192.168.1.102;}; }; zone "1.168.192.in-addr.arpa" IN { type master; file "1.168.192.in-addr.arpa.zone"; allow-tranfer{ 192.168.1.102;}; };
手动编辑区域数据文件
# vim /var/named/51test.com.zone $TTL 86400 51test.com. IN SOA ns1.51test.com. mail.51test.com. ( 2017072502 2H 60 7D 1D) IN NS ns1.51test.com. IN MX 2 mail.51test.com ns1.51test.com. IN A 192.168.1.101 mail.51test.com. IN A 192.168.1.101 www.51test.com. IN A 192.168.1.102 www.51test.com. IN A 192.168.1.103 www2.51test.com. IN CNAME www.51test.com.
# vim /var/named/1.168.192.in-addr.arpa.zone $TTL 86400 @ IN SOA ns1.51test.com. mail.51test.com. ( 2017072502 2H 60 7D 1D) IN NS ns1.51test.com. 101 IN PTR ns1.51test.com. 101 IN PTR mail.51test.com 102 IN PTR www.51test.com. 103 IN PTR www.51test.com.
修改区域数据文件的属性
# chmod 640 /var/named/51test.com.zone
# chown root.named /var/named/51test.com.zone
# chmod 640 /var/named/1.168.192.in-addr.arpa.zone
# chown root.named /var/named/1.168.192.in-addr.arpa.zone
检查配置文件和区域数据文件是否有语法错误
# named_checkconf
# named_checkzone "51test.com" /var/named/51test.com.zone
# named_checkzone "1.168.192.in-ddr.arpa" /var/named/1.168.192.in-addr.arpa.zone
启动服务,开始用dig命令进行查询测试
dig 简单用法:
dig -t RT NAME @IP
dig -x IP 根据IP查找FQDN, 但需要定义反向区域数据文件
# service named start # dig -t A www.51test.com @192.168.1.101 一个FQDN若有两个IP地址,则轮流返回 # dig -t CNAME www2.51test.com @192.168.1.101 # dig -x 192.168.1.103 # dig +norecurse -t A www.sohu.com @192.168.1.101 非递归查询 # dig +recurse -t A www.sohu.com @192.168.1.101 若在配置文件中定义不予递归,则不返回任何结果 # dig +trace -t A www.sohu.com @192.168.1.101 查询的详细过程 # dig -A axfr 51test.com # dig -A ixfr=serial number 51test.com 区域传送不安全
2、主从服务器配置
配置从服务器,其IP地址为192.168.1.102
注意: 在定义从服务器时,也要把从服务器的NS记录写入区域数据文件,即在主服务器上编辑正向区域文件加入条目:
IN NS ns2 ns2 IN A 192.168.1.102
在反向区域数据文件中加入条目:
IN NS ns2.51test.com. 102 IN PTR ns2.51test.com.
安装bind97,bind97-utils
编辑配置文件/etc/named.conf
options{ directory "/var/named"; allow-resursion { 192.168.1.0/24; 127.0.0.0/8; }; }; zone "." IN { type hint; file "named.ca"; }; zone "localhost" IN { type master; file "named.localhost"; allow-tranfer{none;}; }; zone "0.0.127.in-addr.arpa" IN { type master; file "named.loopback"; allow-tranfer{none;}; }; zone "51test.com" IN { type slave; file "slaves/51test.com.zone"; master{192.168.1.101;}; allow-tranfer{ none;}; }; zone "1.168.192.in-addr.arpa" IN { type slave; file "slaves/1.168.192.in-addr.arpa.zone"; master{192.168.1.101;}; allow-tranfer{ none;}; };
启动服务,开始完全同步
在主服务器上编辑区域文件,增加条目,观察从服务器是否可以完成增量区域传送就可以了.
3、正向区域授权配置
有时候会希望在域51test.com下面注册两个子域,分别为fin 和market,则此时正向区域数据文件中添加条目
(注意:如果子域有多台服务器,则需要在父域的区域数据文件中添加多条记录,子域的IP可以不与父域在同一网段中)
fin.51test.com. IN NS ns1.fin.51test.com. ns1.fin.51test.com. IN A 192.168.1.106 market.51test.com. IN NS ns1.market.51test.com. ns1.market.51test.com. IN A 172.16.100.1
需要在另外一台主机上配置子域DNS服务器,与上述过程相同
编辑配置文件/etc/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 "named.loopback"; }; zone "fin.51test.com" IN { type master; file "fin.51test.com.zone"; };
手动编辑子域的区域数据文件
# vim /var/named/fin.51test.com.zone $TTL 86400 fin.51test.com. IN SOA ns1.fin.51test.com. mail.fin.51test.com. ( 2017072502 2H 60 7D 1D) IN NS ns1 IN MX 2 mail ns1 IN A 192.168.1.106 mail IN A 192.168.1.106 www IN A 192.168.1.107
修改区域数据文件的属组为named,权限为640
此时就可以用dig命令进行查询测试了
通常情况下子域是不知道父域的地址的,但是可以通过定义一个转发区域,直接把父域的IP地址告诉给子域,
全局转发,除了对自己所在域的请求,否则对于其他域的请求都转发,在/etc/named.conf中的options中定义
forward first; forwarders { 192.168.1.101;};
若只对对其父域51test.com的请求进行转发,对其他域的请求就不再转发, 则需要在配置文件中单独定义一个域
zone "51test.com" IN { type forward; forward first; forwarders {192.168.1.101; }; };
1、简化配置文件/etc/named.conf
在配置文件中定义列表,可以把一类内容写入这个列表,格式为
acl ACL_NAME {
172.168.0.0/16;
127.0.0.0/8;
};
注意: acl定义在配置文件的最上面
用法,如:
acl innet {
172.168.0.0/16;
127.0.0.0/8;
};
allow-recursion { innet; };
4、智能DNS配置
由于中国有两个运营商,telecom和unicom,这是两个独立的网络,在实际应用中,经常把全国划分为多个分区,在每个分区中有其对应的DNS服务器,根据客户端来源的不同返回指定的解析结果,这样的机制称为智能DNS.
具体实现: DNS可以在自己的服务器内部做视图.一个区域需要定义多个数据区域文件对应不同的客户端来源,也就是将一个区域分割成多个区域.
现在将192.168.1.0/24的网络定义为电信的用户,其他客户端都定义为联通的用户
DNS定义视图时,格式为
view VIEW_NAME{};
注意: 所有的区域都必须定义在视图中,根区域只需要定义在需要递归的视图中
acl innet { 192.168.1.0/24; 127.0.0.0/8; }; options{ directory "/var/named"; allow-recursion {innet;}; }; view telecom { match-clients {innet;}; zone "." IN { type hint; file "named.ca"; }; zone "telecom.51test.com" IN { type master; file "51test.com.zone"; }; }; view unicom { match-clients {any;}; zone "unicom.51test.com" IN { type master; file "unicom.51test.com.zone"; }; };
编辑区域数据文件
# vim /var/named/telecom.51test.com.zone $TTL 46300 @ IN SOA ns1.51test.com. mail.51test.com. ( 2015072501 1H 5M 3D 2D) IN NS ns1 IN MX 2 mail ns1 IN A 192.168.1.101 www IN A 192.168.1.102 mail IN A 192.168.1.101
修改属组为named,权限为640
# chown :named /var/named/telecom.51test.com.zone
# chmod 640 /var/named/telecom.51test.com.zone
# vim /var/named/unicom.51test.com.zone $TTL 46300 @ IN SOA ns1.51test.com. mail.51test.com. ( 2015072501 1H 5M 3D 2D) IN NS ns1 IN MX 2 mail ns1 IN A 192.168.1.101 www IN A 192.168.1.106 mail IN A 192.168.1.107
修改属组为named,权限为640
# chown :named /var/named/unicom.51test.com.zone
# chmod 640 /var/named/unicom.51test.com.zone
启动DNS服务,测试查询解析
注意: 如果解析一个域,但不需要返回不同的结果,那这个域需要定义在所有的view中,不过区域数据文件是一样的就可以了