DNS (Domail Name Server,域名服务)
一、DNS概述
DNS 是一种 C/S 架构,实现域名解析。服务端监听在 UDP/53 和 TCP/53 号端口。主要主机名与 IP 地址之间的名称解析。
所谓的名称解析:简单的来说是将一种名称转换为另一种名称。通常是用户名和 IP 地址之间的转换。它们之间是通过解析库来实现的。像 /etc/passwd 文件就是一种用户名和UID之间的一种解析库。
在 Linux 操作系统中,服务端协议的实现是 bind 软件,客户端通过调用 共享库 向服务端发出请求,通过查询解析库来获得解析结果。
二、DNS的树状结构
DNS最主要的实现方式是FQDN(Full Qualified Domail Name,完全限定主机名)向IP地址的解析。例如:当我问访问在互联网里访问 www.goole.com 的时候,DNS 服务器就会将他解析成对应的 IP 地址来进行访问。
实际在访问的主机名是 www.goole.com. ,它是由 根域,一级域,二级域,主机名组成的。
根域: “.”是DNS域名的最顶端的域。这样的域名服务器全球只有13个。
一级域:.com .net .cn .gov。
二级域:一般是公司和组织的名称,向 goole,baidu等。
主机名:一般式是某台主机的名称。
三、DNS服务器类型
- 主DNS服务器:
主要负责 DNS 域名解析。本服务器可以使一个权威服务器,负责一个区域的域名解析。主要靠解析库文件来完成名称的解析。
- 从DNS服务器:
是主服务器的一个热备,当主服务器出现故障时,会通过从服务器来解析。实现主从复制最主要的是解析库文件的同步,即区域传送。
区域传送有完全区域传送(AXFR)和增量区域传送(IXFR)。
- 缓存服务器:
一般都是在本地或者是在局域网内。一是为了提高解析速度,二是为了减轻服务端的压力。
- 交换服务器:
一般用在子域授权的机制中用到这种服务器。在子域中访问父域的主机名是需要用到这种机制。
四、DNS查询过程
查询的方式有递归查询和迭代查询。
递归查询是客户端只需要发出一次请求,最后直接返回结果的这种查询;迭代查询就是只要查询到结果就返回,然后在由客户端根据查询到的结果再次发出查询请求的过程。在实际的过程中是递归查询和迭代查询是结合在一起来使用的。
在进行域名解析的时候,DNS查询是真正的顺序是:本地的 /etc/hosts 文件 --> 本地的DNS缓存 --> 本地局域网的DNS服务器 --> 迭代查询公共的DNS服务器。
五、服务介绍
在 Linux 中DNS服务是由 bind 这个开源软件来提供的。在安装这个软件后,有后台守护进程来 named 控制,运行此进程的用户是系统用户 named。为了安全考虑,named 进程一般运行于 chroot 环境中,模拟的根在 /var/named/chroot 目录下。
1、相关文件
- 服务脚本: /etc/init.d/named
- 主配置文件: /etc/named.conf /etc/named.rfc1912.zones
- 区域配置(解析库)文件:/var/named/ZONE_NAME.zone
2、配置文件的说明
主配置文件: /etc/named.conf /etc/named.rfc1912.zones
# /etc/named.conf # 在这个文件中主要定义(这些定义是全局范围内有效的): # 监听的IP地址和端口号 # 区域文件的家目录 # 是否允许递归查询 # 查询请求 options { listen-on port 53 { 127.0.0.1; }; listen-on-v6 port 53 { ::1; }; directory "/var/named"; allow-query { localhost; }; recursion yes; }; # /etc/named.rfc1912.zones # 在这个文件安中主要定义的是 区域解析库文件 # 一般的格式如下: zone "ZONE_NAME" IN { 属性定义; }; # 常见的属性定义有: # type 指明服务器的类型 常见的有 master hint slave forword # file 指明区域文件的名称 # masters 在 type 为 slave 一起使用,指明主服务器的地址,常见的还有 allow-transfer { IP; }; # 指明允许区域传送的地址,一般在主服务器端这是为从服务器端的 IP 地址,从服务器端设置为 none。 # forward only|first 指明转发服务器的类型,only 只做转发,转发后的查询结果狗接受;first # 指的是转发到的那台 DNS 服务器如果查询不到结果,自己会迭代查询。通常与 type 为forward时 # 一起使用。通常还有 forwarders { ip; }; 指定转发的DNS服务器的名称。 # 此时在服务端要设定 allow-recusion { ip; }; 允许递归的 IP 地址,此时 IP 地址是请求转发的 IP 地址, # 这种情况下一般是在子域授权的时候会使用。 # 其他常见的参数有: # all-update { ip; }; 允许更新 DNS 解析文件的 IP 地址 # file 来指明 zone 文件的名称。00 # ZNOE_NAME 一般是区域名,对于正向解析是 一般是域名,例如:guotign.com # 对于反向解析时,一般是网络地址逆序.in-addr.arpa 例如:16.172.in-addr.arpa # 其他常见的控制有 acl 和 view。 acl ACL_NAME { ip; net; ... };
区域配置(解析库)文件:/var/named/ZONE_NAME.zone
# 这个文件中定义了资源记录,常见的资源记录有:SOA NS A A6(AAAA) MX CNAME PTR # 这些资源定义的格式如下: Name [TTL] IN RR_TYPE RRDATA # SOA(Start Of AuthOrity,起始授权记录),任何解析库文件的第一个记录必须是 SOA # Name值一般为区域名,通常我们用 @ 来代替。RRDATA 是主服务器的 FQDN,也可以是当前区域的名称 @。 # 例如: @ IN SOA ns.guoting.com. admin.guoting.com. ( 2014080601 ;serial number 解析库的序列号。主要用于主从复制 2H ;refresh time 周期性同步时间间隔 5M ;retry time 重试时间间隔 1H ;expire time 过期时长 1D ;negetive answer ttl 否定答案同一缓存时长 ) # NS(Name Server) # Name 是区域名称,一般也是 @ 来代替,如果此时是空白的话,就会继承上一个资源记录的 Name 的值 # RRDATA 的值是主 DNS 的FQDN # 如果有多台 NS 服务器,每一台都必须有一个 NS 记录。 # 例如: @ IN NS ns.guoting.com. # MX(Mail eXchanger,邮件交换记录) # Name 的值一般也是区域名称,RRDATA 邮件服务器的 FQDN 。 # 一台邮件服务器对应一个 MX 记录,每个 MX 记录还有优先级的设定。数值越小所代表的优先级越高。 # 例如: # 这里说明一下:主机名书写的2种方式 mail 或者是 mail.guoting.com. @ IN MX 10 mail # A AAAA(A6) Address记录 # Name 一般是 FQDN;RRDATA 是对应的 IP 地址 # 例如: mail IN A 192.168.10.23 # CNZME(Canonical Name正式名称) # Name 和 RRDATA 的值一般都是 FQDN。表示的是 Name 是 RRDATA 的别名。 # 例如: mail2 IN CNAME mail 等价于: mail2.guoting.com. IN CNAME mail.guoting.com. # PTR(PoinTeR 记录) # 这个记录主要是用于反向解析的时候 # Name 是逆向 IP 地址加后缀 .in-addr.arpa. # RRDATA 是 FQDN # 例如: 9.10 IN PTR ns.guoting.com. 或者是: 9.10.16.172.in-addr.arpa. IN PTR ns.guoting.com # 常用到的 2 个内置变量 # $TTL(time-to-live of the RR)设置资源记录的生存周期 # $ORIGIN 设定默认区域名
ORIGIN的用法通常如下:
上面是一些常见的资源记录,更多详细的的信息参照 http://www.isc.org/downloads/bind/doc/ 。
六、相关工具
1、named-checkconf named-checkzone named-compilezone
这几个命令的主要作用是检查配置文件和解析库文件的语法格式的。
- named-checkconf是用来检查主配置文件的语法格式的。
用法:
named-checkconf
- named-checkzone、named-compilezone是用来检查 zone 文件的语法格式的。
用法:
named-checkzone zonename filename
named-compilezone -o filename zonename filename # -o 会对zone 文件做一个备份
例如:
named-checkzone "guoting.com" /var/named/guoting.com.zone
named-compilezone -o guoting.bck "guoting.com" /var/named/guoting.com.zone
2、客户端查询工具
常见的客户端的查询工具有 host,dig,nslookup。
host -t {A|NS|CNAME|PTR|MX} type_name dns_server 例如:
[[email protected] named]# host -t A www.guoting.com 172.16.10.9 Using domain server: Name: 172.16.10.9 Address: 172.16.10.9#53 Aliases: www.guoting.com has address 172.16.10.16
dig -t {A|NS|CNAME|MX} type_name @dns_server
逆向查询:dig -x IP @dns_server
dig 查询的信息比较详细,是我们一般的首选查询工具
nslookup是一种交互式的查询工具,这个工具在 windows 操作系统上也可以使用。
用server来指定DNS服务器的名称,set type=RR 来指定查询资源记录的名称,指定后直接查询对应的资源记录即可。
七、自建 DNS 服务器
这里需要说明的是在这里所自建的DNS服务器实在本地局域网内的权威服务器。目的是解决本地局域网内的域名解析。
1、实现主从复制DNS服务器,实现正向和反向解析
实验的拓扑图如下:
在 172.16.10.9 主dns服务器:
1、安装软件
# yum install bind -y
2、修改配置文件
# vim /etc/name.conf # 主要的配置选向如下,其他的课根据自己需要添加: options { directory "/var/named"; }; zone "." IN { type hint; file "named.ca"; }; include "/etc/named.rfc1912.zones";
# vim /etc/named.rfc1912.zones # 在这个文件中添加以下内容: zone "guoting.com" IN { type master; file "guoting.com.zone"; allow-transfer { 172.16.10.16; }; allow-update { none }; }; zone "16.172.in-addr.arpa" IN { type master; file "172.16.zone"; allow-transfer { 172.16.10.16; }; allow-update { none }; };
3、创建解析库文件
# vim /var/named/guoting.com.zone $TTL 3600 $ORIGIN guoting.com. @ IN SOA ns.guoting.com. admin.guoting.com. (2014080501 2H 5M 1H 1D) @ IN NS ns @ IN NS ns2 @ IN MX 10 mail ns2 IN A 172.16.10.16 ns IN A 172.16.10.9 mail IN A 172.16.10.16 www IN A 172.16.10.99 web IN CNAME www
# vim /var/named/172.16.zone $TTL 3600 $ORIGIN 16.172.in-addr.arpa. @ IN SOA ns.guoting.com. admin.guoting.com. (2014080501 2H 5M 1H 1D) @ IN NS ns.guoting.com. @ IN NS ns2.guoting.com. 9.10 IN PTR ns.guoting.com. 16.10 IN PTR ns2.guoting.com. 16.10 IN PTR mail.guoting.com. 99.10 IN PTR www.guoting.com.
编辑对应的解析库文件后,修改属组和权限:
chmod 644 /var/named/guoting.com.zone chown .named /var/named/guoting.com.zone chmod 644 /var/named/172.16.zone chown .named /var/named/172.16.zone
4、启动服务
启动服务之前需要对解析库文件进行对应的语法和完整性检查。
named-checkconfig named-checkzone "guoting.com" /var/named/guoting.com.zone named-checkzone "16.172.in-addr.arpa" /var/named/172.16.zone
完成这些之后,启动 named 进程。
/etc/init.d/named start
在启动过程中可能会遇到 "卡” 的情况。
# 原因是:named 进程在启动过程中会去读取 /etc/rndc.key 文件去读取随机数。 # rndc.key 这个文件时从 /dev/random 中取得随机数,虽有会卡。 # 解决办法: # 1、修改 rndc.key 文件的读取随机数的方式为 /dev/urandom。 # 2、敲击键盘,获得足够的随机数到 /dev/randow 中去。 /dev/urandom:先返回熵池中的随机数,耗尽后会用软件算法生成随机数;进程不会阻塞; /dev/random: 只返回熵池中的随机数; 随机数耗尽,进程会被阻塞;随机数取走一个就少一个。
对于解决办法1,具体:修改 /etc/ini.d/named 脚本
5、查询测试
测试成功后,主服务器配置完成。
在 172.16.10.16 从dns服务器:
1、安装软件
# yum install bind -y
2、修改配置文件
# vim /etc/name.conf # 主要的配置选向如下,其他的课根据自己需要添加: options { directory "/var/named"; }; zone "." IN { type hint; file "named.ca"; }; include "/etc/named.rfc1912.zones";
# vim /etc/named.rfc1912.zones # 在这个文件中添加以下内容: zone "guoting.com" IN { type slave; file "slaves/guoting.com.zone"; masters { 172.16.10.9; }; allow-transfer { none; }; allow-update { none }; }; zone "16.172.in-addr.arpa" IN { type slave; file "slaves/172.16.zone"; masters { 172.16.10.9; }; allow-transfer { none; }; allow-update { none }; };
3、启动服务
/etc/init.d/named start # 启动完成后,检查 /var/named/slaves 目录下是否有对应的解析库文件
4、从服务器查询测试
到此,为止主从复制的搭建过程就完成。
补充:
在以后,如果主服务器的解析文件改变的时候,每次都需要修改 SOA 资源记录的序列号,然后使用 rndc reload重读配置文件。
rndc(Rmote Name Domain Contol,远端域名控制)监听在 tcp/953 端口,实现通过远端来控制解析可文件的重读,配置文件的重读等功能。一般情况下,只在本地使用。
常用命令:
- rndc reconfig 重读主配置文件
- rndc reload 重读解析库文件
- rndc flush 刷新缓存
- rndc status 查看 DNS 服务器状态信息
2、在主从服务的基础上扩展子域授权功能(只实现正向解析)
当一个公司某一部门需要自己独立的域名时候,会用到这种功能。要求“父域”与“子域”可以相互解析。
实验拓扑如下:
在 172.16.10.9 主dns服务器:
1、修改配置文件、区域解析文件为:
# vim /etc/name.conf options { directory "/var/named"; allow-recusion { 172.16.10.22; }; # 允许172.16.10.22 递归查询 };
# vim /var/named/guoting.com.zone $TTL 3600 $ORIGIN guoting.com. @ IN SOA ns.guoting.com. admin.guoting.com. (2014080501 2H 5M 1H 1D) @ IN NS ns @ IN NS ns2 @ IN MX 10 mail ops IN NS ns.ops ns.ops IN A 172.16.10.22 ns2 IN A 172.16.10.16 ns IN A 172.16.10.9 mail IN A 172.16.10.16 www IN A 172.16.10.99 web IN CNAME www
2、重读库解析文件
rndc reload
在 172.16.10.22 子域dns服务器:
1、安装软件
# yum install bind -y
2、修改配置文件
# vim /etc/name.conf options { directory "/var/named"; }; zone "." IN { type hint; file "named.ca"; }; include "/etc/named.rfc1912.zones";
# vim /etc/named.rfc1912.zones # 在这个文件中添加以下内容: zone "ops.guoting.com" IN { type master; file "ops.guoting.com.zone"; allow-update { none }; }; zone "guoting.com" IN { type forward; forward only; forwarders { 172.16.10.9 }; allow-update { none }; };
3、创建解析库文件
# vim /var/named/ops.guoting.com.zone $TTL 3600 $ORIGIN ops.guoting.com. @ IN SOA ns.ops.guoting.com. admin.ops.guoting.com. (2014080501 2H 5M 1H 1D) @ IN NS ns @ IN MX 10 mail ns IN A 172.16.10.22 mail IN A 192.168.1.10 www IN A 192.168.1.90
编辑对应的解析库文件后,修改属组和权限:
chmod 644 /var/named/ops.guoting.com.zone chown .named /var/named/ops.guoting.com.zone
4、启动服务
/etc/init.d/named start
查询测试:
在 172.16.10.9:
在 172.16.10.22:
至此,子域授权创建过程完毕。
3、实现视图功能
视图主要的功能是当不同类的客户端解析不同的域名时,解析到的地址信息也是不同的。通常与acl一起使用。
实验拓扑图如下:
在 172.16.10.9 中配置:
实验中采用 172.16.10.16 客户端来模拟内网用户,使用192.168.1.66来模拟外网用户。
1、编辑配置文件
2、修改文件属性,重新加载配置文件
# 这几项比较重要,记得修改 chmod 640 /var/named/guoting.com.zone.internal chmod 640 /var/named/guoting.com.zone.external chown root.named /var/named/guoting.com.zone.internal chown root.named /var/named/guoting.com.zone.external rndc reload
3、查询测试
模拟内网测试:
模拟外网测试: 说明:192.168.1.66 与 172.16.10.9 是同一台主机,不同网卡的地址。
至此,本文全部完成。
总结:本文主要介绍了DNS的原理,以及如何自建主从复制,子域授权,视图等。更多的配置信息也可以阅读官方手册。地址:http://www.isc.org/downloads/bind/doc/
DNS原理介绍和具体搭建DNS