一、DNS解析原理

1、在互联网的早期,用户只有通过ip地址才能打开所需要的网页,如今用户只需知道网址就可以访问网站,这主要归功于DNS解析!DNS服务器其实就是放置ip地址和网站容易记得名字即FQDN的地方,当客户端输入一个FQDN时候,比如http://www.baidu.com,会自发的向DNS服务器去询问这个地址对应的ip地址,然后通过这个ip地址来访问网站。刚一开始的时候并不是dns这么先进,而是通过机器上的host文件来记录ip和主机名称的对应关系,在windowxp上利用/etc/host文件记录,让访问者可以通过主机名称获得对应的ip地址,本地网络中所有的主机及其对应的ip地址的名单要记录在每一台主机上,这种方法的缺陷是文件无法自动更新

若ip数量很多时文件也会很大,所以bind就应运而生,它是目前世界上使用最广泛的域名解析系统!

2、当需要域名解析时,现在本机进行域名解析即查询host文件,如果查询不到就将这个请求发送给自己指定的域名服务器,指定的域名服务器先在自己的缓存中找相关的记录,如果没有找到,这个域名服务器就会向根服务器发送请求,然后逐级向下查询,下面是通过查询一个www.redhat.com的例子来看查询的原理:

(1)客户端将www.redhat.com的查询递交给本地dns服务器(递归查询)

(2)本地dns查询缓存、区域数据库,如果没有查到会将这个请求发送到根dns服务器,请求解析主机名称,根dns把com的dns 服务器ip地址返回给本地dns服务器

(3)本地dns服务器将请求发送给“com”DNS服务器,此服务器根据请求将“redhat.com”DNS服务器ip地址返还给本地DNS服务器(迭代查询)

(4)本地dns服务器向“redhat.com”DNS服务器发送请求,由于此服务器具有www.redhat.com记录,因此它将www.redhat.com的ip地址返回给本地服务器。

(5)本地服务器将ip地址发给客户端。

3、DNS查询的分类

(1)按查询方式:递归查询,dns客户端和dns服务器之间的查询;迭代查询,在dns服务器之间的查询。

(2)按查询内容:正向查询,由域名查找ip地址;反向查询,由ip地址查找域名

4、DNS资源记录类型

DNS服务器在提供名称解析服务时,会查询自己的数据库,在该数据库中包含了DNS区域资源的记录,内容主要有以下几种:

(1)SOA:起始授权记录

(2)NS:名称服务器

(3)A:地址记录

(4)CNAME:别名记录

(5)PTR:反向地址记录

(6)MX:邮件交换记录,指向一个邮件服务器

5、在linux上安装bind

Bind服务相关的软件包有一下几个:

Bind:bind服务器软件

Bind—chroot:为bind提供的chroot机制的包

Catching-nemeserver:bind配置文件样例,并提供缓存

1、rpm -ivh bind-9.3.6-4.P1.el5.i386.rpm

rpm -ivh bind-chroot-9.3.6-4.P1.el5.i386.rpm 

Rpm-ivh caching-nameserver-9.3.6-4.P1.el5.i386.rpm 

2、查询安装好后形成的文件

[root@localhost ~]# rpm -ql bind |less

 /etc/rc.d/init.d/named:脚本的名称,service启动用的。

/usr/sbin/named

/usr/sbin/rndc:上面这两个是DNS服务器的配置文件

/var/named/chroot:DNS的根目录

/var/named/chroot/etc:主配置文档目录

/var/named/chroot/var/named:这是放置区域文件的地方

3、cd /var/named/chroot/etc

4、cp -p named.caching-nameserver.conf named.conf

5、Vim named.conf

>>>>15         listen-on port 53 { 127.0.0.1; };

     //监听的端口,将127.0.0.1改成any,接听任何主机

     16         listen-on-v6 port 53 { ::1; };

     17         directory       "/var/named";

    //上面的目录表示的是/var/named/chroot/var/named

     27         allow-query     { localhost; }; 

    //将localhost改为any,允许任何人发来请求

     28         allow-query-cache { localhost; };

    //将localhost改为any,允许查询缓存

     36      view localhost_resolver {

     37         match-clients      { localhost; };

     38         match-destinations { localhost; };

     39         recursion yes;

     40         include "/etc/named.rfc1912.zones";

     41 };

//上面这是视图,将上面的localhost改为any

6、配置区域文件

   vim named.rfc1912.zones  //会看到很多的设置区域类型

>>>10 zone "." IN {

    11         type hint;

    12         file "named.ca";

    13 }; //这里记录了根服务器的地址在named.ca文件,解析的时候使用,可以打开这个文件一看

    15 zone "localdomain" IN {

    16         type master;//是主还是辅

    17         file "localdomain.zone";//文件在哪里存 放

    18         allow-update { none; };//是否允许更新

    19 };

7、将上面的15到19行复制一份,制作一个区域:

   21 zone "cao.com" IN {

   22         type master;

   23         file "cao.com.zone";

   24         allow-update { none; };

   25 };

