welcome: please sign in
location: DnsWithBind9

DNS with Bind9

DNS 即域名服务器 (Domain Name Server),其终极任务就是将域名解析为 IP 地址。

这是 xiaq 给 166.111.111.118 (简称 118)(这是历史资料了,现在118已经不再是DNS服务器了) 配置 DNS 服务后整理出来的笔记。118 是 Ubuntu 10.04 主机,使用的 DNS 服务端是 BIND9。不过我会尽量让讲述与发行版无关。

1. DNS 记录、nslookup

自然地,DNS 服务器内必须有一张表记录名字和 IP 地址的对应关系。最原始的方案自然是采用类似 hosts 文件的语法,如

74.125.71.104 www.google.com

实际上,这类记录 (record, def= DNS 数据库中的一个表项) 在 DNS 中是最基本的一类,即A 记录 (address record)。然而现代 DNS 为了支持更复杂的查找方式以及更灵活的分布式存储,引入了多种记录类型。

下面介绍:

1.1. /etc/resolv.conf

% cat /etc/resolv.conf
nameserver 166.111.8.28

Linux 在这个文件里面保存默认 DNS。详见 man 5 resolv.conf

1.2. A 记录

A 记录保存域名到 IP 的直接映射关系。

% nslookup -query=a rrurl.cn
Server:         166.111.8.28
Address:        166.111.8.28#53

Non-authoritative answer:
Name:   rrurl.cn
Address: 60.29.242.220

TIP: nslookup 默认请求 A 记录。上面的 -query=a 其实是可以省略的。

“Non-authoritative answer”的含义是什么?DNS 服务器是分布式的,某个表项除了在它的原始来源的服务器上有存储之外,其它 DNS 可能会保存 cache 以加快速度。DNS 表项的原始来源就是它的权威服务器 (authoritative server)。只有直接取自权威服务器的回答才是“权威回答”。

可以设想,在 rrurl.cn 这个域名的权威服务器的 zone 文件上,会有上面说到的类似 hosts 文件的记录。实际上 zone 表项的语法要稍微复杂一点,可能会是:

rrurl.cn. IN A 60.29.242.220

关于域名最后的“.”,参见附录。

1.3. CNAME 记录

CNAME (Canonical name) 记录保存别名。

% nslookup -query=cname www.google.com

查找 A 记录时,如果没有 A 记录只有 CNAME 记录,nslookup 会自动解析 CNAME。试试这个:

% nslookup -query=a www.google.com

在 zone 文件中 CNAME 是这样:

www.google.com. IN CNAME www-g-com-chn.l.google.com.

TIP: 大多数不保存目标 IP,只保存目标域名。

1.4. NS 记录

对应于域名空间,DNS 服务器也具有层级结构

NS (name server) 记录用于把某个域下的子域委托 (delegate) 给另一台 DNS 服务器解析。例如 tuna.tsinghua.edu.cn. 是 tsinghua.edu.cn. 的子域,后者又是 edu.cn. 的子域,再后者又是 .cn. 的子域,再后者就是顶级的“.”。试试这个:

% nslookup -query=ns tuna.tsinghua.edu.cn.

对应地,tsinghua.edu.cn. 这个域的权威 DNS 上保存了这样的记录:

tuna.tsinghua.edu.cn.    IN NS dns.tuna.tsinghua.edu.cn.
dns.tuna.tsinghua.edu.cn IN A  166.111.111.118

TIP: 注意到 NS 记录也不直接指向 IP。

这样在碰到 tuna.tsinghua.edu.cn. 及其子域的查询时,查询会被转发给 118。dns.tuna.tsinghua.edu.cn. 除外 (不然就死循环了),其中的原则我暂不是很清楚。

NOTE: NS 记录会导致某个子域的所有类型的 DNS 请求都被转发,如 A、CNAME、NS,还有下面提到的 SOA。

1.5. SOA 记录

SOA (Start of Authority) 记录保存某个域的权威服务器及其元信息。上面的 NS 记录并没有使得 118 自动成为 tuna.tsinghua.edu.cn. 的权威服务器,也没有指定其元信息。不过既然所有类型的 DNS 请求都被转发过来了,SOA 记录的请求也不例外。所以在 118 的对应的 zone 文件中有如下记录:

