DNS,bind配置
对于经常上网的人来说DNS(Domain Name System)应该不是陌生词了我们叫它域名解析服务器,那么什么是域名呢?其实我们经常在浏览器中输入的网址就是域名,因为网络通信是基于IP地址可IP地址不便于记忆,所以DNS就是把你输入网址解析成IP地址再告诉你的电脑然后电脑就会通过这个解析到的IP地址从而正确的访问到我们想要访问的网站.当然这个过程我们用户不会参与的,我们只需要设置正确的DNS服务器IP即可.那DNS又是怎么知道网站对应的IP地址呢?其实这是网站在一个管理DNS的”部门”注册而来的他会
你提供的域名和IP地址,当我们用户用这个网站的时候DNS会”翻”出记录找到对应的IP回应给我们从而实现访问.
DNS服务器都可以在windows和Linux中实现,这里主要介绍一下在Linux中Bind的一些简单实现过程,其中包括:DNS主从服务器,视图,子域的设置
安装bind可以通过yum和rpm的形式来安装,以默认的设置安装好之后我们主要配置的地方在:/etc/named.conf这个是主配置文件,
/var/named/这个是named的工作目录.如果编译安装可以指定位置.
首先来看主配置文件:/etc/named.conf
options {
listen-on port 53 { 192.168.1.103; }; //监听的端口和IP地址,默认是53,IP地址根据主机设定
listen-on-v6 port 53 { ::1; }; //IPv6的监听端口和IP地址,如果不需要可以前面加”//”注释掉
directory “/var/named”; //默认路径
dump-file “/var/named/data/cache_dump.db”; //设置服务器缓存数据文件的路径
statistics-file “/var/named/data/named_stats.txt”; // 设置服务器统计信息文件的路径
memstatistics-file “/var/named/data/named_mem_stats.txt”; //服务器输出的内存使用统计文件的路径名
allow-query { any; }; //针对客户端的设置,如果设置一个IP段则只有这个IP网段内的主机可以访问,any就是可接受任意地址.
recursion yes; //
dnssec-enable yes; //安全相关
dnssec-validation yes;
dnssec-lookaside auto;
/* Path to ISC DLV key */
bindkeys-file “/etc/named.iscdlv.key”;
managed-keys-directory “/var/named/dynamic”;
};
logging {
channel default_debug {
file “data/named.log”; //日志文件存放路径和文件名称
severity dynamic;
};
};
zone “.” IN { // 根的配置信息
type hint;
file “named.ca”; //配置文件因为上面有设置默认路径所以这个文件就在设置的路径下: /var/named/named.ca
};
include “/etc/named.rfc1912.zones”; //区域文件
include “/etc/named.root.key”;
首先设置一个zone 我定义的是ff.com这个字段要添加在主配置文件:/etc/named.conf中,
zone “ff.com” IN { //定义个名为ff.com的区域
type master; //类型为master
file “ff/ff.zone”; //区域文件位置
allow-transfer {192.168.1.108;}; //指定辅助服务器地址
};
把以上字段添加到主配置文件:/etc/named.conf中根的zone下面即可.然后在/var/named/ff下面创建一个区域文件:ff.zone,因为在我定义的ff.com的zone中file”ff/ff.zone”指明了对应区域文件的位置,也可以根据需要自行定义.用touchff.zone 创建,注意更改权限属主和属组为named因为权限文件可能会导致named读取不到我们的文件.可使用chownnamed.named
ff.zone 命令修改.之后我们在里面添加以下内容.
$TTL 1D //定义全局ttl的值为1D 意思为1天 ttl是一条记录的有效时间 IN是关键字 SOA是类型必须给定的
@ IN SOA ff.com. admin.ff.com.(
20150914001 //序号可自定义,如修改过此文件记录需要要加大,从服务器将依据这个数值比较是否更新
15m //更新频率 这里设定每15分钟 可自定义
3m //失败后重新尝试时间 可自定义
3D //失效时间,在失败时间超过这个设定后将不再更新.服务停止.
1D) //记录缓存时间
IN NS ns1.ff.com. //每条NS记录要有一条A记录 当有请求对应的域名时会根据A记录的IP地址返回给请求方
ns1 IN A 172.16.249.66
www IN A 172.16.249.66
以上信息添加好以后我们就可以启动named服务程序让它解析域名了.而且会根据我们的设
定返回对应域名的IP地址.以上的配置是正解的格式,反解也不复杂其定义格式在zone名称
上面要把IP地址反写,例如:
zone “1.168.192.in-addr.arpa” IN { //反解IP地址要反写后面:in-addr.arpa是特定格式不
能变.
type master;
file “ff/ff.in.zone”;
allow-transfer {192.168.1.108;};
};
而在定义的区域文件中格式与正解格式一样,只要把A换成PTR 地址在前而域名在后的样
式例如:
@ IN NS ns1.ff.com.
103 IN PTR ns1.ff.com.
103 IN PTR www.ff.com.
反解就是通过IP地址得到域名的过程,上面提到了配置的不同的地方.就不演示效果了.
我们正常启动服务可以用/etc/init.d/namedstart或者service start named .服务启动正常后看一
下53端口有没有被监听
[root@localhost named]# netstat -tan
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 192.168.1.103:53 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:22 0.0.0.0:*
LISTEN
tcp 0 0 127.0.0.1:631 0.0.0.0:*
LISTEN
tcp 0 0 127.0.0.1:953 0.0.0.0:* LISTEN
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN
tcp 0 0 127.0.0.1:6010 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:38212 0.0.0.0:* LISTEN
53端口已经处于监听状态了,我们用命令检测一下能不能解析地址,这里使用dig命令,格式
为:dig –t a www.ff.com @192.168.1.103 其中-t意思是指明类型a反解的时候使用-x,a是A记
录的意思,@后面是指明要通过哪个DNS地址来解析
[root@localhost named]# dig -t a www.ff.com @192.168.1.103
; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.30.rc1.el6 <<>> -t a www.ff.com @192.168.1.103
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 58300
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 1
;; QUESTION SECTION:
;www.ff.com. IN A
;; ANSWER SECTION:
www.ff.com. 86400 IN A 172.16.249.66
;; AUTHORITY SECTION:
ff.com. 86400 IN NS ns1.ff.com.
;; ADDITIONAL SECTION:
ns1.ff.com. 86400 IN A 172.16.249.66
;; Query time: 1 msec
;; SERVER: 192.168.1.103#53(192.168.1.103)
;; WHEN: Tue Sep 15 05:07:08 2015
;; MSG SIZE rcvd: 78
[root@localhost named]#
看以上结果,DNS已经成功搭建好了,已经返回了ff.com的地址为172.16.249.66这正是我们在区域文件中配置的地址.
然后我们再看从服务器的设置.其中主要设置基本与主服务器一样,只不过只需要在设置类型中写slave即可 区域文件也不用设置,它的区域文件来源于主服务器
zone “ff.com” IN {
type slave; //类型为slave
file “ff/slave.ff.zone”; //定义区域文件位置,不用自己创建文件会从我们定义的主服务器上同步过来.
masters {192.168.1.103;}; //定义主服务器地址
};
因为之前搭建过这里我把ff/slave.ff.com删除后重启服务自动会从主服务器同步过来并且有
内容和主服务器一样的设置:
[root@localhost ff]# rm -rf *
[root@localhost ff]# ls
[root@localhost ff]# service named restart
Stopping named: [ OK ]
Starting named: [ OK ]
[root@localhost ff]# ls
slave.ff.zone
[root@localhost ff]# cat slave.ff.zone
$ORIGIN .
$TTL 86400 ; 1 day
ff.com IN SOA ff.com. admin.ff.com. (
2971044817 ; serial
900 ; refresh (15 minutes)
180 ; retry (3 minutes)
259200 ; expire (3 days)
86400 ; minimum (1 day)
)
NS ns1.ff.com.
$ORIGIN ff.com.
ns1 IN A 172.16.249.66
www IN A 172.16.249.66
这个时候从服务器就可以提供服务了.客户端只要设置了这个服务器的地址在主的不能用的时候从服务器来为我们提供服务.
在实际当中还有一些问题,比如用户A访问的时候我想返回一个距离A相对”近”的IP地址以
”的地址这样在某些情境下能提高用户的提高他的访问速度,而B来了返回一个相对离B”近
体验等,这样就用到了bind里面DNS视图的功能,他可以根据我们的定义来返回指定的记录,这里只做简单实现,在实际环境中要比这个复杂些,而实现这个功能也非常简单,我们只需在我们定义的zone用 view“zone_name”{ match-clients {IP地址;};zone配置.};其中match中的IP地址就是当有客户端请求时其IP地址在定义的matchIP范围内就返回下面相应的zone配置:
view “wan” { //视图名称wan只是一个名字而已
match-clients {192.168.1.108;}; //匹配的IP地址
zone “.” IN {
type hint;
file “named.ca”;
};
zone “ff.com” IN {
type master;
file “ff/ff.zone.wan”;
allow-transfer {192.168.1.108;};
};
};
view “lan” { //视图名称lan
match-clients {192.168.1.103;}; //匹配的IP地址
zone “.” IN {
type hint;
file “named.ca”;
};
zone “ff.com” IN {
type master;
file “ff/ff.zone.lan”;
allow-transfer {192.168.1.108;};
};
};
视图wan中的 ff.zone.wan的配置文件内容:
[root@localhost ff]# cat ff.zone.wan
$TTL 1D
@ IN SOA ff.com. admin.ff.com.(
20150914003
15m
3m
3D
1D)
IN NS ns1.ff.com.
ns1 IN A 100.100.100.1
www IN A 100.100.100.100
视图lan中的ff.zone.lan的配置:有意区分了一下IP地址
[root@localhost ff]# cat ff.zone.lan
$TTL 1D
@ IN SOA ff.com. admin.ff.com.(
20150914003
15m
3m
3D
1D)
IN NS ns1.ff.com.
ns1 IN A 172.16.249.66
www IN A 172.16.249.66
这里为了试验我定义了2个view,一个是wan一个是lan其中的match的IP地址就定义了2个主机的IP以便试验在各区域文件中的设置与正常设置一样我有意把其中的IP地址分开了便于验证效果.
IP地址是192.168.1.103的主机是定义的view中的lan下面是返回结果:
[root@localhost ff]# dig -t a www.ff.com @192.168.1.103
; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.30.rc1.el6 <<>> -t a www.ff.com
@192.168.1.103
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 43343
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 1
;; QUESTION SECTION:
;www.ff.com. IN A
;; ANSWER SECTION:
www.ff.com. 86400 IN A 172.16.249.66
;; AUTHORITY SECTION:
ff.com. 86400 IN NS ns1.ff.com.
;; ADDITIONAL SECTION:
ns1.ff.com. 86400 IN A 172.16.249.66
然后我换了一台主机IP是192.168.1.108来解析:
[root@localhost ~]# dig -t a www.ff.com @192.168.1.103
; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.30.rc1.el6 <<>> -t a www.ff.com
@192.168.1.103
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 37971
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 1
;; QUESTION SECTION:
;www.ff.com. IN A
;; ANSWER SECTION:
www.ff.com. 86400 IN A 100.100.100.100
;; AUTHORITY SECTION:
ff.com. 86400 IN NS ns1.ff.com.
;; ADDITIONAL SECTION:
ns1.ff.com. 86400 IN A 100.100.100.1
以上的结果就是按照我们事先定义的返回了不同的地址.视图实现也很简单.这里提一下实际中我们的IP地址段可能会很多,但写到match里面会不方便我们的阅读,这时我们在配置文件里面定义个acl,格式是acl ACL_NAME{192.168.1.0/24;10.10.10.0/16………};中间用”;”隔开可以添加很多IP网段.然后在我们的match中match-clients {“ACL_NAME”};这样我们就只需要维护ACL里面的IP网段就好.
然后再来说一下子域授权,子域就在主域下面的一个独立管理的域,比如说公司的一个部门要有一个独立且独立管理的域名这样子域授权就非常适用,而在bind里面配置也非常简单,只需要在主服务器记录里面添加一条NS和对应的A记录指向其子域即可。这里举例我们添加一个ops.ff.com的子域,其地址是192.168.1.109。见下面的配置:
[root@localhost ~]# vim /var/named/ff/ff.zone
$TTL 1D
@ IN SOA dns.ff.com. admin.ff.com.(
20150914005
15m
3m
3D
1D)
IN NS dns
dns IN A 192.168.1.103
ops IN NS dns.ops.ff.com.
dns.ops.ff.com. IN A 192.168.1.109
主服务器只需要这样设置就好,子域的服务器也不需要特殊设置,见下面:
[root@localhost ~]# vim /var/named/ff/slave.ff.zone
$TTL 1D
@ IN SOA ops.ff.com. admin.ff.com. (
20150916001
900
180
259200
86400
)
IN NS ops
ops IN A 192.168.1.109
www IN A 192.168.1.109
ops1 IN A 192.168.1.109
如果我们的子域服务器192.168.1.109服务器没有开启是解析不到的。下面我用的主服务器
解析了一下ops域。
[root@localhost ~]# dig -t a www.ops.ff.com @192.168.1.103
; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.30.rc1.el6 <<>> -t a
www.ops.ff.com @192.168.1.103
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 44067
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 1
;; QUESTION SECTION:
;www.ops.ff.com. IN A
;; ANSWER SECTION:
www.ops.ff.com. 86400 IN A 192.168.1.109
;; AUTHORITY SECTION:
ops.ff.com. 86400 IN NS ops.ops.ff.com.
;; ADDITIONAL SECTION:
ops.ops.ff.com. 86400 IN A 192.168.1.109
;; Query time: 2530 msec
;; SERVER: 192.168.1.103#53(192.168.1.103)
;; WHEN: Fri Sep 18 19:20:50 2015
;; MSG SIZE rcvd: 82
[root@localhost ~]#
这样其子域内部就可以根据实际情况而自行管理ops.ff.com下面的域名,比如上面我添加了
一个ops1的域名,访问域名时ops1.ops.ff.com
[root@localhost ~]# dig -t a ops1.ops.ff.com @192.168.1.109
; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.30.rc1.el6 <<>> -t a
ops1.ops.ff.com @192.168.1.109
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 45649
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 1
;; QUESTION SECTION:
;ops1.ops.ff.com. IN A
;; ANSWER SECTION:
ops1.ops.ff.com. 86400 IN A 192.168.1.109
;; AUTHORITY SECTION:
ops.ff.com. 86400 IN NS ops.ops.ff.com.
;; ADDITIONAL SECTION:
ops.ops.ff.com. 86400 IN A 192.168.1.109
;; Query time: 0 msec
;; SERVER: 192.168.1.109#53(192.168.1.109)
;; WHEN: Fri Sep 18 19:22:58 2015
;; MSG SIZE rcvd: 83
以上的示例就简单介绍了一下关于,子域授权,主从服务器。视图的实现,和正反解析过程的配置过程。没有涉及到服务器安全的方面。文章主要目的在于加深自己理解和记忆,理解原理。
有兴趣朋友可以了解更多java