什么是DNS?
DNS 是域名系统 (Domain Name System) 的缩写,它是由解析器和域名服务器组成的。域名服务器是指保存有该网络中所有主机的域名和对应IP地址,并具有将域名转换为IP地址功能的服务器。其中域名必须对应一个IP地址,而IP地址不一定有域名。域名系统采用类似目录树的等级结构。域名服务器为客户机/服务器模式中的服务器方,它主要有两种形式:主服务器和转发服务器。将域名映射为IP地址的过程就称为“域名解析”。在Internet上域名与IP地址之间是一对一(或者多对一)的,域名虽然便于人们记忆,但机器之间只能互相认识IP地址,它们之间的转换工作称为域名解析,域名解析需要由专门的域名解析服务器来完成,DNS就是进行域名解析的服务器。 DNS 命名用于 Internet 等 TCP/IP 网络中,通过用户友好的名称查找计算机和服务。当用户在应用程序中输入 DNS 名称时,DNS 服务可以将此名称解析为与之相关的其他信息,如 IP 地址。因为,你在上网时输入的网址,是通过域名解析系统解析找到了相对应的IP地址,这样才能上网。其实,域名的最终指向是IP。通常情况下我们之用到了DNS服务器的正向解析功能,而DNS还有方向解析功能,就是把IP地址解析成主机名。
DNS授权管理机制:
最大域就是根域,用.表示接下来就是一级域,也就是顶级域。注:根域和顶级域是特殊的,不能由个人指定。
然后就是二级域三级域等,直到最后的主机(这些是可以由公司、组织、个人申请使用的)
通过上边实例我想大家大致明白了DNS的工作方式,但是又有一个问题出现了。
上述实例过程中,主机具体是怎么问到www.baidu.com的地址呢?
这里有两种方式:
方式1(递归):主机问根域->根域问一级域->一级域问二级域->二级域找到www.baidu.com把信息返回给一级域->一级域再把信息返回给根域->根域再把信息返回给主机
方:式2(迭代):主机问根域,根域说你去找一级域
主机问一级域,一级域说你去找二级域
主机问二级域,二级域把www.baidu.com的信息告诉主机
到底是由哪种方式实现的呢?
实际上DNS是由这来那个种方式结合实现的。
【DNS具体实现过程】:事实上我们的主机是不能跟根域直接相连的,在解析过程中我们的主机事先是需要根域在哪的,主机在寻找根域的过程是用的递归的方式,而在找到根域后寻找目标主机时使用的是迭代方式。
注:如果在根域寻找目标主机的过程中使用的递归的方式的话,每次查找到后还要再次反馈给根域那么势必会增加根域服务器的负担,所以为了减少根域服务器的负担,在查找目标主机的过程中使用的是迭代的方式。
那么我们想要访问一台主机的话每次都这样去解析是很麻烦的一件事,而且势必会占用我们的带宽和时间。
有没有一种办法让我们第一次解析以后访问都不用再解析呢?
这就需要我们计算机中的缓存了,缓存的功能就是为了减轻DNS服务器的压力,第一次解析完成后就会把这条记录记忆在缓存中,下次访问的时候就会读取缓存中的记录,而不用去找DNS服务器解析。
同样的,DNS服务器中也有缓存,目的就是为了让一台主机访问后其他主机访问的时候不在去找根域解析。大大减轻了服务器的负担。
Linux 下的DNS服务的工具:bind
其服务脚本为:/etc/rc.d/init.d/named
其主配置文件为:/etc/named.conf /etc/named.rfc1912.zones
其区域解析库文件:/var/named/ZONE_NAME.zone
DNS中的名称与对应的主机名不要求是一样的,一个名称可以对应多个IP,一个IP也可以对应多个名称。
反向域:.in-addr.arpa(反向解析时使用)
域:domain (逻辑概念)
区域:zone (物理概念)
【区域解析库】每一行一个资源记录rr(resource record)
资源记录:有类型概念,用于标记此记录解析的属性
资源记录类型:
SOA:起始授权记录,一个区域文件只能有一个
NS : name server 标记谁是解析服务器,可有多个
MX: 标记谁是域内的邮件服务器,可有多个(有优先级0-99)
A : 主机名->IP的映射关系
PTR:IP->主机名的映射关系
AAAA:主机名->IPV6的映射关系
CNAME:正式名称 如:A CNAME B :A是B的别名
注:A和PTR不能同时出现,一个解析库要么是正向解析库要么是反向解析库。
【权威服务器】:负责某域内全部主机的DNS服务器
【非权威应答】:通过本地缓存访问主机
下面我们用实验说明配置DNS模拟根实现,子域委派,以及主辅同步。
六台机器,分别模拟 根, .com,magedu.com,slave,client,caching
关系如图所示:
修改所有机器的 /etc/named.conf配置文件如图
代码语言:javascript复制options {
listen-on port 53 { any; };
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 no;
dnssec-enable no;
dnssec-validation no;
除根外所有机器的 /var/named/named.ca 文件的主根服务器ip地址指向我们设置的根的idi地址如图所示:
代码语言:javascript复制; formerly NS.INTERNIC.NET
;
. 3600000 NS A.ROOT-SERVERS.NET.
A.ROOT-SERVERS.NET. 3600000 A 192.168.83.129
~
~
接下来我们配置根root
a. name.conf中删除name.ca的项目
b. rfc1912文件
代码语言:javascript复制 zone "." IN {
type master;
file "root.zone";
};
c. root.zone
代码语言:javascript复制$TTL 1D
@ IN SOA ns. admin. (
0 ; serial
1D ; refresh
1H ; retry
1W ; expire
3H ) ; minimum
NS ns.
ns. A rootip
com. NS ns.com.
ns.com. A .comip
d.启动named
配置com a. rfc1912文件
代码语言:javascript复制 zone "com" IN {
type master;
file "com.zone";
};
b. com.zone
代码语言:javascript复制 $TTL 1D
@ IN SOA ns.com. rname.invalid. (
0 ; serial
1D ; refresh
1H ; retry
1W ; expire
3H ) ; minimum
NS ns.com.
ns A 192.168.153.8
magedu.com. NS ns1.magedu.com.
magedu.com. NS ns2.magedu.com.
ns1.magedu.com. A 主IP
ns2.magedu.com. A 从IP
c.启动named
配置主magedu.com a. rfc1912文件
代码语言:javascript复制zone "magedu.com" IN {
type master;
file "magedu.com.zone";
};
b. magedu.com.zone
代码语言:javascript复制 $TTL 1D
@ IN SOA ns1.magedu.com. rname.invalid. (
2018091301 ; serial
1D ; refresh
1H ; retry
1W ; expire
3H ) ; minimum
NS ns1.magedu.com.
NS ns2.magedu.com.
ns1 A 主IP
ns2 A 从IP
www A 1.1.1.1
ftp A 2.2.2.2
* A 10.10.10.10
c.启动named
配置从magedu.com a. rfc1912文件
代码语言:javascript复制zone "magedu.com" IN {
type slave;
masters { 主IP; };
file "slaves/MAGEDU.COM.ZONE";
};
b. 启动named
开始测试:
关闭所有机器防火墙以及selinux
代码语言:javascript复制[root@localhost ~]# nslookup
www.magedu.com
Server: 192.168.83.132
Address: 192.168.83.132#53
Non-authoritative answer:
Name: www.magedu.com
Address: 1.1.1.1
> ftp.magedu.com
Server: 192.168.83.132
Address: 192.168.83.132#53
Non-authoritative answer:
Name: ftp.magedu.com
Address: 2.2.2.2
> hha.magedu.com
Server: 192.168.83.132
Address: 192.168.83.132#53
Non-authoritative answer:
Name: hha.magedu.com
Address: 10.10.10.10
测试主从
在主上开启防火墙限制:
代码语言:javascript复制[root@localhost ~]# iptables -A INPUT -p tcp --dport 53 -j REJECT
去client测试
代码语言:javascript复制root@localhost ~]# nslookup
www.magedu.com
Server: 192.168.83.132
Address: 192.168.83.132#53
Non-authoritative answer:
Name: www.magedu.com
Address: 1.1.1.1
仍有结果所有从起作用了,
接下来把主从都给开启防火墙
代码语言:javascript复制[root@localhost ~]# nslookup www.magedu.com
Server: 192.168.83.132
Address: 192.168.83.132#53
** server can't find www.magedu.com: NXDOMAIN
关闭防火墙接下来我们不在caching里清缓存,之前访问过的,在开启防火墙之后仍然可以访问,说明缓存里有记录,没访问过的则不能访问。说明缓存优先于本地查询。
代码语言:javascript复制[root@localhost ~]# nslookup hsh.magedu.com
Server: 192.168.83.132
Address: 192.168.83.132#53
Non-authoritative answer:
Name: hsh.magedu.com
Address: 10.10.10.10
[root@localhost ~]# nslookup hsh.magedu.com
Server: 192.168.83.132
Address: 192.168.83.132#53
Non-authoritative answer:
Name: hsh.magedu.com
Address: 10.10.10.10
[root@localhost ~]# nslookup hh.magedu.com
Server: 192.168.83.132
Address: 192.168.83.132#53
** server can't find hh.magedu.com: NXDOMAIN