下面去生成cao.com.zone文件,可以自己新建手写,也可以复制样例文件改动,这里复制localdomain.zone做改动。

   cd /var/named/chroot/var/named

   Cp -p localdomai.zone cao.com.zone

   Vim cao.com.zone

>>>1 $TTL    86400//表示所辖的这些记录的默认的生存周期

2 @  IN SOA  localhost root(

   //这个@指的是当前的区域,这里就是cao.come.zone

   //这个 localhost要换成dns的名称,这个名字是随意可以起的,这里是  ns.cao.com. 注意最后的“.”一定要有

   //root是管理员邮箱。这里是cao.sina.com,注意不可有@,用“.”代替

3  42              ; serial (d. adams)

4    3H              ; refresh

5   15M             ; retry

6   1W              ; expiry

7   1D )            ; minimum

//这几行是刷新策略

8 @           IN NS           ns.cao.com

9 ns.cao.com.      IN A            192.168.93.186

10 localhost       IN A            127.0.0.1

11   ftp            IN A             1.1.1.1

保存退出。

8、检验文件

  检验配置文件:

  named-checkconf /var/named/chroot/etc/named.conf

  检验区域文件:named-checkzom cao.com //写上区域的名字    /var/named/chroot/var/named/cao.com.zone//文件路径

>>>>>>>zone cao.com/IN: loaded serial 42 OK 

 

 

 

9.进行测验

 (1)上面这台机器是虚拟机里的linux主机,ip地址是192.168.93.186,还有另外一台windows 2003设置其ip地址是192.168.93.195.DNS服务器设置为192.168.93.186,选择host-only联网模式,确保两台机器可以连通:

 在windows 2003的cmd里进行测验:

由红线可以知道测试成功,绿色是说无法进行dns反向查询,因为还没配置,当然无法显示,这里不必问,实验已经达到效果。

(2)直接让这台linux主机当做客户端,先做一下配置:

 

 

 vim /etc/resolv.conf

 

 加上这样一句话:>>>

   nameserver 192.168.93.186

 

 

这样用linux进行查询,用nslookup进行查询:

[root@localhost ~]# nslookup ftp.cao.com

 

>>>>>>>>>>>>>>>>>>>>>>>>>

Server: 127.0.0.1

Address: 127.0.0.1#53

Name: ftp.cao.com

Address: 1.1.1.1

用dig进行查询:

 root@localhost ~]# dig ftp.cao.com

 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

; <<>> DiG 9.3.6-P1-RedHat-9.3.6-4.P1.el5 <<>> ftp.cao.com

;; global options:  printcmd

;; Got answer:

;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 54251

;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 0

//授权回答1,额外回答0

;; QUESTION SECTION:

;ftp.cao.com. IN A

//问题

;; ANSWER SECTION:

ftp.cao.com. 86400 IN A 1.1.1.1

//谁授权回答的,是ftp.com.cao

;; AUTHORITY SECTION:

cao.com. 86400 IN NS ns.cao.com.cao.com.

 ;; Query time: 1 msec

 ;; SERVER: 192.168.93.186#53(192.168.93.186)

 ;; WHEN: Wed Oct 31 04:51:51 2012

;; MSG SIZE  rcvd: 70

 

 

 

 

用host进行查询:

 [root@localhost ~]# host http.cao.com

http.cao.com has address 2.2.2.2

很简短!

 

 

 

10、增加一个记录

          Mail   3.3.3.3

改动区域文件,将这条记录写进去就行了,但是新加入的这一行要加载一次才生效,可以让named重启,但是如果区域文件很多的话,加载是很浪费时间的,这时候可以执行下面的命令,可以直接读取改变的内容:rndc  reload

[root@localhost named]# rndc reload

server reload successful

[root@localhost named]# host mail.cao.com

mail.cao.com has address 3.3.3.3

 

 

编辑/var/named/chroot/var/named/cao.com.zone

 在原来的基础上加上最后一行:

ftp             IN A            1.1.1.1

http            IN A            2.2.2.2

mail            IN A            3.3.3.3

smtp            IN CNAME       mail.cao.com.//最后的.不可少,也可以直接写成mail

执行下面命令:

[root@localhost named]# rndc reload

>>>>>

server reload successful

[root@localhost named]# host smtp.cao.com

>>>>>

smtp.cao.com is an alias for mail.cao.com.

mail.cao.com has address 3.3.3.3

11、邮件交换记录,指向一个邮件服务器

 ftp             IN A            1.1.1.1

http            IN A            2.2.2.2

mail            IN A            3.3.3.3

smtp            IN CNAME       mail.cao.com.

@               IN MX  9       mail   //9表示优先级

 

 

 

用nslookup查询:

 Rndc reload;

 [root@localhost named]# nslookup> set q=mx

 

> cao.com

Server: 192.168.93.186

Address: 192.168.93.186#53

cao.com mail exchanger = 9 mail.cao.com.

 >bye

 用dig查询:

 [root@localhost ~]# dig -t mx cao.com

 注:dns用的是53端口,udp53用来接收客户端请求,tcp53用来辅助dns和主dns交换数据使用。

 

 

~                           

 

~