使用环境:Centos 5.5、Bind9、Chroot、Webmin
DNS 概述
- 计算机网络中的主机之间只认识 IP,但人们更喜欢为计算机命名(网址),因为名称更直观易记
- 最初的名称服务是通过 /etc/hosts 来实现的,可以记录经常访问的计算机名称(域名或主机名)及其IP地址。现在仍在使用
- DNS 是这样一种网络协议(系统),它能把域名转换为IP地址。在 Internet 上,它有一个庞大的分布式数据库,记录着全世界服务器的名称和对应的IP地址(双向映射)
- DNS 是树型结构的分布式系统,由根域(root)、顶域(如 .com 、.cn)和各级子域(job.gdut.edu.cn)组成。DNS解析的最终记录是主机名(树叶、结点),而主机名是在某域(树枝、目录)之下的。
DNS 分类(按功能/角色划分)
- 权威 DNS
- 权威 DNS 是经过上一级授权对域名进行解析的服务器,同时它可以把解析授权转授给其他人,如 COM 顶级服务器可以授权 ABC.COM 的权威服务器为 NS.ABC.COM,同时NS.ABC.COM还可以把授权转授给 NS.DDD.COM,这样 NS.DDD.COM就成了 ABC.COM实际上的权威服务器了。
- 权威 DNS 真正保存了域名和IP映射的记录。平时我们解析域名的结果都源自权威 DNS。
- 递归 DNS
- 负责接受用户对任意域名查询,并返回结果给用户。递归 DNS的工作过程参见本文第三节。递归 DNS 可以缓存结果以避免重复向上查询。
- 我们平时使用最多的就是这类 DNS,他对公众开放服务,一般由网络运营商提供,大家都自己可以架递归 DNS提供服务。递归 DNS一定要有可靠的互联网连接方可使用。
- 递归 DNS 一般只设置了根域Zone“. ”,在这个Zone 中保存着全球根服务的IP地址列表。
- 最新的根服务器地址列表在这里可以得到:ftp://ftp.internic.net/domain/named.root
- 转发 DNS
- 负责接受用户查询,但它不进行从根服务器开始的标准递归查询过程。它只是把查询请求简单的转发给其它DNS(如递归 DNS),由其它DNS去负责实际的查询工作,最后把其它DNS的查询结果返回给用户。它也具备缓存功能。
- 他主要使用在没有直接的互联网连接,但可以连接到一个递归 DNS那里,这时使用转发 DNS就比较合适。
- 其缺陷是:直接受递归 DNS的影响,服务品质较差。
以上三类DNS中,只有权威DNS真正保存了名称-IP记录。事实上一个DNS可能同时具备上面的三种功能,这完全依据于管理员的配置。
域名解析过程(DNS 服务器工作原理)
- 用户主机myhost访问一个网址,如 www.job.gdut.edu.cn
- myhost 取出/etc/resolv.conf 设置的主DNS服务器(mydns)的IP地址
- myhost 通过IP地址访问mydns,查询该DNS服务器中有没有域job.gdut.edu.cn的记录
- 如果有,再查询该域下有没有主机名为www的记录,取出其IP给myhost,整个解析过程完成
- 如果没有,则根据当前DNS服务器的配置,可能作如下某一处理过程(转发DNS或递归查询DNS):
- mydns把myhost的DNS请求转发给Forwarder DNS服务器(Forward 缓存模式)。这是一个简单的代理过程,域名解析成功与否最终取决于Forwarder DNS
- mydns进一步访问根域,由根域开始一级一级向下递归查询各子域,真到完成。它是怎么访问根域的呢?一般DNS都有设罢根域Zone ".",这个Zone中记录了当前Internet上十多台根域服务器的IP地址,而这十多台根域服务器通常是比较固定的,其记录可从网上下载(ftp://ftp.internic.net/domain/named.root)
- mydns访问根域“.”服务器,查询数据库中有没有“.cn”记录。通常根域服务器“.root”老大会说:“嘿,我这里有.cn的记录,但它是一个子域,我把所有“xxx.cn”形式的域名解析工作都转交给它了,你去问它吧,我给你它的IP”
- mydns查询子域“.cn.”的DNS服务器,通常该服务器中保存有类似“.com.cn”“.edu.cn”“.net.cn”“.org.cn”的域名记录,通过对比,我们要的是“.edu.cn”这个网段,所以该子域服务器会把它的下属“.edu.cn”域服务器(NS)的IP发给mydns。
- mydns 查询子域“.edu.cn.”的DNS服务器,该服务器中保存了形如“xxx.edu.cn”的所有记录。该服务器在其数据库中找到“gdut.edu.cn”域服务器(NS),并把它的IP发给mydns。
- mydns 查询子域“gdut.edu.cn.”的DNS服务器,该服务器中保存了形如“xxx.gdut.edu.cn”的所有记录。该服务器在其数据库中找到“job.gdut.edu.cn”域服务器(NS),并把它的IP发给mydns。
- mydns 查询子域“job.gdut.edu.cn.”的DNS服务器,该服务器在其数据库中Look了一下,惊奇地发现,有一条记录是“www”啊,而且它是主机名称的地址(A,终端叶子),而不再是域名(NS)了。于是,它把名为“www”的主机IP地址发给了mydns。
- mydns把查询结果(www.job.gdut.edu.cn - IP 映射)暂时缓存起来,它想,下次再遇到你,我就轻松多了(省去了复杂的查询过程)。至于缓存多久,由“job.gdut.edu.cn”域服务器设置的TTL参数指定,因为这个映射可能会变化。
- mydns把主机“www.job.gdut.edu.cn”的IP地址交给myhost,圆满完成解析工作,oh yeah!
- myhost通过这个IP,终于可以访问www.job.gdut.edu.cn了。这是一个IP路由过程,尽管还是很复杂,但不是DNS能够管的了。
DNS 的一些概念
- 域(Zone):表示一组计算机集合的空间,树型抽象概念。域下可以有无数的主机,还可以包含子域。如根“. (root)”是一个域,“.cn”是一个域,“.edu.cn”也是一个域,但“.edu.cn”是“.cn”的一个子域。
- FQDN:Fully Qualified Domain Name,即完全合格域名,是指主机名加上域名组成的全路径,用于唯一标识 Internet 上某一主机的名称。如 www.flyox.com,其中flyox.com是域名,www是该域下的主机名,可以想像这台主机是用于提供Web服务的。
- 正向解析:提供从域名到IP地址的映射
- 反向解析:提供从IP地址到域名的映射
- 委派:也称授权,即把当前域(如.com)下的某子域(abc.com)的所有域名的解析工作委派给另一台DNS服务器。这是DNS系统分布式结构的基本。通过一条NS记录附加一条A记录实现。注意委派只能发生在上下级之间,同级之间不能委派。
主从结构的 DNS Server
- 主从结构不是必须的,通常只要一个主服务器(Master)就行了。加多一个或多个从服务器(Slave,辅助服务器)是为了整个网络的域名解析更加可靠
- 不管是 Master 还是 Slave,都是独立的DNS服务器,都要进行单独配置。只有某一个或几个域(Zone)是共享的,只在 Master 上配置即可,Slave设置好后会自动同步(SOA记录指定)。这样的好处是只需要设置一处。
Forward-only (Cache-only) DNS Server (转发 DNS)
- 这种类型的 DNS 主机没有自己的数据库,也不向根DNS服务器查询,只是单纯帮助 Client 端向外部的 DNS 主机要求数据而已。它是一个简单的“代理人”角色,把DNS查询请求简单地转发给外面的DNS服务器。
- 通常设定在防火墙上面。
- 修改配置文件“/etc/named.conf”,编辑“options”节即可完成该类型的DNS配置,如下:
Chroot 环境下的Bind
- 为了服务器安全,bind9默认提供了一个可选的组件:bind-chroot
- chroot 是 change root to ... 的意思,就是把 Linux的根目录映射到另一目录,这样就不用直接操作Linux的根目录进行服务器的配置了
- bind-chroot 的映射目录由配置文件 “/etc/sysconfig/named” 指定。bind 的 chroot 默认为“/var/name/chroot”
- chroot 环境下的配置文件的路径,都是相对于设置的chroot目录,并不是绝对路径。如默认环境下 /etc/named.conf 实际路径是 /var/name/chroot/etc/named.conf
Bind 相关的配置文件
- 文件 /etc/sysconfig/named:由该文件指定是否启用chroot及其额外参数
- 文件 /etc/named.conf:主配置文件,可设置 bind 的全局参数(options)、各域(Zone)的参数和域库文件路径
- 目录 /var/named:该目录存放着各个域库文件,即/etc/named.conf设置的Zone的具体记录文件,包括正解和反解域
- 目录 /var/run/named:named程序执行时默认将pid-file存放在该目录
域库文件中域名的表示方法
- 默认Zone名:“@” - named.conf 中定义的 Zone 名(如“bt.com”)
- 短名称:主机名或Zone名后不带小数点“.”,表示bind在解析时会自动加上默认Zone名(如 “.bt.com.”)最终成为FQDN
- 长名称:整个域名的完整名称,即FQDN,以“.”结束,如 “file.bt.com.” 注意FQDN中的最后一个点表示根的意思。
记录项(RR)类型
- NS:名称服务器,表示将到指定的NS查询记录,一般用于指向本域(默认)和子域DNS服务器(再递归查一次),相当于树中的枝
- A:主机对应的地址,最终要查询的记录,相当于树的叶子
- MX:指明当前域下使用的邮件服务器的FQDN,以供邮件发送端查询到正确的目标邮件系统主机
- CNAME:设置主机的别名。多个名称指向同一IP时适用,这样IP一旦改变,只需要修改一次
- SRV:服务位置记录。设定当前域名下默认的各类服务器(地址、端口)。设置后,可以通过当前域名直接访问各类服务,而不用指定具体的服务器主机。与MX类似。
DNS 服务器测试
- 配置好后,重启 named 服务 (# service named restart)
- 查看日志,验证 named 工作正常
- # tail -n 15 /var/log/messages | grep named
- 没有异常出现
- DNS 客户端面命令
- host -l [FQDN] [dns-server]:使用指定的[dns-server]查询网址[FQDN]
- nslookup [FQDN] [dns-server]
- dig [@dns-server] [FQDN] [+trace]
- whois [FQDN]
子域名授权问题
- 要想让本域外的主机能通过域名访问本域,需要得到上一级DNS的授权(委派)
- DNS 授权:把目标域(子域)的域名解析工作委托给某一台DNS (一级级向下传递直到权威 DNS)
- 权威 DNS:实际保存目标域各域名记录的DNS
- 要想让Internet上的主机能够访问你架设的DNS域,你得加DNS加入到Internet域名体系,即得先申请一个域名,并且得到上一级域名服务器的授权,成为所申请域名的权威DNS。
- 授权后,上一级的 DNS 中有一条指向你的DNS服务器的NS记录和指明自己DNS地址的A记录,如:
注意:
- NS、MX、CNAME 等记录可以指向域外的主机,也可指向本域内的主机:
- 指向域外主机时:应确保外部DNS在整个名称体系中能解析出真正的IP
- 指向域内主机时:一般为所指的域名配套提供 A 记录
- NS 指向域外主机/服务器,即是把该子域名的解析情况授权给这个DNS。所以说,DNS 体系在逻辑分布上是树型的,但 DNS 本身的域名可能不在同一域,如DNS服务器“ l.gtld-servers.net ”可解析 xxx.com 的域名
- 在 Internet 上,顶级域服务器保存了每一域名的NS记录,其 DNS 可以是在本域外的主机。MX、CNAME记录也一样。
- 一般来说,用户注册了一个顶级域名(abc.com),域名代理商会提供一个Web控制面板,通过这个面板,用户可以修改顶级域(如.com)下域名 abc.com 的NS记录,而默认情况下这个NS记录是指向域名代理商自己的DNS服务器的。如果用户使用代理商的DNS,面板还可以修改 abc.com 域下各个记录,如MX记录、一定数量的A记录等,如果代理商宣称支持二级域名,那还可以添加NS记录。
- 有些域名代理商规模小,限于公司实力,可能没通过 ICANN 的认证,也没自己的DNS,也没有自己的企业邮箱服务器,也没有Web虚拟主机,那么,就可以把NS记录指向合作伙伴的DNS,再通过这个DNS添加MX记录指向企业邮箱服务商……最终实现整合。
空域名解析和泛域名解析
- 空域名:即当前域的默认主机,如很多网友懒得输入前缀“www.”
- 泛域名:即在当前域匹配不了的名称都将指向到该地址
CNAME 记录使用注意事项
- NS、MX 记录指定的名称一定要能解析的。如果名称是本域的,还必须提供A记录,且不能是CNAME记录。
- 空域名@(如 bt.com)也不能使用CNAME记录,泛域名*(如 xxx.bt.com)可以使用 CNAME 记录
使用DNS实现简单的负载均衡
- DNS 经常被用作一个低成本的负载均衡解决方案(依靠多条同一域名不同IP的A记录实现)
- DNS 通过轮询的方式分配不同的IP。即在客户机查询域名的IP时,第一台客户机得到第一IP,第二台客户机得到第二个IP……
- 同一台客户机多次查询将得到同一个IP,因为客户机上也有DNS缓冲。使用 ipconfig /flushdns 清空缓冲后,可以检验这种机制
实验:亲手缔造DNS体系,创建DNS私有根
请参考《亲手缔造DNS体系,创建DNS私有根:DNS系列之六》做一个完整的DNS实验。文章是以Windows Server 为例子,但配置过程是一样的,配置文件也差不多。
架设 DDNS 服务器
- DDNS:动态DNS,适用于有公网IP,但IP经常变动的场合,如ADSL宽带
- 通过 bind 的 update-policy 实现
- 服务器端:生成一对密钥,把公钥复制到 /etc/named.conf 的 key 节,并把这个key 授权给动态DNS的Zone
- 客户端:使用生成的公钥和私钥,按时(或 IP变更后)执行命令 “nsupdate”,更新新的IP到DDNS中
参考: