DNS and Bind
--------------- Bind 软件的使用
BIND(Berkeley Internet Name Daemon)是现今互联网上最常使用的DNS服务器软件,使用BIND作为服务器软件的DNS服务器约占所有DNS服务器的九成。BIND现在由互联网系统协会(Internet Systems Consortium)负责开发与维护。
一:BIND的安装:
我们通过yum list all bind*可以看出,Bind有许多可安装的软件包。
bind-libs : 提供bind软件的库文件
bind-utils : 客户端的命令行工具程序
bind : 服务器端包,用于提供DNS服务器
bind-devel :开发包
bind-libbind:库文件的开发包
bind-sdb:将bind的数据放在mysql或者db数据库中的
bind-chroot :很诡异的程序,当安装上这个之后,bind的配置文件将不放在默认的地方。所以在没有搞懂之前一定不要安装chroot!
我们只需要安装bind的服务器端包
yum install bind
bind的配置文件主要有3个:
1. /etc/named.conf
主配置文件:定义区域的,本地DNS服务器主要用于哪些区域的域名解析
2. /etc/rndc.conf 或者 /etc/rndc.key
他是用于做rndc的,远程管理的辅助工具
3. /var/named
bind所需要用到的所有数据文件存放的位置。
通常每一个区域都需要一个配置文件,但是又分有正向和反向的解析。所以我们的配置文件通常有两个,分别完成正向和反向的配置文件。
必须有一个文件来告诉他13台节点的根在哪
这个文件一般叫 named.ca 而这个文件通常叫什么不重要,重要的是在主配置文件中如何定义的。
----------------------------------------
|主配置文件:
| 两段组成
| options { <---------必须要有空格
| 除了左大括号,其他的每一行都要有分号结尾;
| };
|
| zone "a.org" IN {
| 这里面的配置则只对这一个区域生效
| };
|
| Include
| 将其他的文件包含起来作为和主配置文件共同存在的配置文件存在
|
|
二:Bind是如何配置的呢?
1.全局选项段:
|----------------------------
| options {
| directory "/var/named";
| }; 定义了工作目录在哪
|----------------------------
2.定义区域
一个完整的dns服务器,必须有3个区域,第一个区域叫“根”:为了代替互联网完成查询请求,则必须有一个根。
第二个叫localhost
第三个要定义localhost的反向解析
zone "0.0.127.in-addr.arpa" {
ty
}
|----------------------------
|zone "." IN {
| type hint; ## 线索域,根提示
| file "named.ca";
|};
|zone "localhost" IN {
| type master; ## 线索域,根提示
| file "localhost.zone";
|};
|zone "0.0.127.in-addr.arpa" IN {
| type master; ## 线索域,根提示
| file "named.local";
|};
|------------------------------------
3.准备主配置文件:
修改主配置文件的属组:named
chown :named /etc/named.conf
4.准备3个主要的配置文件。/var/named
4.1.named.ca
dig -t NS . <--------注意有个点
i.root-servers.net
d.root-servers.net
f.root-servers.net
a.root-servers.net
l.root-servers.net
h.root-servers.net
b.root-servers.net
c.root-servers.net
e.root-servers.net
g.root-servers.net
j.root-servers.net
m.root-servers.net
k.root-servers.net
将配置文件写入我们的named.ca
dig -t NS . @a.root-servers.net. > /var/named/named.ca
4.2.localhost.zone 区域文件的建立
只能包含两种类型的数据:
宏定义
$TTL 86400 ## 生存周期 86400
解析记录
---------------------------------------------
| 格式:name [ttl] IN RECORD_TYPE value
---------------------------------------------
FQDN A IP
ZONE NS FQND
ZONE MX FQDN
IP PTR FQDN
FQDN CNAME FQDN
ZONE SOA FQDN
FQDN:Full Qualfied Domain Name 完全合格名
比如:www.a.org 86400 IN A 1.1.1.1
反过来解析的话
1.1.1.1 86400 IN PTR www.a.org
-----------------------------
ttl的作用:
任何时候你解析的记录可以被缓存下来,那么缓存多长时间呢?它的定义就在ttl中定义。
当你的数据变化的很频繁的时候,则值可以小点
如果数据长期不变的话,则可以值大点
值越短,你的服务器压力就越大
这个值长一点和短一点的差别非常大,所以这个值一定不能太短
否则你的服务器压力会非常大的。
-----------------------------
当你明白了格式之后,我们开始建立这个文件
对于这个文件,第一条记录只能是类型是SOA的记录类型,对于一个数据文件来讲,SOA通常只能有一个。
最关键的是SOA的文件类型非常的独特
------------------------------------
|$TTL 86400
|localhost. 600 IN SOA localhost. admin.localhost. (
| ↑ 2011081601
| 注意有点 1H
| 10M
| 7D
| 1D)
--------------------------------------
第一个叫序列号,最长不能超过10位
序列号到底有什么用呢?比较两个服务器的序列号可以看出到底主服务器上有没有改变
第二个叫刷新时间,刷新频率,默认单位是秒,H表示小时,M表示分钟,W表示周,D表示天
第三个,重试时间间隔,这个间隔不能大于刷新时间
第四个,过期时间,如果重试了这么长时间依然不能获得的话,则自己放弃为任何人提供信息
第五个,否定答案的ttl值,告诉你别来查了,1天之后再来
SOA必须是第一个,当SOA写完之后,则可以开始写正式的记录了
NS记录
-------------------------------------
IN NS localhost.
这个位置可以不写 ↑
则从上面继承 表示自己就是DNS
localhost. IN A 127.0.0.1
-------------------------------------
任何一个NS记录所对应的主机名称必须要给他一个A的地址
4.3,除了正向的,还要有反向的:named.local
cp 一份
将A记录改为
------------------------------------
1 IN PTR localhost.
-------------------------------------
这里之所以能写1
是以为上面主配置文件已经果断的定义好了。
======================================
这三个文件,属组也应该改为named
chown -R :named localhost.zone named.*
使用service named configtest
或者named-checkconf
来检测主配置文件的语法
named-checkzone 则可以检测区域配置文件的语法错误,只检查语法错误,则不检查逻辑错误,在使用这个命令的时候是要指定文件的
比如: named-checkzone "localhost" /var/named/localhost.zone
反向: named-checkzone "0.0.127.in-addr.arpa" /var/named/named.local
====================================
启用服务:
service named start
查看一下
netstat -tunlp
有很多5353端口
通过本地解析: dig -t A www.baidu.com
===========================================
三.当你申请到一个域名,想自己建立一个DNS服务器如何做呢?
假设你有服务器 ns1.a.org
ns2.a.org ##辅助服务器
www.a.org
ftp.a.org
bbs.a.org ## www的别名服务器
当你需要让自己成为DNS的时候。你需要到a.org里修改名字为自己的。
假设我们是100.1 100.2两台主机,建立主服务器
如何建立主服务器呢?
1. 编辑/etc/named.conf这个文件
加入新的区域(暂时先加入一个正向的)
----------------------------------------
zone "a.org" IN {
type master;
file "a.org.zone";
};
## 配置反向解析
zone "16.172.in-addr.arpa" IN {
type master;
file "172.16.zone";
};
-----------------------------------------
2.建立相关文件
cd /var/named
vim a.org.zone
-------------------------------------------
$TTL 1200
@ IN SOA ns1.a.org. admin.a.org. (
2011081601
1H
10M
7D
1D )
@ IN NS ns1.a.org.
@ IN NS ns2.a.org.
@ IN MX 10 mail.a.org. ### 10 为优先级0-99,数字越小,优先值越高
ns1.a.org. IN A 172.16.100.1
ns2.a.org. IN A 172.16.100.2
mail.a.org. IN A 172.16.100.1
www.a.org. IN A 172.16.100.3
bbs.a.org. IN CNAME www.a.org.
ftp.a.org. IN A 172.16.100.100
---------------------------------------------
建立反向解析的文件
cp a.org.zone 172.16.zong
-------------------------------------------
$TTL 1200
@ IN SOA ns1.a.org. admin.a.org. (
2011081601
1H
10M
7D
1D )
@ IN NS ns1.a.org.
@ IN NS ns2.a.org.
1.100 IN PTR ns1.a.org.
2.100 IN PTR ns2.a.org.
1.100 IN PTR mail.a.org.
3.100 IN PTR www.a.org.
100.100 IN PTR ftp.a.org.
---------------------------------------------
想让他生效,则要修改其属组,
chown :named a.org.zone
开启服务
service named reload
===============================
测试:
进入win 的 cmd
nslookup
server 172.16.100.1
set q=A
www.a.org
set q=NS
a.org
set q=SOA
a.org
--------------------------------------
使用 linux测试:
host -t NS a.org
host -t A bbs.a.org
dig 命令的测试
dig -t A www.a.org
AUTHORITY SECTION 谁帮你解析的
Query time : 在多长时间内完成的查询
flags 解析数据包的标志
qr
a,权威答案
dig -t NS a.org
dig -t CNAME bbs.a.org
dig还可以做完全区域传送的测试
dig -t axfr a.org
将a.org的所有记录全部拿来
完全区域传送是用TCP的53号端口加密传送的。
测试反向解析
dig -x 172.16.100.2
反向解析非常重要,在互联网上配置好正向和反向解析,是作为邮件服务最重要的一点。
=========================================
/etc/rndc.key 这个文件没什么用,我们将其更名
我们自己生成一个
rndc-confgen > /etc/rndc.conf
这就生成了一个主配置文件
发现里面说明:将下面的东西复制到 name.conf并且将井号去掉
复制到name.conf并且去掉井号
我们重启服务器
netstat -tunlp | grep 53
发现多了一个953端口,这个就是远程控制器端口
通过
rndc reload 则重读dns配置文件
rndc stop 则停止dns服务器
rndc flush :清空服务器缓存
rndc status :查看服务器状态
四.如何去测试dns服务器的响应能力?
它可以允许多个用户并发连接进来。
ab命令:对apache服务器进行压力测试的
此时我们用此来做dns服务器的压力测试。
我们需要源码编译bind的工具
/Sources/bind bind-9.7.4
tar xf bind-9.7.4.tar.gz
cd bind-9.7.4
cd contrib ## 别人共享的工具
里面有个queryperf
cd queryperf
./configure
make
cp queryperf /bin
queryperf命令:
-d : 你要查询什么什么记录,你应该指明白查的是A记录,需要单独弄个文件
-s:针对哪个服务器进行测试
自己创建一个文件 test.dns
-----------------------
a.org NS
a.org MX
www.a.org A
ns1.a.org A
ns2.a.org A
a.org SOA
bbs.a.org CNAME
ftp.a.org A
mail.a.org A
172.16.100.1 PTR
172.16.100.2 PTR
172.16.100.3 PTR
172.16.100.100 PTR
.....
..... ## 我们将上面的所有内容粘N次,到12000+行
----------------------------------
queryperf -d test.dns -s 172.16.100.1
=====================================
五.DNS的区域类型
hint 根节点
master 区域节点
slave 从服务器
=====================================
为了简化配置文件,我们可以声明一个函数。
$ORIGIN a.org.
于是下面的所有在A类地址中,都可以去掉a.org.
-------------------------------------------
$TTL 1200
@ IN SOA ns1.a.org. admin.a.org. (
2011081601
1H
10M
7D
1D )
@ IN NS ns1.a.org.
@ IN NS ns2.a.org.
@ IN MX 10 mail.a.org.
ns1 IN A 172.16.100.1
ns2 IN A 172.16.100.2
mail IN A 172.16.100.1
www IN A 172.16.100.3
bbs IN CNAME www.a.org.
ftp IN A 172.16.100.100
=======================================
六.dig的用途:
使用dig可以实现强行要求进行递归查询比如:
dig +recurs -t A www.baidu.com
不使用递归
dig +norecurs -t A www.baidu.com
追踪解析dns的过程
dig +trace -t A www.baidu.com
这个在实现解析过程debug的时候非常有用。
dig命令强大到我们不可想象。
=========================================
七.辅助名称服务器的配置:从服务器。
一般我们会提供两台服务器
让数据同步过来,区域传送:
axfr 完全区域传送
ixfr 增量区域传送
通过比较双方序列号的值,来实现是否发生了改变
当主域名服务器一般采用notify的机制,这个机制保证了在主服务器有新增数据的时候,立刻通知从服务器。
只要是主从服务器的架构,从服务器一般都是复制主服务器的文件的。
只需要修改两个地方:
1.type slave 则是定义这是从服务器
masters,声明主服务器在哪
zone "a.org" IN {
type slave;
file "slaves/a.org.zone";
masters { 172.16.100.1; };
};
route add default gw 172.16.0.1
--------------------
配置的开始:
yum install bind
到主服务器上
ssh-keygen -t rsa
ssh-copy-id -i .ssh/id_rsa.pub root@172.16.100.1
到从服务器上
scp ns1.a.org:/etc/named.conf /etc
scp ns1.a.org:/var/named/named.ca /var/named
scp ns1.a.org:/var/named/named.local /var/named
scp ns1.a.org:/var/named/localhost.zone /var/named
chown :named /etc/named.conf /var/named/{named.ca,named.local,localhost.zone}
进入/etc/named.conf
把a.org和key都删了
然后启动
servers named start
此时我们还不是一个从域名服务器。
修改/etc/named.conf
加入:
zone "a.org" IN {
type slave;
file "slaves/a.org.zone";
masters { 172.16.100.1; } ;
};
查看 /var/log/messages
创建反向解析
加入
zone "16.172.in-addr.arpa" IN {
type slave;
file "slaves/172.16.zone";
masters { 172.16.100.1; } ;
};
检查一下看看是否数据都在:
dig -t A www.a.org
我们到主服务器上
增加一条,信息,然后修改序列号,之后发现从服务器就更新了。
=============================================
八.数据的传送安全机制
一般来讲,作为DNS服务器管理员,一定要确保区域传送只能是你的真正的从服务器来传送。
我们可以限定到底允许哪些人来传送数据
在/etc/named.conf
在区域里增加
allow-transfer { 172.16.100.2; }; 只允许100.2做区域传送。
测试: dig -t axfr a.org @172.16.100.1
则发现,限定的才可以传送。
但是此时,从服务器也是可以被传送的。所以定义从服务器的配置文件不允许任何人传送:
allow-transfer { none; };
==============================================
小知识点:
man named.conf
querylog : 查询日志
用来定义是否开启查询日志的
我们在配置文件中的全局配置中加入
querylog yes;
这样,则会在日志文件中加入测试的日志。
=============================================
九.设置子域名服务器
子域的概念:
申请了一个a.org
此时需要建立子域比如我们建立了 tech.a.org
而里面的子域则都是 www.tech.a.org
mail.tech.a.org
a.org
www.a.org
bbs.a.org
tech.a.org
www.tech.a.org
mail.tech.a.org
则
----------------------------
.
↘ org
↘ a.org
↘ www.a.org
bbs.a.org
tech.a.org
↘ www.tech.a.org
mail.tech.a.org
此时,www.a.org去找www.tech.a.org的话很轻松,
但是 www.tech.a.org去找www.a.org则很困难,需要先找到根
那么如何让我们的子域知道父域呢?
设定转发。
父域授权:(只做正向的授权,反向的非常麻烦。)
glue records : 连接
定义:
tech.a.org. IN NS ns1.tech.a.org.
ns1.tech.a.org. IN A 172.16.100.3
此时,只要有人查询tech.a.org的时候,则会返回ns1.tech.a.org并同时返回 172.16.100.3
一般情况下都是两条记录同时出现了,定义了如何转发。
如果有两台,则需要给从服务器也写一条
tech.a.org. IN NS ns1.tech.a.org.
tech.a.org. IN NS ns2.tech.a.org.
ns1.tech.a.org. IN A 172.16.100.3
配置的开始
在从服务器上,在主配置文件中将以前的a.org的配置给删了。
要想做子域,先在主域上授权
vim /var/named/a.org.zone
写入:
www IN A 172.16.100.4
tech.a.org. IN NS ns1.tech.a.org.
ns1.tech.a.org. IN A 172.16.100.7
测试
dig -t NS tech.a.org
配置子域服务器
在/etc/named.conf
声明:
zone "tech.a.org" IN {
type master;
file "tech.a.org.zone";
}
vim tech.a.org.zone
$TTL 1200
$ORIGIN tech.a.org.
@ IN SOA ns1.tech.a.org. admin.tech.a.org. (
2011081701
3H
30M
15D
3D )
IN NS ns1.tech.a.org.
IN NS ns2.tech.a.org.
IN MX 10 mail.tech.a.org.
ns1 IN A 172.16.100.7
ns2 IN A 172.16.100.8
mail IN A 172.16.100.9
www IN A 172.16.100.1
ftp IN A 172.16.100.2
重启:
service named restart
测试:
dig -t A www.tech.a.org
找个不相干的主机解析:
dig -t A ns1.a.org @172.16.100.1
dig -t A ns1.tech.a.org @172.16.100.1
dig -t A ns1.tech.a.org @172.16.100.7 # 通过子域来解析自己的
dig -t A ns1.a.org @172.16.100.7 #通过子域解析父域,发现无法实现
十:配置转发机制
1.完全转发,只要不是我负责的,我统统转发
2.部分转发,只要是我控制域的,只转发部分
完全:
options {
forward only|first;
forwarders { IP; };
}
# only 如果我解析不了,我就把所有的都转发给上游主机,如果不在线,则一直重试,直到在线, 上游必须递归
# first 先让上游主机给我递归,如果给主机递归主机不响应,则自己直接找根
部分:
zone "a.org" IN {
tpye forward;
forwarders { IP; };
}
配置的开始:(从服务器上)完全转发
options 里添加:
forward first;
forwarders { 172.16.100.1; };
测试: dig -t A www.a.org
二次配置的开始:配置部分转发
zone "a.org" IN {
type forward;
forwarders { 172.16.100.1; };
}
|--------------------------|-
| rndc flush 清除缓存
|--------------------------|
查询的:
dig -t A www.a.org @172.16.100.1
发现ok~
================================
设置递归
recursion yes
allow-recursion { 允许谁递归iP; };
---------------------------------------------------
dig chaos txt version.bind.
可以查看服务器软件的版本号
每一个版本都有很多漏洞,所以不能让人们知道你的版本号。于是,在options里声明:
version "9.8.1-RedHat-WoCa?-9.10.5";
=====================================================
十一.DNS的ACL,访问控制列表的使用。
在name中我们可以使用一个关键字叫 acl 的来定义ACL
允许谁查询我们用:
allow-query 来定义。
编辑 named.conf
在全局上配置
options 加入
allow-query { 172.16.0.0/16; 127.0.0.0/8; };
此时,如果你想继续允许其他的网段的话,则可以继续添加
但是添加太多,就太麻烦所以需要在最上面定义acl
acl myclients {
172.16.0.0/16
127.0.0.0/8
};
options 加入
recursion yes
allow-query { myclients; };
4个ACL ,none any
保存退出,重启服务。
============================================
十一.View
什么是View呢?
DMZ区:非军事化区
internal : 内网 (军事化区)
Internet :外网
三宿主网络。
我们期望把我们的DNS给分开。当来自某一类用户的时候解析成为一个地址,当来自另一类用户的时候解析成另一类地址。并且能够准确的判断来源。
来自不同网络的用户,解析到不同的地方去。
这种解析不同的网络然后解析到不同的地方去的方式则叫做智能DNS
一块网卡有两个地址,一个是172.16网段,一个是192.168.0网段
我们希望来自192.168.0的都解析到192.168.0的地去,而来自172.16的都解析到172.16的地方去。
在主配置文件中定义view .
而在 view里才声明 zone
每一个view需要一个名字,不同view的zone也是可以重复的。
每一个view都有一个关键字。叫
match-clients
根据不同的关键字,它将去不同的view里解析。
只要用了View,所有的Zone都必须在View当中。
配置:在/etc/named.conf
1声明两个acl:
|--------------------------------------------
| acl internal {
| 192.168.0.0/24;
| 127.0.0.0/8;
| };
| acl external {
| 172.16.0.0/16;
| };
|
| options {
| ...
| ...
| };
|
|
| view "INNET" {
| match-clients { internal; };
| recursion yes;
| zone "." IN {
| type hint;
| file "named.ca";
| };
| zone "a.org" IN {
| type master;
| file "a.org.internal";
| };
| };
|
| view "EXNET" {
| match-clients { external; };
| recursion no; ## 删了默认是允许的,允许1000个用户
| zone "." IN {
| type hint;
| file "named.ca";
| };
| zone "a.org" IN {
| type master;
| file "a.org.external";
| };
| };
|-------------------------------------------------
创建并编辑 a.org.internal
cp a.org.internal a.org.external
重启服务
找个其他的机子:
dig -t A www.a.org @192.168.0.186
dig -t A www.a.org @172.16.100.1
大多数可以在options中使用的选项都可以在view中使用。
十二.总结
可以说,DNS和BIND是学习DNS服务器两个最重要的部分,首先你要完全理解DNS的工作原理,然后还要能够学会使用BIND。能够配置好主从服务器,让DNS真正的运作起来,只有这样你才能是一个合格的DNS服务器架构师。本文在写的时候比较仓促,如有漏洞欢迎指出,我会尽快修改,同时也会在近期将此文重新排版,让各位看的时候更加直观。最后抱怨一下CSDN的文章编辑器……太难用了-。-! 好吧,今天就到这里~ 谢谢大家~