DNS 简介
DNS(Domain Name System)
作用:管理主机的“户籍”---主机名:IP,是一个分布市数据库系统
起源:最早的主机解析,依靠hosts文件,由NIC(Network Information Center)维护,后来主机数量变得非常庞大,网络越来越复杂,就产生了DNS服务器。
DNS系统的结构(倒挂的数形结构):
域名注册:
注册.com下面的域名,比如redhat.com,需要找.com的域的管理者(通常为国际域名管理组织www.webnic.cc)
注册.redhat.com下面的域名,比如mydomain.redhat.com 需要找到redhat.com域的管理者。
常用术语:
DNS服务器:提供域名解析服务的主机
DNS客户机:需要查询主机域名信息的主机,任何联网的主机都需要查询域名,所以任意主机都是DNS客户机。DNS客户机需要知道DNS服务器在哪里,liinux靠/etc/resolv.conf指定。
正向解析:根据主机名解析IP地址。
反向解析:根据IP地址解析主机名称。
DNS解析的过程:常用的是递归解析,如果你要解析mail.sohu.com这个域名,主机就会向/etc/reslv.conf中指定的DNS服务器发送解析请求,如果其上有对应的缓存,就直接反馈给,如果没有就进行递归查询,其先向根(.)请求,跟就会把.com的DNS服务器地址返回给请求者,然后本地的DNS就会向.com的DNS发送解析请求,.com返回sohu.com的DNS地址,原因同上,然后本地向.sohu.com的DNS发送解析请求,sohu.com的DNS将mail.sohu.com对应IP地址返回给本地的DNS,本地的DNS再将对应的信息返回给客户机。这就是递归查询的过程,实际应用中会有一些差别。具体可以从网上搜索相关资料。
安装配置BIND
1.下载bind http://www.isc.org
ftp://ftp.isc.org/isc/bind9/ 该FTP中可以找到最新版本的bind文件。根据自己需要下载。
2.编译安装
[root@happyboy soft]# tar xvzf bind-9.4.0.tar.gz
[root@happyboy soft]# cd bind-9.4.0
[root@happyboy bind-9.4.0]# ./configure --sysconfdir=/etc --disable-openssl-version-check
(因为测试在AS 3环境下进行,安装新版本9.4.0,提示"It is recommended that you upgrade to OpenSSL version 0.9.8d/0.9.7l (or greater).You can disable this warning by specifying:--disable-openssl-version-check,所以添加了个个参数)
[root@happyboy bind-9.4.0]# make
[root@happyboy bind-9.4.0]# make install
安装程序默认将应用程序安装在/usr/local/bin下,如DNS调式工具dig,解析DNS工具nslookup;服务器程序放在/usr/local/sbin目录下,DNS管理工具rndc,named。
[root@happyboy bind-9.4.0]# vi /etc/nameed.conf 手动创建配置文件,内容如下:
options {
directory "/var/named";
};
zone "." {
type hint;
file "named.ca";
};
zone "localhost" {
type master;
file "named.local";
};
注意文件格式,括号内外都有分号,如果一句结束后没有回车用大括号结束,那大括号与之前的分号之间必须要有空格。
根服务器,在配置文件named.conf中定义根服务器。
zone "." {
type hint;
file "named.ca";
};
产生named.ca文件:
# echo "nameserver 203.196.1.6" > /etc/resolv.conf //在本机配置文件中加入任何一个可用的DNS服务器
# dig -t NS . > /var/named/named.ca //查询根域服务器及其对应的IP地址并写入到named.ca
[root@happyboy named]# more /etc/resolv.conf
nameserver 127.0.0.1 //完成后将本机DNS配置为自身
[root@happyboy bind-9.4.0]# vi /var/named/domain.com.zone
[root@happyboy bind-9.4.0]# named
[root@happyboy named]# tail /var/log/messages //启动服务后,可以在该日志文件中看到如下信息:
Sep 23 21:59:19 happyboy named[22396]: none:0: open: /etc/rndc.key: file not found
Sep 23 21:59:19 happyboy named[22396]: couldn't add command channel 127.0.0.1#953: file not found
Sep 23 21:59:19 happyboy named[22396]: zone localhost/IN: loading from master file named.local failed: file not found
Sep 23 21:59:19 happyboy named[22396]: running
最后的running表明服务已经启动了(只是我们定义了localhost域,但是没有配置named.local区文件,所以报"file not find")
用# host www.sohu.com可以验证相关信息。
[root@happyboy named]# ps -aux |grep named
root 22396 0.3 2.6 9280 7092 ? S 21:59 0:00 named
root 22405 0.0 0.2 4916 668 pts/1 S 22:00 0:00 grep named
服务还是不完整的,我们需要配置一个RNDC服务器,来控制DNS服务器
1.产生rndc控制文件
[root@happyboy named]# rmdc-confgen > /etc/rndc.conf //用该命令生成rndc的配置文件。
[root@happyboy named]# cat -n /etc/rndc.conf //查看该文件,只有前面几行是起作用的,#号注释部分有说明:Use with the following in named.conf,
adjusting the allow list as needed: 即下面内容加入到named.conf
[root@happyboy named]# tail +13 /etc/rndc.conf >> /etc/named.conf //按照要求将后面内容假如到named.conf
千万注意:这样copy过去还要把对应注释符号#取消才可以启作用,说明的两行
# Use with the following in named.conf, adjusting the allow list as needed:
# End of named.conf
就不要取消注释了……
可以用正则表达式来实现即vi命令(:.,$-1s/^#\ //)即将当前行(.)到倒数第二行($-1,$代表最后一行),s表示替换内容为/^后的内容(# )后面的空格要用转移字符\ //表示删除
[root@happyboy etc]# killall -9 named
杀死进程后重启
[root@happyboy etc]# rndc status //可以查看到服务器状态,说明服务启动成功。
日志也正常
[root@happyboy root]# more /var/log/messages
Sep 23 22:14:04 happyboy named[22466]: listening on IPv4 interface lo, 127.0.0.1#53
Sep 23 22:14:04 happyboy named[22466]: listening on IPv4 interface eth0, 192.168.0.200#53 //在53端口守护
Sep 23 22:14:04 happyboy named[22466]: command channel listening on 127.0.0.1#953 //rndc守护端口
在确定resolve.conf中定义的DNS服务器为本身,可以正常解析出域名了
增加localhost域,开始就已经定义好了
named.conf 中
zone "localhost" {
type master; //类型为master,对应slave ,这个域的数据库需要自己维护
file "named.local"; //指定该域的区文件
};
创建/var/named/named.local内容如下
@ IN SOA localhost. root (
2004081201 ;serial
1H ;refresh
15M ;retry
1W ;expire
1D ) ;TTL
IN NS @
IN A 127.0.0.1
第一个字段一般为一个域名或者一个主机名,这里的@表示当前的local区区名"localhost"
第二个字段指类型 IN(Internet互联网类型)
第三字段指记录类型,是服务器NS、地址、或者是文件交换记录。每个区都有一个SOA(起始授权机构)这样的记录记录,内容包括:该区文件是为哪个区(localhost.)定义的;后面
是该区域的管理者root是缩写,完整的应该以点结尾,没有以点结尾都会加上该区域的后缀,即完整的为root@localhost.,也以点结尾,但是@有定义为本区域,所以转意为
root.localhost.缩写为root,从小括号(与前面的root之间要有空格)开始是定义本域信息
后面两行完整应该为
localhost. IN NS localhost.
localhost. IN A 127.0.0.1
因为localhost.同@,可以用其代替,有因为这几条记录都是基于同一个域名@的,所以前面省略了,最终同上述模式,这些记录的其他属性,如生存周期ttl同SOA记录
测试
[root@happyboy root]# host localhost
localhost has address 127.0.0.1
已经可以解析localhost这个在named.conf中定义的域了。
[root@happyboy root]# dig localhost //也可以用dig来查询,信息比host丰富,具体。
named服务器有缓存功能,第一次解析会比较慢,后续会比较快!
如果有在named.conf中添加新的区域,配置好对应的区域文件后需要执行
# rndc reload //重新载入配置文件 使其生效
测试:增加一个正向解析区域.
在nemd.conf中定义区域以及区域文件
zone "v1.com" {
type master
file "v1.com.zone";
};
定义v1.com.zone区域文件
@ IN SOA v1.com. root (
2004081201 ;serial
36000 ;refresh
7200 ;retry
1W ;expire
1D ) ;TTL
IN NS ns.v1.com. //ns.v1.com.可以简写为ns
IN MX 10 mail.v1.com. //mail.v1.com.可以简写为mail
IN A 192.168.0.100
ns IN A 192.168.0.200
www IN A 192.168.0.100
mail IN A 192.168.0.100
news IN CNAME www.v1.com. //www.v1.com.可以简写为www
[root@happyboy named]# rndc reload
rndc: 'reload' failed: failure
[root@happyboy named]# more /var/log/messages
Sep 26 21:47:46 happyboy named[1452]: loading configuration from '/etc/named.conf'
Sep 26 21:47:46 happyboy named[1452]: /etc/named.conf:16: missing ';' before 'file'
Sep 26 21:47:46 happyboy named[1452]: reloading configuration failed: failure
在named.conf中定义新域时掉了一个分号(上面的master后),导致重新加载配置文件失败,修改好后正常
[root@happyboy named]# rndc reload
server reload successful
[root@happyboy named]# host v1.com
v1.com has address 192.168.0.100
v1.com mail is handled by 10 mail.v1.com.
注意上面的一行 IN NS ns.v1.com. 也可以更改为两行
IN NS @
IN A 192.168.0.200 //这样表示该域名的ns记录同其@记录,然后在后面再定义其对应@记录即可,但是要注意由于@同上面的最开始省略,故该条记录不要错位到后面
前面有主机名的记录后面,如果在www IN A 192.168.0.200 在表示前面省略的是www了。
[root@happyboy named]# host -t NS v1.com
v1.com name server ns.v1.com.
[root@happyboy named]# host -t A v1.com
v1.com has address 192.168.0.100
[root@happyboy named]# host -t SOA v1.com
v1.com has SOA record v1.com. root.v1.com. 2004081201 36000 7200 604800 86400
[root@happyboy named]# host news.v1.com
news.v1.com is an alias for www.v1.com.
www.v1.com has address 192.168.0.100
可以看到如上的测试结果,为了在一个本地域中可以省略形式来访问,如只输入news来访问news.v1.com,实现方法如下:
[root@happyboy named]# echo "search v1.com" >> /etc/resolv.conf
[root@happyboy named]# more /etc/resolv.conf
nameserver 127.0.0.1
search v1.com
[root@happyboy named]# host news
news.v1.com is an alias for www.v1.com.
www.v1.com has address 192.168.0.200
在区域文件开头部分可以写入全局配置参数
$TTL 1D //指定全局的生存周期
$orignal v1.com。 //指定默认的域,不加也是
============================================================================
127.0.0 反向区域
/etc/named.conf 追加
zone "0.0.127.in-addr.arpa" { //注意区名网段的反向地址+后缀.in-addr.arpa
type master;
file "127.0.0.zone";
};
编译/var/named/127.0.0.zone;
@ IN SOA @ root.localhost. ( 2004051201 1H 14M 1W 1D ) //注意这里的@是代表反向区名0.0.127.in-addr.arpa.,root后面不能省略。
IN NS localhost.
1 IN PTR localhost. //PTR反向解析 IP放在前面,主机名放在后面,数字1完整写法为1.0.0.127.in-addr.arpa.
测试
[root@happyboy root]# rndc reload
[root@happyboy root]# host 127.0.0.1
1.0.0.127.in-addr.arpa domain name pointer localhost.
[root@happyboy root]# dig -x 127.0.0.1 //该命令等同dig -t PTR 1.0.0.127.in-addr.arpa
; <<>> DiG 9.4.0 <<>> -t PTR 1.0.0.127.in-addr.arpa
;; global options: printcmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 45631
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 1
;; QUESTION SECTION:
;1.0.0.127.in-addr.arpa. IN PTR
;; ANSWER SECTION:
1.0.0.127.in-addr.arpa. 86400 IN PTR localhost.
;; AUTHORITY SECTION:
0.0.127.in-addr.arpa. 86400 IN NS localhost.
;; ADDITIONAL SECTION:
localhost. 86400 IN A 127.0.0.1
;; Query time: 9 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Mon Oct 1 14:12:42 2007
;; MSG SIZE rcvd: 93
增加一个反向区/etc/named.conf
zone "0.168.192.in-addr.arpa" {
type master;
file "192.168.0.zone";
};
/var/named/192.168.0.zone文件内容:
[root@happyboy named]# more 192.168.0.zone
@ IN SOA v1.com. root.v1.com. (
2004081201
36000
7200
3600000
86400 )
IN NS ns.v1.com.
100 IN PTR www.v1.com.
100 IN PTR ftp.v1.com.
3.0.168.192.in-addr.arpa. IN PTR mail.v1.com.
测试:
[root@happyboy named]# host 192.168.0.100
100.0.168.192.in-addr.arpa domain name pointer www.v1.com.
100.0.168.192.in-addr.arpa domain name pointer ftp.v1.com.
[root@happyboy named]# host 192.168.0.3
3.0.168.192.in-addr.arpa domain name pointer mail.v1.com.
注意:在做反向解析时尽量不要使用ns记录与其反向记录在同一个IP上,这样可能出现未知的错误,不会出错,但是就是查询不出来的现象。
==========================================================================
子域授权(就是常用的DNS解析中的NS记录)
主服务器的/var/named/v1.com.zone 增加两行
domain IN NS ns.domain (完整写法为:domain.v1.com. IN NS ns.domain.v1.com.)
ns.domain IN A 192.168.2.1
(domain IN NS domain
IN A 192.168.2.1 //也可以简单地写成这样两行,domain为自己的NS记录,IP指向为……)
在192.168.2.1 上配置bind服务器,如下:
增加一个子域:domain.v1.com,named.conf配置文件增加:
zone "domain.v1.com" {
type maser;
file "domain.v1.com.zone";
};
子域服务器的区文件 domain.v1.com.zone如下:
@ IN SOA domain.v1.com. root.domain.v1.com.
(2004081201 36000 7200 3600000 86400 )
IN NS ns.domain.v1.com.
ns IN A 192.168.2.1
www IN A 192.168.2.100
完成后测试方法同主服务器,即将本地/etc/resolve.conf中的DNS更改为127.0.0.1。# host www.domain.v1.com即可看到结果。
注意:这样正确配置完成后在主服务器192.168.0.200上也可以查到授权给子域服务器192.168.2.1解析的domain.v1.com的内容。但是子域名如果查找父域还是要从根(.)域开始查
找。实际上实现的是一个递归查询的过程,整个DNS系统本来就是一个授权过程。具体请参考网络上相关文档。
==========================================================================================
辅助域名服务器
作用:备份主域名服务器的数据,当主服务器出现故障时可以暂时代替主服务器工作。
eg:在辅域上配置v1.com
主配置文件/etc/named.conf上增加该域
zone "v1.com" {
type slave; //指定为辅域
file "v1.com.zone";
masters { 192.168.0.200; }; //注意主域名服务器地址用大括号括起来,括号前后都有空格。
};
# rndc reload //重新载入配置文件
注意:这个更新过程需要对named的directory "/var/named"写入从主服务器上获取的数据,所以named进程用户必须对该目录有写入权限,否则,上述reload过程会失败。
如果是以root用户运行named则不存在这个问题,如果是以named用户named组运行named则执行# chmod g+w /var/named即可。
主服服务器之间数据的同步主要靠
@ IN SOA localhost. root (
2004081201 ;serial //序列号:服务器版本管理信息,时间越新,数字月大。有变化时通知其他DNS更新数据。
1H ;refresh //辅服务器每间隔这个时间向主服务器发送请求,时间由该值决定。如果上述编号变化,则发送请求,数据同步
15M ;retry //辅与主通信如果由于网络等原因失败,再次通信前的间隔时间。
1W ;expire //过期时间:主辅服务器如果在这个定义时间内不停重试还是无法通信,则表示该记录过期。
1D ) ;TTL //最小生存期限,即该区记录的生存期限,一般写在SOA前面,表示该SOA记录缓存时间,默认一天(1D)
这些来实现
===============================================================================
以普通用户身份执行named服务,确保服务器安全。
普通用户在执行时需要写/var/run目录,该目录包含了每个进程的pid文件。
[root@happyboy root]# ls -ld /var/run
drwxr-xr-x 6 root root 4096 10月 1 13:06 /var/run
可以看到其他用户对该目录是不具备写入权限的。为了安全,不更改/var/run 目录,给named建立一个独立pid目录,修改该目录权限,如下:
首先修改named.conf,设置pid-file选项值:
options {
……
pid-file "/var/run/named/named.pid"; //指定named.pid目录
};
[root@happyboy root]# useradd -s /bin/false -d /dev/null named
[root@happyboy root]# id named
uid=515(named) gid=515(named) groups=515(named)
[root@happyboy root]# mkdir /var/run/named
[root@happyboy run]# chown named.named named
[root@happyboy run]# chmod 700 named
[root@happyboy run]# ls -ld named
drwx------ 2 named named 4096 10月 1 13:17 named
[root@happyboy run]# killall -9 named
[root@happyboy run]# named -u named //更改好权限后以named身份运行named
[root@happyboy run]# more /var/log/messages //查看日志信息可以看到named已经启动成功。
[root@happyboy run]# ps -uax |grep named
named 1427 0.1 1.9 7248 5088 ? S 13:27 0:00 named -u named
[root@happyboy run]# which named
/usr/local/sbin/named
[root@happyboy run]# echo "/usr/local/sbin/named -u named" >> /etc/rc.local //让named服务在系统启动时以named身份执行
同时注意,如果是作为辅服务器运行,需要使named用户对named的工作目录/var/named有写入权限。作为主服务器的话无所谓了。
DNS服务器配置常用选项:
options {
directory "/var/named"; //服务器工作目录,即数据库文件存放位置。
forwarders { 192.168.2.1: }; //如果本身无法对某个域名无法解析,将请求转发给的服务器,一般为外部DNS服务器,当该服务器也无法解析就查找根
allow-transfer { 192.168.1.1; }; //是否允许某一个网段或某一个地址同步该服务器上的数据,一般指定辅服务器地址
allow-query { 192.168.0/24; }; //允许查询的客户机地址或者范围。非该范围内的DNS查询请求会被拒绝,具体体现日志中。
};
zone "v1.com" {
type master;
file "v1.com.zone";
allow-transfer { 192.168.1.1; }; //意义同options,只是这个是对这个域有效
};
注意:bind的配置文件格式是非常严格的,大括号前后的空格