本篇主要介绍DNS服务器中的子域授权、智能解析和创建日志
子域授权
我们还继续前面的例子。现在,公司规模扩大了,公司的研发部门想实现独立管理,也就是说,现在我有两个个部门需单独管理,分别为研发部门和自身。但不是说哪个部门想单独管理就可以单独管理,需上级授权才可以。这里我们介绍一下子域授权中的正向区域授权。
- 正向区域格式如下:
- SUB_ZONE_NAME IN NS NSSERVER_SUB_ZONE_NAME
- NSSERVER_SUB_ZONE_NAME IN A IP
- 记住这个区域一定是当前区域下的子域才行。举个例子:
- 在.com这个域,我们在该域下建立一个叫langdu.com的域,则可写为:
- langdu.com. IN NS ns1.langdu.com.
- ns1.langdu.com. IN A 172.16.32.100
- 不同部门实现各自管理:
- langdu.com.
- rd.langdu.com.
- 该子域分配的DNS服务器及IP如下:
- rd.langdu.com. IN NS ns1.rd.langdu.com.
- ns1.rd.langdu.com. IN A 172.16.32.101 #分给该部门的IP地址,每一条NS记录后都必须跟一条A记录
现在去修改172.16.32.100主机的区域数据文件:
- vim langdu.com.zone
- $TTL 600
- langdu.com. IN SOA ns1.langdu.com. admin.langdu.com. (
- 2013040102
- 1H
- 5M
- 2D
- 6H )
- IN NS ns1
- IN MX 10 mail
- ns1 IN A 172.16.32.100
- mail IN A 172.16.32.22
- www IN A 172.16.32.20
- www IN A 172.16.32.21
- ftp IN CNAME www
- now IN A 172.16.32.23
- langdu.com. IN A 172.16.32.21
- *.langdu.com. IN A 172.16.32.20
- rd IN NS ns1.rd #添加这两行信息
- rd IN A 172.16.32.101 #与其对应的A记录
- 现在去修改我们子域主机的配置文件和数据文件
- vim rd.langdu.com
- $TTL 600
- rd.langdu.com. IN SOA ns1.rd.langdu.com. admin.rd.langdu.com. (
- 2013040101
- 1H
- 5M
- 2D
- 6H )
- IN NS ns1
- IN MX 10 mail
- ns1 IN A 172.16.32.101
- mail IN A 172.16.32.102
- www IN A 172.16.32.103
- vim /etc/named.conf #添加如下内容
- zone "rd.langdu.com" IN {
- type master;
- file "rd.langdu.com.zone"; #添加区域数据文件
- };
修改完成后检查配置文件和区域文件,无误后重启服务。
我们分别使用如下命令查看下效果:
- dig -t NS rd.langdu.com @172.16.32.100 #通过父域查询rd.langdu.com的NS记录
- dig -t NS rd.langdu.com @172.16.32.101 #通过子域查询自己的NSA记录
- dig -t A www.rd.langdu.com @172.16.32.101 #通过子域查询A记录
不管是从父域还是子域,都可以查询都结果,但子域自己解析时可得到权威答案(在flag选项中显示有aa),父域解析时得到的不是权威答案。
假如我执行了如下的命令,会得到我想要的结果么?
- dig -t A www.langdu.com @172.16.32.101 #通过子域查询父域
从结果可以看出,并不是我们想要的结果。我们知道,子域是不知道父域在什么地方的,但如果我想要通过子域去解析父域该如何实现呢?其实我们只需要在子域中告诉父域在什么地方即可。修改子域的配置文件/etc/named.conf
- vim /etc/named.conf
- options {
- directory "/var/named";
- forward first; ;转发,如果转发的DNS服务器解析不了,在自己解析
- forwarders { 172.16.32.100; }; ;表示转发到哪里
- };
- 重启子域的服务即可生效。
- dig -t A www.langdu.com @172.16.32.101 #通过子域插叙父域
- dig +trace -t A www.baidu.com @172.16.32.101 #通过子域去查询www.baidu.com
上边的设置是有问题的。因为所有通过子域查询的都会交给父域去查询,我们知道我们父域应该是仅负责本地的查询服务的。因此,上边第二个命令是有我们的父域解析出来的。其实我们可以设置凡是通过子域查询父域的,我们就把查询请求发给父域,其他的自己来处理。
我们修改子域的配置文件
- vim /etc/named.conf
- zone "langdu.com" IN { ;添加该区域,并设定相关参数
- type forward; ;设置类型为转发
- forward first;
- forwarders { 172.16.32.100; }; #转发地址为其父域
- };
检查后重启服务。然后当我们在使用上边的命令查询时,就是子域自己负责了。
智能解析
在网络中,有些网页,不管我们是用电信的还是联通的网线,打开同一个网页都非常快。有些机房可实现双线接入,然后通过某些技术在本机房内实现使用同一个服务器解析,这样可以实现。这里我们主要介绍如何通过我们的DNS服务器来实现智能解析。在DNS服务器中是通过视图view来实现智能解析的。其实就是让不同来源的用户,能够取得他们自己的 zone 响应就是了。
我们现在假如172.16.0.0/16和10.0.0.0/8网段属于电信,其他的网段属于联通,我们看如何来实现。
首先定义配置文件:
- vim /etc/named.conf #编辑该文件,修改为如下内容
- acl telenet { ;指定网段,定义名称
- 172.16.0.0/16;
- 10.0.0.0/8;
- };
- options {
- directory "/var/named";
- allow-recursion { innet; };
- };
- view telecom {
- match-clients { telenet; }; ;匹配该选项的,使用如下方式查询
- zone "langdu.com" IN { ;将所有区域写在视图中
- type master;
- file "telecom.langdu.com.zone";
- };
- };
- view unicom {
- match-clients { any; };
- zone "langdu.com" IN {
- type master;
- file "unicom.langdu.com.zone";
- };
- };
- 保存退出。编辑如下两个文件:
- vim /var/named/telecom.langdu.com.zone
- $TTL 600 #宏,表示TTL值为600,全局使用
- @ IN SOA ns1.langdu.com. admin.langdu.com. (
- 2013040101
- 1H
- 5M
- 2D
- 6H )
- IN NS ns1 #域名与第一行相同时可不写,表示直接继承上一行的区域名
- IN MX 10 mail # 同上,mail还可以写成mail.langdu.com.
- ns1 IN A 172.16.32.100
- mail IN A 172.16.32.22
- www IN A 172.16.32.21
- vim /var/named/unicom.langdu.com.zone
- $TTL 600 #宏,表示TTL值为600,全局使用
- @ IN SOA ns1.langdu.com. admin.langdu.com. (
- 2013040101
- 1H
- 5M
- 2D
- 6H )
- IN NS ns1 #域名与第一行相同时可不写,表示直接继承上一行的区域名
- IN MX 10 mail # 同上,mail还可以写成mail.langdu.com.
- ns1 IN A 172.16.32.100
- mail IN A 192.168.2.2
- www IN A 1100.110.110.110
- 下边该怎么做,你懂的!好吧,我再写一遍,请各位务必记牢。
- named-checkconf
- named-checkzone "telecom.langdu.com.zone" /var/named/telecom.langdu.com.zone
- named-checkzone "unicom.langdu.com.zone" /var/named/unicom.langdu.com.zone
- dig -t A www.langdu.com @172.16.32.100 #可以看到得到的结果是我们172.16.32.21
- 假如我有个langdu.net的区域不想区分来自哪个网段该如何实现呢?修改配置文件
- vim /etc/named.conf
- acl innet {
- 172.16.0.0/16;
- 10.0.0.0/8;
- };
- options {
- directory "/var/named";
- allow-recursion { innet; }; #上边定义的acl名称
- };
- view telecom {
- match-clients { innet; };
- zone "langdu.com" IN {
- type master;
- file "telecom.langdu.com.zone";
- };
- zone "langdu.net" IN { #添加该区域
- type master;
- file "langdu.net.zone";
- };
- };
- view unicom {
- match-clients { any; };
- zone "langdu.com" IN {
- type master;
- file "unicom.langdu.com.zone";
- };
- zone "langdu.net" IN { #添加该区域因我们不区分来自哪个运营商,两个均添加该区域
- type master;
- file "langdu.net.zone";
- };
- };
- 编辑区域数据文件
- vim langdu.net.zone #添加如下内容
- $TTL 86400
- @ IN SOA ns1.a.net. admin.a.net. (
- 2013040201
- 1H
- 5M
- 2D
- 1D )
- IN NS ns1
- IN MX 10 mail
- ns1 IN A 172.16.32.100
- www IN A 120.0.0.3
- mail IN A 134.120.1.1
- 修改完毕,该怎么做,你懂的!
- dig -t A www.langdu.net @172.16.32.100
这里给大家介绍一个智能解析网站www.dns.la
BIND的日志系统
BIND有一个非常灵活和可配置的日志记录系统。
- 下面举一个具体定义日志的例子,一块分析下:
- logging {
- channel my_log { #定义通道名称
- file "log.msgs" versions 3 size 10k; #定义存放文件名,保留3个版本,大小为10K
- severity dynamic; #定义日志的级别
- };
- channel my_syslog {
- syslog local0; #定义syslog的日志,这是另一种记录日志的方式,该日志通常记录在/var/log目录下
- severity info; #日志级别
- };
- category xfer-in { my_log; }; #作为从服务器,接受主服务器发来的增量区域传送数据
- category update { my_syslog; }; #更新信息
- };
BIND的日志系统
BIND有一个非常灵活和可配置的日志记录系统。
- 下面举一个具体定义日志的例子,一块分析下:
- logging {
- channel my_log { #定义通道名称
- file "log.msgs" versions 3 size 10k; #定义存放文件名,保留3个版本,大小为10K
- severity dynamic; #定义日志的级别
- };
- channel my_syslog {
- syslog local0; #定义syslog的日志,这是另一种记录日志的方式,该日志通常记录在/var/log目录下
- severity info; #日志级别
- };
- category xfer-in { my_log; }; #作为从服务器,接受主服务器发来的增量区域传送数据
- category update { my_syslog; }; #更新信息
- };
- 日志级别:
- critical #紧急信息
- error #错误信息
- warning #警告信息
- notice #提示信息
- info #一般信息,默认为该级别
- debug [level] #调试信息,其中又可分多种级别
- dynamic #动态信息
- category的类别,包含15种,我们只介绍几种常用的:
- default #为category定义默认channel
- general #捕获所有非机密信息
- client #客户端请求的问题
- config #配置文件的问题
- network #与网络运营相关
- notify #通知,提示
- queries #查询处理
- security #接受或拒绝请求
- update #动态更新
- xfer-in #通过服务器传送的增量数据
- xfer-out #通过服务器传出的增量数据
下面看下如何在我们本地主机上添加日志系统
在我们自己的系统上添加记录日志。
- vim /etc/named.conf #编辑该文件,添加如下内容
- logging {
- channel querylog {
- file "/var/log/named/bind_query.log" versions 5 size 10M; #保存文件,保留5个版本,大小为10M
- severity dynamic; #日志记录级别
- print-time yes; #是否记录时间
- print-severity yes; #是否记录级别
- };
- category queries { querylog; }; #查询处理
- };
- 上面文件中提到的目录必须存在,且须为named属主,named组。
- mkdir /var/log/named #创建该目录
- chown named:named /var/log/named #修改该目录为named属主named属组
- named-checkconf
- service named restart
- dig -t A www.langdu.com @172.16.32.100
- ls /var/log/named #查看该目录下是否有我们日志生成的文件
- bind_query.log #日志文件存在
- tail named/bind_query.log #查看日志,显示如下信息
- 06-Apr-2013 19:37:54.510 info: client 172.16.32.100#56946: query: www.langdu.com IN A + (172.16.32.100)
- 06-Apr-2013 19:39:24.040 info: client 172.16.32.100#52592: query: www.langdu.com IN A + (172.16.32.100)
可以看到我们的日志系统添加成功。下面给大家添加个附件,里边有具体介绍日志的信息,大家可参考该ppt在本机上为DNS添加日志。附件:DNS服务器中的日志系统介绍.ppt
其实我们还可以对我们的DNS服务器进行压力测试,可用queryperf命令实现压力测试。
queryperf:对DNS服务器做压力测试,需要先安装libpcap-devel软件包
这里不再介绍,有兴趣的可上网查找相关资料。