DNS工作原理
1.当要进行域名解析的时候,系统会向本地DNS发出解析请求,由本地DNS服务器解析域名与对应的IP地址。
2.本地DNS服务器接收到解析请求后,再自己的本地数据库中查找与请求相匹配的DNS记录条目,如果本地没有相匹配的记录,则本地DNS服务器就会向根域名服务器发出查询请求。
3.根域名服务器在接收到查询请求时,会把查询请求发送到相应的顶级域,再由顶级域发送到二级域,再由二级域发送到三级域,以此类推,直到查询到请求的相应记录,然后发送回本地DNS服务器。
4.最终由本地DNS服务器把结果返回给客户端。
5.如果经过查找后仍然无记录,则由本地DNS服务器向客户端返回无法解析的错误信息。
安装bind软件
1.解压[root@~]#tar zxvf bind-9.9.2.tar.gz2.安装[root@~]#./configure –prefix=/usr/local/named –sysconfdir=/usr/local/name/etc –enable-thread3.生成named.conf配置文件[root@~]#/usr/local/src/bind-9.9.2/bin/configen/rndc-configren | tail -10| head -9 |sed ‘s/#\ //g’ > /usr/local/etc/named.conf4.启动和关闭Bind安装完bind后,可以让bind后台运行[root@~]#/usr/local/named/sbin/named &使用-g参数可以实现显示启动过程中的详细信息。[root@~]#/usr/local/named/sbin/named –g &22-Nov-2012 20:41:30.832 built with '--prefix=/usr/local/named/' '--sysconfdir=/usr/local/named/etc' '--enable-thread'22-Nov-2012 20:41:30.832 ----------------------------------------------------22-Nov-2012 20:41:30.832 BIND 9 is maintained by Internet Systems Consortium,22-Nov-2012 20:41:30.832 Inc. (ISC), a non-profit 501(c)(3) public-benefit22-Nov-2012 20:41:30.832 corporation. Support and training for BIND 9 are22-Nov-2012 20:41:30.832 available at https://www.isc.org/support22-Nov-2012 20:41:30.833 ----------------------------------------------------22-Nov-2012 20:41:30.833 using 1 UDP listener per interface22-Nov-2012 20:41:30.833 using up to 4096 sockets22-Nov-2012 20:41:30.841 loading configuration from '/usr/local/named/etc/named.conf'22-Nov-2012 20:41:30.841 reading built-in trusted keys from file '/usr/local/named/etc/bind.keys'22-Nov-2012 20:41:30.842 using default UDP/IPv4 port range: [1024, 65535]22-Nov-2012 20:41:30.843 using default UDP/IPv6 port range: [1024, 65535]22-Nov-2012 20:41:30.870 automatic empty zone: 113.0.203.IN-ADDR.ARPA22-Nov-2012 20:41:30.870 automatic empty zone: 255.255.255.255.IN-ADDR.ARPA22-Nov-2012 20:41:30.870 automatic empty zone: 0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.IP6.ARPA22-Nov-2012 20:41:30.870 automatic empty zone: 1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.IP6.ARPA22-Nov-2012 20:41:30.870 automatic empty zone: D.F.IP6.ARPA22-Nov-2012 20:41:30.871 automatic empty zone: 8.B.D.0.1.0.0.2.IP6.ARPA22-Nov-2012 20:41:30.878 /usr/local/named/etc/named.conf:7: couldn't add command channel 127.0.0.1#953: address in use22-Nov-2012 20:41:30.878 ignoring config file logging statement due to -g option22-Nov-2012 20:41:30.879 managed-keys-zone: loaded serial 022-Nov-2012 20:41:30.881 all zones loaded22-Nov-2012 20:41:30.882 running关闭:kill 进程ID号
配置named服务器
1.开机自动启动
编写bind服务启动关闭的脚本:vi /etc/init.d/named
#/bin/bash
#Start script for the Berkeley Internet Name Domain Server
# chkconfig: 345 35 75
# description:BIND is a Name Domain Server
# Source function library.
. /etc/rc.d/init.d/functions
# Source function library.
if [ -f /etc/init.d/functions ]; then
. /etc/init.d/functions
elif [-f /etc/rc.d/init.d/functions ]; then
. /etc/rc.d/init.d/functions
else
exit 0
fi
named=/usr/local/named/sbin/named
prog=named
RETVAL=0
#start function
start(){
if [-n "'/sbin/pidof $prog'" ]
then
echo $prog": already running"
echo
return 1
fi
echo "Starting "$prog": "
base=$prog
$named &
RETVAL=$?
usleep 500000
if [ -z "'/sbin/pidof $prog'" ]
then
#The child processes have died after fork()ing
REVEL=1
fi
if [ $RETVAL -ne 0 ]
then
echo 'Startup failure'
else
echo 'Startup success'
fi
echo
return$RETVAL
}
stop () {
echo "Stopping "$prog":"
killall$named
RETVAL=$?
if [ $RETVAL -ne 0 ]
then
echo "Shutdown failure"
else
echo "Shutdown success"
fi
echo
}
# See how we were called.
case "$1" in
start)
start
;;
stop)
stop
;;
status)
status $named
RETVAL=$?
;;
restart)
stop;
usleep 500000
start
;;
*)
echo $"Usage:$prog {start | stop | restart |status}"
exit 1
esac
exit $RETVAL
2.添加到到开机启动项:chkconfig named add
3.检查开启动项中named启动级别是否on;
[[email protected]]# chkconfig --list
ip6tables0:off1:off2:on3:on4:on5:on6:off
iptables0:off1:off2:on3:on4:on5:on6:off
irqbalance0:off1:off2:off3:on4:on5:on6:off
kdump0:off1:off2:off3:on4:on5:on6:off
lvm2-monitor0:off1:on2:on3:on4:on5:on6:off
mcelogd0:off1:off2:off3:on4:off5:on6:off
mdmonitor0:off1:off2:on3:on4:on5:on6:off
messagebus0:off1:off2:on3:on4:on5:on6:off
named0:off1:off2:on3:on4:on5:on6:off
netconsole0:off1:off2:off3:off4:off5:off6:off
netfs0:off1:off2:off3:on4:on5:on6:off
Bind服务器配置
Bind的主要配置文件是包括named.conf和相应的区域文件,Bind中的给中配置都是通过修改这些文件来完成的,修改后需要重新启动Bind服务是配置生效。
named.conf配置文件
named.conf是Bind的主要配置文件,里面存储了大量的Bind自身的设置信息。Bind安装完后并不会自动创建该配置文件,用户需要通过命令手工生成,新生成的named.conf配置文件的默认内容如下:
key"rndc-key" {
algorithm hmac-md5;
secret"dD7HdNQzJCCbe0SzXhEhKQ==";
};
controls{
inet 127.0.0.1 port 953
allow { 127.0.0.1; } keys {"rndc-key"; };
};
named.conf配置文件是由配置语句和注释组成。每条配置语句以分号“;”做为结束符,多条配置语句组成一个语句块;注释语句使用了两个“//”作为注释符。named.conf配置文件中所支持的所有配置语句如表:
named.conf支持的所有语句:
其中,常用的配置语句介绍如下:
1.acl语句
acl语句用于定义地址匹配列表,其格式如下:
acl acl –name {
address_match_list
};
Bind默认定义了一些匹配列表,如下
1.controls语句
controls语句用于定义rndc工具与Bind服务进程的通信,系统管理员可以通过rndc向Bind进程发出控制命令,并接受由Bind返回的结果。其格式如下:
controls {
[inet (ip_addr | *) [port ip_addr] allow {address_match_list}
Keys{key_list};]
[inet …;]
[unix path perm number owner number groupnumber keys {key_list};]
[unix …;]
};
2.include语句
include语句用于把所指定的文件的内容添加进named.conf配置文件中,该语句的格式如下所示:
include filename;
3.key语句
key语句用于定义TSIG或命令通道所使用的加密密钥。其格式如下
key key_id {
algorithm string;
secret string;
}
4.options语句
options语句用于设置影响整个DNS服务器的全局选项,该语句在named.conf中只能出现一次。如果没有设置语句,那么Bind将使用默认的options值,该语句支持的选项特别多,下面是一些常见的选项格式:
options{
[directorypath_name;]
[forward (only | frist);]
[forwarders {[ip_addr[port ip_port];……] };]
[query-source ((ipv4_addr |*)
[port (ip_port |*)] |
[address (ipv4_addr| *)]
[port (ip_port | *)] ); ]
[query-source –v6( (ip6_addr | *)
[port (ip_port |*)] |
[address (ip6_addr| *)] |
[port (ip_port |*)]);]
[statistics-interval number ;]
};
Directory选项用于定义服务器的工作目录,在配置文件中所指定的所有相对路径都是相对于该路径来定义。该目录也是服务器中大部分输出文件(例如name.run)的存储位置。如果没有设置directory,那么系统默认使用”.”(即Bind启动的目录)作为工作目录。一般会把Bind的工作目录设置为/var/named,如下所示:
directory “/var/named”;
forwarders选项用于指定DNS请求的转发到其他DNS服务器上,该选项默认为空,也就是不进行转发。选项值可以是一个IP地址或主机名,也可以是主机的列表。不同主机IP地址或名称之间使用分号”;”进行分割。如下所示:
forwareders {202.102.128.68; 192.168.152.3;8.8.8.8;8.8.4.4;};
forward选项仅仅在forwareders选项不为空时生效。该选项用于控制DNS服务器的请求转发操作。如果选项值设置为first,则DNS服务器会先把请求发给forwarders选中的指定的远端DNS服务器。如果远端DNS服务器无法响应该请求,则Bind将尝试自行解析该请求;如果选择被设置为only,则bind值转发请求,并不进行处理。
query-source和query-source-v6分别设置DNS服务器所使用的Ipv4或者Ipv6以及端口号。默认的端口号为53,如果指定其他端口号,将无法与其他的DNS服务器通信。。
statistics-interval选项用于指定DNS服务器记录统计信息的时间间隔,单位为分钟。其默认值为60,最大值为28天(即40320分钟)。如果该选项设置为0,则服务器不记录统计信息。
5.server语句
Bind有可能与其他的DNS服务器进行通信,但并非所有的DNS服务器都运行同一个版本的Bind,而且就算安装了相同Bind版本的服务器,它们的设置,软硬件平台都会有所不同。在server语句中可以设置远程服务器的特征信息,以使双方能够正常通信,该语句的格式如下:
server_ip_addr [/prefixlen] {
[bogusyes_or_no;]
[provide-ixfryes_or_no;]
[request-ixfryes_or_no;]
[edns yes_or_no;]
[edns-udp-sizenumber;]
[max-udp-sizenumber;]
[transfersnumber;]
[transfer-format(one-answer | many-answers);]
[keys{string;[string; […]]}; ]
[transfer-source(ipv4_addr| *) [port ip_port];]
[transfer-source-v6(ip6_addr|*) [port ip_port]]
[notify-source(ipv4_addr | *) [port ip_port];]
[notify-source-v6(ip6_addr | *) [port ip_port];]
[query-source[address (ip_addr | *) ] [port ip_port|*];]
[query-srouce-v6[address (ip_addr | *)] [port ip_port | *];]
[use-queryport-toolyes_or-no;]
[queryport-pool-portsnumber;]
[queryport-pool-intervalnumber;]
}
6.view语句
view语句可以使用Bind根据客户端的地址决定需要返回的域名解析结果。也就是说,不同的主机通过同一台DNS服务器对同一个域名进行解析,会得到不同的解析结果。其格式如下:
view view_name
[class] {
match-clients{address_match_list};
match-destinations{address_match_list};
match-recursive-onlyyes_or_no;
[ view_option; …]
[ zone_statement;…]
};
每一条view语句定义了一个客户端集合所能看到的视图,如果客户端匹配视图中的match-clients选项所定义的客户端列表,那么Bind将根据该视图返回解析结果。例如,希望对内网和外网用户进行区分,使他们访问同一个域名时,会得到不同的结果。可以通过view语句定义两个不同的视图,在两个视图中分别定义不同的属性。已达到上述的效果。配置如下:
8.zone语句
zone语句是named.conf文件的核心部分。每一条zone语句定义一个区域,用户可以在这个区域中设置该区域相关的选项。Bind中可以设置多种类型的区域。
不同类型的区域,其zone语句定义的格式也有所不同,下面只介绍最常用的master和hint两种类型的区域的zone语句格式:
加入要定义一个根区域文件,可以如下:
zone“.”{
type master;
file“named.root”;
};
主DNS区域文件是Bind照哦给你最基本的区域类型,它又可以分为正向解析和反向解析两种,。正向解析就是通过查询域名查询对应的IP地址;而反向解析则是通过IP地址查询对应的域名。
例如:test.com
zone“test.com”{
type ;master;
file“test.zone”;
allow-update [none;];
}
Allow-update选项定义了允许对主区域进行动态DNS更新的服务器列表。None表示不运行进行更新。
一般情况下,用户只会进行正向的解析,根据域名来查询对应的IP地址。但是在一起特殊的情况下,也会使用反向解析查询IP地址对应的域名。下面是一个反向解析的例子。
zone“1.168.192.in-addr.arpa” in {
type master;
file “test.local”;
allow-update (none;);
};
1.168.192.in-addr.arpa是该反向解析区域的名称。其中“in-addr.arpa”是反向解析区域名称中固定的后缀格式,.in-addr.arpa左边的部分是由需要解析的IP地址或网段的十进制表示方法逆序字符串。
name.root配置文件
named.roote是一个特殊的区域文件,在该文件中记录了Internet上的根DNS服务器的名称和IP地址。DNS服务器接收到客户端发送来的请求后,如果子本地找不到匹配的DNS记录,则把请求发送到该文中所定义的根DNS服务器上即兴逐级查询。由于internet上的根DNS服务器会随时发生变化,因为named.root文件的内容也是不断更新的,所以用户可以到定期到http://internic.net/domain下载最新版本的named.root文件
可以看到,在该文件中定义了全球13个根DNS服务器,其中第一列为服务器名,第四列为服务器的IP地址
正向解析区域文件
正向解析区域文件用于映射域名和IP地址,文件中包含了该区域的所有参数,包括域名、IP地址、刷新时间、重试时间、超时等。下面是一个正向解析的区域文件的例子
第一行的“$ttl1D”用于设置客户端的DNS缓存数据的有效期。该值默认的单位为妙,用户可以明确指定使用H(小时)、D(天)、或W(星期)作为单位。
第二到九行则用于设置该域的控制信息,可以看到,控制信息包括域名、有效时间、网络地址类型等,其格式如下所示:
name:定义SOA的域名,以“.”结束,也可以使用@代替
ttl:定义有效时间,如果不设置该值,则系统默认使用第一行中定义的ttl值。
class:定义网络的诋毁子类型。对于TCP/IP网络应设置为IN。
orgin:定义这个域的主域名服务器的主机名,以“.”结尾。
contact:定义该DNS服务器的管理员邮件地址,因此@在SOA记录中有特殊的意义,所以用”.”代替,本例中的root.test.com表示[email protected]。
serial:定义区域文件的版本号,它是一个整数值。Bind可以通过它来得知区域文件时什么时间修改的。每次更改区域文件都应该时这个数加一。
refresh:定义从DNS服务器在试图检查主DNS服务器的SOA记录之前应等待的时间。该选项以及括号中除了serial以外的其他选项都是以秒为单位,也可以使用M(分钟)、H(小时)、W(星期)等。如果SOA记录不经常改变,可以把这个值设置的大一些。在本例中为3小时。
retry:定义从DNS服务器在主DNS不能使用时,重试对主DNS服务器发出请求应等待的时间。通常,该时间不应该超过1小时。在本例中设置为15分钟。
expire:定义从DNS服务器在无法与主DNS服务器进行通信的情况下,其区域信息保存的时间。在本例中为一个星期。
minimum:当没有定义TTL时,默认使用的TTL值。如果噢玩过的变化不大,那么可以把该值设置的大一些。在本例中为1天。
在本例中第10行是DNS的资源记录(NS),指定该域中的DNS服务器名称。其格式如下:
[name][ttl]classNSname-server-hostname
本例中指定的DNS服务器为dns.test.com;
反向解析区域
反向解析区域文件用于定义IP地址到域名的解析,它采用的与正向借些文件类似的选项和格式,但由于是反向解析,所以该文件是使用PTR指针记录,而不是主机记录。
例如:
第9~12行定义了用于反向解析的PTR记录,其格式如下所示:
[address][ttl]addr-classPTRdomain-name
配置实例
环境:BBT公司现在要是实现这样的功能:内网用户可以正向解析所有内网的计算机以及外网的服务器,反向解析内网的计算机,允许使用递归查询;外网用户只能正向解析外网服务器,不能借些内外那个计算机。不允许使用递归解析。
其局域网的网段为172.20.1.0/24,其中有5台计算机,分为为server1(172.20.1.1)、server2(172.20.1.2)、server3(172.20.1.3)、server4(172.20.1.4)和server5(172.20.1.5)。在外网中有3台应用服务器:FTP服务器(主机名为ftp,IP地址为61.124.100.1),网站服务器(主机名www,IP地址为61.124.100.2)和邮件服务器(主机名mail,IP地址为61.124.100.3)此外还有一台DNS服务器,其主机名为dns,内网IP地址为172.20.1.11,外网的IP地址为61.124.100.11,具体网络拓扑如下图:
1.配置named.conf
为了区分内网网络用户的解析结果,需要通过视图实现。在本例中定义两个试图internal和external,分别对应内部网络和外部网络的用户。在这两个视图中分别定义不同的区域文件,从而实现内外网用户能得到不同的解析结果。定义bind的加密密钥以及mdc间的控制。
定义Bind的选项,内网用户所对应的视图以及各个解析域,如下所示:
定义外网用户所对应的视图以及相关的解析域,如下所示:
1.配置区域文件
2.测试结果
大功告成,享受成果吧。