tuna.tsinghua.edu.cn.      IN      SOA     dns dns.tuna.tsinghua.edu.cn. (
                                                        2006081401
                                                        28800
                                                        3600
                                                        604800
                                                        38400
 )

“SOA”之后给出了“IN”前的子域的权威服务器的相对域名 (在这里,是相对 tuna.tsinghua.edu.cn.) 和绝对域名。括号中是权威服务器的元信息,我们可以暂时不管。(SOA之后是相对域名和绝对域名的说法是不正确的,SOA后面的两条纪录就是NS和Email,参考http://www.zytrax.com/books/dns/ch8/soa.html,comments from yuexin)

1.6. 进一步阅读

Domain_Name_System

List_of_DNS_record_types

Authoritative_name_server

man 1 nslookup

man 1 dig dig 是另一个更强大的 DNS 调试工具。

2. BIND9 on Ubuntu/Debian

$ sudo apt-get install bind9 bind9-host dnsutils

和 Ubuntu 下大多数服务一样,bind9 可以用 upstart 管理,也可以使用 Debian 传统的 /etc/init.d/bind9。值得注意的是,bind 在很多地方叫做 named (Name server Daemon),例如它的可执行文件是 /usr/sbin/named

2.1. 配置概览

bind 的配置文件分为两种,即 bind 自身的配置和 zone 文件,前者具有类 C 的语法。后者在 Ubuntu 中被集中放置在 /etc/bind/zones 中,除了标准的 /etc/bind/zones.rfc1918。

bind 的主配置文件是 /etc/bind/named.conf。Ubuntu 把 bind 自身的配置分割为 named.conf.{local,options,default-zones} 三个文件,named.conf 只是 include 它们。每一个子域都需要在 named.conf.local 中注册,然后在 /etc/bind/zones/ 下有一个 zone 文件。

使用 named-checkconf 和 named-checkzone 检查配置文件的正确性。

2.2. zone 文件

TODO: 上面已经介绍了 zone 文件表项的写法,这里只需要说一下文件结构之类的就行了。To be written.

2.3. 进一步阅读

http://wiki.ubuntu.org.cn/Bind9安装设置指南

https://help.ubuntu.com/community/BIND9ServerHowto

man 8 named

man 8 named-checkconf

man 8 named-checkzone

3. 附:URL、URI 和域名

3.1. URL 和 URI

通常所说的“网址”,如

http://tuna.tsinghua.edu.cn/howtos/DNSWithBind9.html

它的技术名称叫 URL (Universal Resource Locator)。URL 由协议 (http)、域名 (tuna.tsinghua.edu.cn) 和路径 (/howtos/DNSWithBind9.html) 三部分组成。

有的技术文档里面也会用到 URI (Universal Resource Identifier) 一词。实际使用中这两个词的区别很小,参见URI

3.2. 域名空间

域名 (domain name) 是用来在 Internet 上定位主机的名字。

类似于 UNIX 路径名 (path name),域名是层级式的 (hierarchical),但是域名写在越后面的分量等级越高,和路径刚好相反。对应于路径中的“子目录”(subdirectory),域名的每一层组织是一个“子域”(subdomain)。

COMMENT: 为什么域名的书写顺序和路径名刚好相反?我不知道。如果你有好的解释,欢迎和我分享。

根域名是“.”,类似于 UNIX 路径的“/”。域名最后的“.”表示这是一个绝对域名,如果没有它则为相对域名,如“mirrors”在特定的上下文中可能表示 mirrors.tuna.tsinghua.edu.cn., mirrors.163.com. 等等等等。

在浏览器上很少需要使用相对域名,因此经常把最后的 . 略去,这就是我们在通常看到的域名。然而在 bind 这类域名服务器相关的配置中,绝对域名最后的 . 是很重要的


CategoryHowto CategoryDns

DnsWithBind9 (2011-10-31 13:37:48由xiaq编辑)