Bind9 编译安装

更新时间:2024-03-17 10:48:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

Bind9 编译安装

一、准备 BIND9 源代码 http://www.isc.org/index.pl

将最新的 BIND9 源代码包下载到 /usr/local/src 下。

二、编译安装 BIND9 # cd /usr/local/src # tar xzvf bind-9*.gz # cd bind-9* # ./configure \\ --prefix=/usr/local/bind9 \\ --enable-threads \\ --enable-static \\ --enable-ipv6=no 注:如果需要支持 IPv6 ,则将 --enable-ipv6=no 改为 --enable-ipv6=yes 。# make # make install 三、配置 BIND9 环境 1. 建立 BIND9 需要的目录 (1) 配置文件目录:

# mkdir /usr/local/bind9/etc (2) 域数据文件目录:

# mkdir -p /usr/local/bind9/var/named

1

(3) BIND9 运行时目录:

# mkdir /usr/local/bind9/var/run (4) BIND9 日志目录

# mkdir /usr/local/bind9/var/logs 2. 创建 BIND9 系统文件:

# touch /usr/local/bind9/var/run/named.pid # touch /usr/local/bind9/var/named_dump.db # touch /usr/local/bind9/var/run/named.stats

3. 下载最新的 named.ca 根 DNS 服务器数据文件 # cd /usr/local/bind9/var/named # wget ftp://ftp.rs.internic.net/domain/named.root # mv named.root named.ca

四、创建 BIND9 配置文件

1. 创建包含 root server 和 locahost. 以及 abc.com. 域的默认 named.conf 文件(见附带的 named.conf);

# vi /usr/local/bind9/etc/named.conf

2. 创建 localhost. 域数据文件和反解文件(见附带的 localhost.zone、localhost.rzone); # vi /usr/local/bind9/var/named/localhost.zone # vi /usr/local/bind9/var/named/localhost.rzone

3. 创建 abc.com. 域数据文件和反解文件(见附带的 abc.com.zone、localhost.rzone); # vi /usr/local/bind9/var/named/abc.com.zone # vi /usr/local/bind9/var/named/abc.com.rzone

2

五、配置 RNDC

# /usr/local/bind9/sbin/rndc-confgen > /usr/local/bind9/etc/rndc.conf 打开刚刚创建的 rndc.conf ,查看 # End of rndc.conf 以下部分的注释信息, 按照说明对 named.conf 进行修改。

六、设置 BIND9 运行权限 # useradd named # chown -R named:named /usr/local/bind9/ # chmod 600 /usr/local/bind9/etc/* # chmod 600 /usr/local/bind9/var/* # chmod 600 /usr/local/bind9/logs/*

七、启动并检查 BIND9

# /usr/local/bind9/sbin/named -4 -c /usr/local/bind9/etc/named.conf -n X -u

named (其中 X 为服务器的 CPU 数量) # /usr/local/bind9/sbin/rndc status 停止 BIND9

# /usr/local/bind9/sbin/rndc stop

附加信息(配置文件):

named.conf:

// Generated by Comsen-Nanu

3

options {

directory \ pid-file \ dump-file \ statistics-file \}; // Log logging {

channel error_log {

file \ severity warning; print-time yes; print-severity yes; print-category yes; };

channel query_log {

file \ severity info; print-time yes; print-severity yes; print-category yes; };

category default { error_log; }; category queries { query_log; }; }; // RNDC

key \

algorithm hmac-md5;

4

secret \}; controls {

inet 127.0.0.1 port 953

allow { 127.0.0.1; } keys { \ };

// Cacheing Only Name Server Config zone \ type hint; file \};

// localhost. zone \ type master;

file \ allow-update { none; }; };

zone \ type master;

file \ allow-update { none; }; };

// abc.com. zone \ type master; file \ allow-update { none; }; };

zone \

5

type master;

file \ allow-update { none; }; }; rndc.conf: key \ algorithm hmac-md5;

secret \}; options {

default-key \ default-server 127.0.0.1; default-port 953; };

localhost.zone: $TTL 86400 $ORIGIN localhost.

@ IN SOA localhost. root.localhost. ( 2006083100 ; Serial (YYMMDDSN) 1800 ; Refresh 300 ; Retry 3600 ; Expiry 300 ) ; Minimum @ IN NS localhost. @ IN A 127.0.0.1 localhost.rzone:

6

$TTL 86400

@ IN SOA localhost. root.localhost. ( 2006083100 ; Serial (YYMMDDSN) 30M ; Refresh 5M ; Retry 1H ; Expire 5M ) ; Minimum @ IN NS localhost. 1 IN PTR localhost. abc.com.zone: $TTL 600 $ORIGIN abc.net. @ IN SOA abc.net. webmaster.abc.com. ( 2006083100 ; Serial (YYMMDDSN) 1800 ; Refresh 300 ; Retry 3600 ; Expiry 300 ) ; Minimum @ IN NS ns1.abc.com. @ IN A 10.0.0.97 ns1 IN A 10.0.0.97 www IN A 10.0.0.97 web IN CNAME www mail IN MX 10.0.0.97 abc.com.rzone:

7

$TTL 600

@ IN SOA abc.com. webmaster.abc.com. ( 2006083100 ; Serial (YYMMDDSN) 1800 ; Refresh 300 ; Retry 3600 ; Expire 300 ) ; Minimum @ IN NS ns1.abc.com. 97 IN PTR www.abc.com.

8

bind9详解

ISC的bind一直以来基本上都是DNS的工业标准,不过BIND一直是漏洞不断,直到出了BIND9,isc的开发人员对bind9进行了重写,才相对好了一点.

BIND9的安装就不用多说了,这里使用最新版本9,.2.3,说白了也就是需要named这个可执行文件就可以了,其他的配置文件完全可以自己来写.如果需要进行服务的控制的话,则需要rndc这个文件了.named大约有4M多,strip一下也就1M多点,再裁减裁减完全可以做到400K的,做嵌入式的朋友也不妨考虑考虑这个了.

服务的启动与停止可以完全自己来写一个脚本来控制,启动的话先判断是否已经启动,pidof named,如果已经启动,则提示已经启动,否则执行named –c /etc/named.conf,停止的时候先判断是否已经启动,是的话则killproc named,否的话提示没有启动,具体可在网上查找.

下面重点来说说BIND9的新功能.

Named.conf是bind9的最先读取的一个文件,named支持如下语句: Acl

Controls Include Key Logging Lwres Options Server

Trusted-keys View Zone

其中主要的是acl,controls,include,logging,key,options,view,zone其他的很少用到我们就来详细的对这些进行解释一下.

Acl用来对bind的访问进行限制,是一个全局的设置,前面配置的acl在整个bind中都适用,和路由器里面的access-list有同工之处,语法是 acl acl-name {

address_match_list };

其中的address match list是一个地址列表,如”192.168.0.0/24;”,记住最后一定得有分号,有多个的话中间用分号格开,如192.168.0.0/32;192.168.1.0/24; bind内置了4个acl分别是:

any(不是all) 对应所有的,也就是0.0.0.0/0. none 对应为空.

9

localhost 对应本地机器. localnets 对应本地网络.

Controls主要用于对bind进行控制,如: key \

algorithm hmac-md5;

secret \};

controls {

inet 127.0.0.1 port 953

allow { 127.0.0.1; } keys { \};

设置rndc控制的端口以及端口,keys用来设置控制的密钥,

include是一个非常有用的选项,如果需要写程序来读写bind的配置文件,这个将会用到,因为bind的配置文件很不规则,但是用了include后,就可以变的很规则,就和数据库一样了,功用和c语言里面的include一样。

Options是用于设置bind的一些选项,我们将重点介绍,BING9支持的选项如下:

options {

blackhole { ;; ... }; coresize ;; datasize ;;

deallocate-on-exit ;; // obsolete directory ;; dump-file ;;

fake-iquery ;; // obsolete files ;;

has-old-clients ;; // obsolete heartbeat-interval ;;

host-statistics ;; // not implemented interface-interval ;;

listen-on [ port ; ] { ;; ... }; listen-on-v6 [ port ; ] { ;; ... }; match-mapped-addresses ;;

memstatistics-file ;; // not implemented multiple-cnames ;; // obsolete named-xfer ;; // obsolete pid-file ;; port ;;

random-device ;; recursive-clients ;;

rrset-order { [ class ; ] [ type ; ] [ name

; ] ; ;; ... }; // not implemented serial-queries ;; // obsolete

10

serial-query-rate ;; stacksize ;;

statistics-file ;;

statistics-interval ;; // not yet implemented tcp-clients ;;

tkey-dhkey ; ;; tkey-gssapi-credential ;; tkey-domain ;; transfers-per-ns ;; transfers-in ;; transfers-out ;;

treat-cr-as-space ;; // obsolete use-id-pool ;; // obsolete use-ixfr ;;

version ;;

allow-recursion { ;; ... }; allow-v6-synthesis { ;; ... }; sortlist { ;; ... };

topology { ;; ... }; // not implemented auth-nxdomain ;; // default changed minimal-responses ;; recursion ;; provide-ixfr ;; request-ixfr ;;

fetch-glue ;; // obsolete

rfc2308-type1 ;; // not yet implemented additional-from-auth ;; additional-from-cache ;; query-source ;; query-source-v6 ;; cleaning-interval ;;

min-roots ;; // not implemented lame-ttl ;;

max-ncache-ttl ;; max-cache-ttl ;;

transfer-format ( many-answers | one-answer ); max-cache-size ;;

check-names ; ;; // not implemented cache-file ;;

allow-query { ;; ... }; allow-transfer { ;; ... };

allow-update-forwarding { ;; ... }; allow-notify { ;; ... }; notify ;;

11

notify-source ( ; | * ) [ port ( ; | * ) ]; notify-source-v6 ( ; | * ) [ port ( ; | * ) ]; also-notify [ port ; ] { ( ; | ; ) [ port ; ]; ... }; dialup ;; forward ( first | only );

forwarders [ port ; ] { ( ; | ; ) [ port ; ]; ... };

maintain-ixfr-base ;; // obsolete max-ixfr-log-size ;; // obsolete

transfer-source ( ; | * ) [ port ( ; | * ) ]; transfer-source-v6 ( ; | * ) [ port ( ; | * ) ]; max-transfer-time-in ;; max-transfer-time-out ;; max-transfer-idle-in ;; max-transfer-idle-out ;; max-retry-time ;; min-retry-time ;; max-refresh-time ;; min-refresh-time ;;

sig-validity-interval ;; zone-statistics ;; };

obsolete是已经过时的选项,这里不用考虑, not yet implemented是尚未完成的选项,这里也不用考虑,下面详细介绍这里面的有用选项:(注意前面打”*”的为选项)

*blockhole 定义服务器不对查询进行反应的地址列表,也就是”黑名单”,比如说3721的ip段:218.244.44.0/24,当设置了黑名单后,对于这个段的请求查询,服务器将不会作出反应.

*directory 设置bind的数据文件的存放位置:如 directory “/var/named”. *dump-file 设置当执行rndc dumpdb命令后的导出文件存放绝对路径,如果没有指定的话,缺省文件为named_dump.db,放在directory指定的目录下面. *pid-file 设置bind的进程号pid文件.

*interface-interval 设置bind检查网卡变化的周期.

*forward 值有first和only两项, first则首先转发到\中的服务器,然后自己查询,only则仅转发到 \转发服务器列表\中的服务器,不再自己查询 *forwarders设置转发服务器地址列表,语法同acl中的语法.

*listen-on 设置bind的绑定ip和端口,如listen-on 53 {192.168.0.1;}; *max-cache-size 设置最大缓存的大小,如max-cache-size 5M

*version 设置客户查询DNS版本好的返回信息,如果不想让客户探测到当前的版本好,就用这个好了,如version mydns1.0;

*auth-nxdomain 是否做为权威服务器回答域不存在(Auth-nxdomain)

如果设置为'yes',则允许服务器以权威性(authoritatively)的方式返回NXDOMAIN(该域不存在)的回答,否则就不会作权威性的回答,缺省值为”是”.

12

*notify 在主服务器更新时是否通知辅助服务器(notify) 如果设置为”yes”,则在主服务器区域数据发生变化时,就会向在域的”域名服务器“中列出的服务器和“亦通知”中列出的服务器发送更新通知。这些服务器接受到更新通知后,就会向主服务器发送请求传输的消息,然后区域文件得以更新。

*recursion 是否允许递规查询(recursion)

如果设置为”yes”,则允许服务器采用递归的方式进行查询,也就是当要查询的地址不在服务器的数据库列表中时,服务器将一级一级的查询,直到查到为止。(一般对局域网都打开) 设置为”no”,并不意味着服务器对于请求的递归查询不给予回答,而是对于请求的递归查询,不再向上级服务器请求,也不缓存,如果不对请求的递归查询回答,可以清空缓存,然后设置为“NO”.

*allow-query 允许普通查询的地址列表(allow-query):

设置允许进行普通查询的ip地址列表,在域中的设置将覆盖全局设置,默认情况下是允许所有的地址进行普通查询.

*allow-recursion允许递归查询的地址列表(allow-recursion):

设置允许进行递归查询的ip地址列表,缺省值是允许所有地址进行查询,需要注意的是当设置了不允许递归查询后,如果仍然能够查询部分外部的域名,那是因为dns的缓存在起作用,将缓存清除以后就可以了.

*allow-transfer允许服务器进行区域传输的地址列表(Allow-transfer): (注意的是视区和域中的设置将覆盖全局设置).

*allow-notify 允许更新通知的地址列表(allow-notify)

当服务器作为辅助服务器的时候,设置这个可以对收到的更新通知进行判断,只是接收该列表的更新通知.默认情况下,只是接收来自主服务器的更新通知。对于其他服务器的更新通知,会忽略掉.

*also-notify 更新时亦通知下列地址(also-notify):

设置发送更新通知的时候,不仅是域名服务器中列出的地址,亦通知此地址列表中的地址。

View(视)是bind9中提出的一个新概念,在这里可以理解为”从不同的眼光来看dns”,在这里”view”这个词可真是取的经典呀,具体而已,就是根据不同的源地址,目的地址,解析请求来判断该给客户提供什么样的解析.其语法如下: view ; ; {

match-clients { ;; ... };

match-destinations { ;; ... }; match-recursive-only ;; key ; {

algorithm ;; secret ;; };

13

zone ; ; {

type ( master | slave | stub | hint | forward ); allow-update { ;; ... }; file ;;

ixfr-base ;; // obsolete ixfr-tmp-file ;; // obsolete

masters [ port ; ] { ( ; |

; ) [ port ; ] [ key ; ]; ... };

pubkey ; ; ; ;; // obsolete

update-policy { ( grant | deny ) ; ( name |

subdomain | wildcard | self ) ; ;; ... };

database ;;

check-names ;; // not implemented

allow-query { ;; ... }; allow-transfer { ;; ... };

allow-update-forwarding { ;; ... }; allow-notify { ;; ... }; notify ;;

notify-source ( ; | * ) [ port ( ; | * ) ];

notify-source-v6 ( ; | * ) [ port ( ; | * ) ];

also-notify [ port ; ] { ( ; | ; ) [ port ; ]; ... }; dialup ;; forward ( first | only );

forwarders [ port ; ] { ( ; | ; ) [ port ; ]; ... }; maintain-ixfr-base ;; // obsolete max-ixfr-log-size ;; // obsolete

transfer-source ( ; | * ) [ port ( ; | * ) ];

transfer-source-v6 ( ; | * ) [ port ( ; | * ) ];

max-transfer-time-in ;; max-transfer-time-out ;; max-transfer-idle-in ;; max-transfer-idle-out ;; max-retry-time ;; min-retry-time ;; max-refresh-time ;;

14

min-refresh-time ;;

sig-validity-interval ;; zone-statistics ;; };

server {

bogus ;;

provide-ixfr ;; request-ixfr ;;

support-ixfr ;; // obsolete transfers ;;

transfer-format ( many-answers | one-answer ); keys ;; edns ;; };

trusted-keys { ; ; ; ; ;; ... };

allow-recursion { ;; ... }; allow-v6-synthesis { ;; ... }; sortlist { ;; ... };

topology { ;; ... }; // not implemented auth-nxdomain ;; // default changed minimal-responses ;; recursion ;; provide-ixfr ;; request-ixfr ;;

fetch-glue ;; // obsolete

rfc2308-type1 ;; // not yet implemented additional-from-auth ;; additional-from-cache ;; query-source ;; query-source-v6 ;; cleaning-interval ;;

min-roots ;; // not implemented lame-ttl ;;

max-ncache-ttl ;; max-cache-ttl ;;

transfer-format ( many-answers | one-answer ); max-cache-size ;;

check-names ; ;; // not implemented cache-file ;;

allow-query { ;; ... }; allow-transfer { ;; ... };

allow-update-forwarding { ;; ... }; allow-notify { ;; ... };

15

notify ;;

notify-source ( ; | * ) [ port ( ; | * ) ]; notify-source-v6 ( ; | * ) [ port ( ; | * ) ]; also-notify [ port ; ] { ( ; | ; ) [ port ; ]; ... }; dialup ;; forward ( first | only );

forwarders [ port ; ] { ( ; | ; ) [ port ; ]; ... };

maintain-ixfr-base ;; // obsolete max-ixfr-log-size ;; // obsolete

transfer-source ( ; | * ) [ port ( ; | * ) ]; transfer-source-v6 ( ; | * ) [ port ( ; | * ) ]; max-transfer-time-in ;; max-transfer-time-out ;; max-transfer-idle-in ;; max-transfer-idle-out ;; max-retry-time ;; min-retry-time ;; max-refresh-time ;; min-refresh-time ;;

sig-validity-interval ;; zone-statistics ;; };

其中match-clients,指的是view对应的源地址,match-destinations指的是view对应的目的地址, match-recursive-only指的是view对应是否仅仅是递归请求.

BIND在收到DNS的解析请求后,会首先判断该请求包的源地址和目标地址,然后根据视区里面的“match-clients”和”match-destinations”和” match-recursive-only”,判断是否属于第一个视区,符合的话就用第一个视区来进行解析,否则就判断下一个视区.然后再进行解析.如果所有的视区都不能对应,则DNS将返回Query refused的消息 这样在防火墙的情况下,就有一个很好的解决办法了,比如一个典型的网络结构下,DMZ区全部在防火墙外网口上做的地址映射(DNAT),当DMZ区要访问本地网络的时候,单纯用传统的域名解析的话,是无法达到要求的,因为防火墙无法同时又做SNAT和DNAT,比如DMZ地址192.168.0.14映射到外部地址202.196.160.14,而域名服务器解析WWW.YOURDOMAIN.COM到202.196.160.14,则192.168.0.0/24的网络将无法访问www.yourdomain.com,但是当用了VIEW后,你可以对来自该网络的解析请求将WWW.YOURDOMAIN.COM直接解析到192.168.0.14,这样就可以访问了.

View里面可以包含zone,优先级是zone>;view>;options,zone里面的选项好多和options里面一样,不过它只是对本zone一样,同样view里面的选项也只是对本view有效.

Zone是bind的一个重要选项,不过关于zone网上的文章很多,在这里只是补充几点小技巧:

如何将域名直接解析为www服务器的地址,比如像freshmeat.net那样直接解析freshmeat.net为www.freshmeat.net,这里可以在域的数据文件里面增加一个这样的

16

地址记录:

@ IN A 202.196.160.14

这样的主机记录就可以实现了,202.196.160.14为WWW服务器的ip地址.

常见故障释疑

1在用nslookup查询域的时候出现如下错误

*** Can't find server name for address *.*.*.*: Non-existent domain

这种情况是没有对域名服务器本身做反向地址解析造成的,给域名服务器增加一条反向地址解析就可以了.

2在用nslookup时出现如下错误: DNS request timed out. timeout was 2 seconds. DNS request timed out.

这种情况一般是在DNS进行递归查询的时候,超时造成的,可能是由于网络速度问题,也可能是路由等其他问题,或者对方域名服务器没有响应造成的. 3在用nslookup时出现如下错误:

*** dns.cbchen.com can't find www.ite.com: Non-existent domain 这种情况一般是域中没有该地址记录或没有别名记录. 4 在用nslookup时出现如下错误: ***.server failed

一般是配置问题,请检测配置,或者是辅助域无法从主域中得到数据,再请求辅助域的时候会出现这种故障.

BIND的有用的网站:

http://www.isc.org/products/BIND/ http://www.isc.org/products/BIND/

强烈推荐BIND9解压目录下的/doc/arm管理员手册 其他第三方DNS服务器软件:

MaraDNS,安全的嵌入式DNS. http://www.maradns.org/

Oak DNS 用python写的,和bind的区域文件和cache兼容,地址: http://www.digitallumber.com/oak

PowerDNS 一个仅支持认证的DNS,http://www.powerdns.org/ MYDNS以mysql作为后台的认证DNS,http://mydns.bboy.net/

17

BIND 9 的高级配置

本页目录

BIND 9 的高级配置 ACL

定义 ACL 使用 ACL ACL 使用举例

使用 View 分离内外服务器配置 关于分离内外服务器配置 View 语句 BIND 9 日志

BIND 日志的常用术语 logging 语句的语法

在 chroot jail 环境下运行 BIND 9 停止 bind 服务器的运行 创建 chroot jail 环境 修改 BIND 的默认启动参数 添加 BIND 系统日志路径

重新启动 bind9 和 sysklogdTags: ubuntu, dapper, netappsrv, bind, acl, view, logging, chroot ? sitemap

? dapper ? netappsrv BIND 9 的高级配置 内容提要

定义和使用访问控制列表

使用 View 配置分离的内外服务器 BIND 9 的日志配置

在 chroot jail 环境下运行 BIND 9 ACL

访问控制列表(ACL)就是一个被命名的地址匹配列表。使用访问控制列表可以使配置简单而清晰,一次定义之后可以在多处使用,不会使配置文件因为大量的 IP 地址而变得混乱。

18

定义 ACL

要定义访问控制列表,可以在 BIND 的主配置文件 /etc/bind/named.conf 中使用 acl 语句来实现。acl 语句的语法为:

acl acl_name {

address_match_list; };

BIND 里默认预定义了 4 个名称的地址匹配列表,他们可以直接使用,分别为: any : 所有主机 localhost : 本机

localnets : 本地网络上的所有主机 none : 不匹配任何主机

acl 是 named.conf 中的顶级语句,不能将其嵌入其他的语句。

要使用用户自己定义的访问控制列表,必须在使用之前定义。因为可以在 options 语句里使用访问控制列表,所以定义访问控制列表的 acl 语句应该位于 options 语句之前。

为了便于维护管理员定义的访问控制列表,可以将所有定义 acl 的语句存放在单独的文件 /etc/bind/named.conf.acls 中,然后在主配置文件 /etc/bind/named.conf 中如下语句

include \之前添加如下的配置行

include \

使用 ACL

定义了 ACL 之后,可以在如下的子句中使用

子句 语句 说明

allow-query options,zone 指定哪主机或网络可以查询本服务器或区,默认的是允许所有主机进行查询。

allow-transfer options,zone 指定哪些主机允许和本地服务器进行域传输,默认值是允许和所有主机进行域传输。

allow-recursion options 指定哪些主机可以进行递归查询。如果没有设定,缺省是允许所有主机进行递归查询的。注意禁止一台主机的递归查询,并不能阻止这台主机查询已经存在于服务器缓存中的数据。

allow-update zone 指定哪些主机允许为主域名服务器提交动态 DNS 更新。默认为拒绝任何主机进行更新。

blackhole options 指定不接收来自哪些主机的查询请求和地址解析。默认值是 none 。

上面列出的一些配置子句既可以出现在全局配置 options 语句里,又可以出现在 zone 声明语句里,当在两处同时出现时,zone 声明语句中的配置将会覆盖全局配置 options 语句中的配置。

19

ACL 使用举例 限制查询

假如要限制只有 202.0.0.0/8 和 221.0.0.0/8 查询本地服务器的所有区信息,可以在 options 语句里使用如下的 allow-query 子句

options { ......

allow-query { 202.0.0.0/8; 221.0.0.0/8; }; ...... };

上面的配置没有使用 ACL,若使用 acl,需要以下的配置步骤:

S1 在 /etc/bind/named.conf.acls 中添加如下的 acl 语句,对允许查询的主机列表命名

acl aqlist { 202.0.0.0/8; 221.0.0.0/8; };

S2 在 /etc/bind/named.conf.options 中使用定义的 acl_name 限制允许查询的主机列表

options { ......

allow-query { aqlist; }; ...... };

限制区传输

假如要限制只有 221.3.131.5 和 221.3.131.6 可以从本地服务器传输 “example.com” 的区信息,可以在 zone 语句里使用如下的 allow-transfer 子句 zone \ type master;

file \

allow-transfer { 221.3.131.5; 221.3.131.6; }; };

上面的配置没有使用 ACL,若使用 acl,需要以下的配置步骤:

S1 在 /etc/bind/named.conf.acls 中添加如下的 acl 语句,对允许查询的主机列表命名

acl atlist { 221.3.131.5; 221.3.131.6; };

S2 在 /etc/bind/named.conf.local 中使用定义的 acl_name 限制允许进行域传输的主机列表

20

zone \ type master;

file \ allow-transfer { atlist; }; };

防止欺骗和拒绝服务攻击

为了防止欺骗和拒绝服务攻击,对于 Internet 上的每个 DNS 服务器至少应该有一个假地址的 ACL 和一个本地地址的 ACL。为此,需要执行如下的步骤 S1 在 /etc/bind/named.conf.acls 中添加如下的 acl 语句

// 创建一个名称为 \的 ACL 来阻止经常用于欺骗性攻击的(RFC1918)地址空间

acl bogusnets { 0.0.0.0/8; 1.0.0.0/8; 2.0.0.0/8;

169.254.0.0/16; 192.0.2.0/24; 224.0.0.0/3; 10.0.0.0/8; 172.16.0.0/12; 192.168.0.0/16; };

//创建一个名称为 \的 ACL,并将其配置为实际本网的 IP 地址段。 acl our-nets { //用您的网络地址替换下面的地址列表 x.x.x.x/24; x.x.x.x/21; };

S2 在 /etc/bind/named.conf.options 中使用定义的 acl_name 限制查询和响应 options { ......

allow-query { our-nets; }; allow-recursion { our-nets; }; blackhole { bogusnets; }; ...... };

使用 View 分离内外服务器配置 关于分离内外服务器配置

许多站点希望 DNS 对于内网访问和外网(Internet)访问看起来不一样,这种类型的配置称为“分离 DNS (Split DNS)”。 这种配置可以用于如下的情况:

21

对内网用户公开整个区的所有主机;对 Internet 用户只公开几台主机,如 www 服务器等

对内外用户指定不同的 RR,或对内网用户提供更多的 RR 可以在内网使用 RFC 1918 中定义的私有地址 View 语句

在 BIND 9 中可以使用 view 语句进行配置分离 DNS 。 view 语句的语法为 view view_name {

match-clients { address_match_list }; [ view_option; ...] zone_statement; ... };

其中:

match-clients 子句非常重要,它用于指定谁能看到本 view。

可以在 view 语句中使用一些选项,详细信息请参考 named.conf 的手册页 zone_statement 子句指定在当前 view 中可见的区声明

如果在配置文件中使用了 view 语句,则所有的 zone 语句都必须在 view 中出现。 对同一个 zone 而言,配置内网的 view 应该置于外网的 view 之前。 下面是一个使用 view 语句的例子,它摘自 BIND9 的文档。

view \

match-clients { our-nets; }; // 匹配内网客户的访问

recursion yes; // 对内网客户允许执行递归查询 zone \定义内网客户可见的区声明 type master;

file \ }; };

view \

match-clients { any; }; // 匹配 Internet 客户的访问

recursion no; // 对 Internet 客户不允许执行递归查询

zone \{ // 定义 Internet 客户可见的区声明 type master;

file \ }; };

接下来,需要在 example.com.hosts.internal 中创建内网客户可见的区文件,并在 example.com.hosts.external 中创建 Internet 客户可见的区文件。可以根据您的实际情况编写这两个文件,此处从略。

BIND 9 日志

在默认情况下,BIND9 把日志消息写到 /var/log/messages 文件中,而这些日志消息

22

是非常少的,主要就是启动,关闭的日志记录和一些严重错误的消息;而将调试日志信息写入 BIND 服务器工作目录中的 named.run 文件。

BIND 9 的日志是可以灵活配置的,要详细记录服务器的运行状况,要在配置文件 named.conf 中使用 logging 语句来定制自己所需要的日志记录。 BIND 日志的常用术语

在讲述 logging 语句的语法之前,先要熟悉一些常用术语

术语 含义 channel(通道) 日志输出方式,如:syslog、文本文件、标准错误输出或 /dev/null category(类别) 日志的消息类别,如:查询消息或动态更新消息等 module(模块) 产生消息的来源模块名称 facility(设备) syslog 设备名

severity(严重性) 消息的严重性等级

logging 语句的语法

logging 语句的语法为:

logging {

channel channel_name { // 定义通道

file log_file [versions number | unlimited] [size sizespec]; | syslog optional_facility; | null; | stderr; // 定义输出方式

severity log_severity; // 定义消息严重性 [print-time boolean;] // 是否在消息中添加时间前缀,仅用于 file 日志

[print-severity boolean;] // 是否在消息中添加消息严重性前缀 [print-category boolean;] // 是否在消息中添加消息类别名前缀 };

category category_name { // 定义类别 channel_name; ...... }; };

配置日志时,首先要定义通道,然后将不同的日志类别的数据指派到指定的通道上输出。 BIND 9 的默认配置是:

logging {

// 由于使用了默认通道,所以没有通道定义部分

category \};

channel 语句

channel 语句用于定义通道。

23

指定应该向哪里发送日志数据,需要在以下四种之间则其一: file : 输出到纯文本文件 log_file 指定一个文件名

version 指定允许同时存在多少个版本的该文件,比如指定 3 个版本(version 3),就会保存 query.log、query.log0、query.log1 和query.log2。

size 指定文件大小的上限,如果只设定了size 而没有设定 version,当文件达到指定的文件大小上限时,服务器停止写入该文件。如果设定了version,服务器会进行循环,如把 log_file 变成 log_file.log1,log_file.log1 变成 log_file.log2 等,然后建立一个新的 log_file.log 进行写入。 syslog optional_facility :输出到 syslog,其中 optional_facility 是 syslog 的设备名,通常为以下几个 daemon

local0 到 local7 null :输出到空设备

stderr :输出到标准错误输出,默认为屏幕

severity 语句用于指定消息的严重性等级, log_severity 的取值为(按照严重性递减的顺序): critical error warning notice info

debug [ level ]

dynamic 是一个特殊的值,它匹配服务器当前的调试级别

定义了某个严重性级别后,系统会记录包括该级别以及比该级别更严重的级别的所有消息。比如定义级别为 error,则会记录 critical 和error 两个级别的信息。 对于系统管理员来说,一般记录到 info 级别就可以了。 BIND 9 预制了如下四个默认通道;

channel \

syslog daemon; // 发送给 syslog 的 daemon 设备

severity info; // 只发送此 info 及其更高优先级的信息 };

channel \只有当服务器的 debug 级别非 0 时,才产生输出。 file \写入工作目录下的 named.run 文件 severity dynamic; // 按照服务器当前的debug 级别记录日志 };

channel \

stderr; // 写到stderr

severity info; // 只发送此 info 及其更高优先级的信息 };

24

channel \

null; // 丢弃所有发到此通道的信息 };

category 语句

category 语句是指定哪一种类别的信息使用哪个或者哪几个已经定义了的通道输出。 BIND 9 中可用的类别名(category_name)有:

类别 说明

client 处理客户端请求。 config 配置文件分析和处理。

database 同BIND内部数据库相关的消息,用来存储区数据和缓存记录。 default 匹配所有未明确指定通道的类别。 dnssec 处理 DNSSEC 签名的响应。

general 包括所有未明确分类的 BIND 消息。 lame-servers 发现错误授权,即残缺服务器。 network 网络操作。

notify 区更新通知消息。 queries 查询日志

resolver 名字解析,包括对来自解析器的递归查询信息。 security 批准/非批准的请求。 update 动态更新事件。

xfer-in 从远程名字服务器到本地名字服务器的区传送。 xfer-out 从本地名字服务器到远程名字服务器的区传送。

例如要记录查询消息,可以在 named.conf 中添加如下配置:

logging {

channel query_log {

file \ severity info; print-time yes; print-category yes; };

category queries { query_log; }; };

这样服务器会在工作目录(directory 语句所指定的目录,Ubuntu 为:/var/cache/bind)下创建 query.log 文件,并把运行过程产生的 queries 消息写如到此文件中。

一般地,当 BIND 做了重大修改后,应该配置并监视日志,可能还要提高日志消息级别,一旦稳定后便可以还原配置。因为日志会占用大量的磁盘空间,尤其是查询日志。 在 chroot jail 环境下运行 BIND 9

25

基于安全的考虑,应该在 chroot jail 环境下运行 BIND 9 。下面讲述将 BIND 9 运行在 /chroot/named jail 环境中的配置步骤。

停止 bind 服务器的运行

sudo /etc/init.d/bind9 stop创建 chroot jail 环境 创建 chroot 目录

sudo mkdir -p /chroot/named sudo chmod -R 700 /chroot sudo mkdir /chroot/named/etc sudo mkdir /chroot/named/dev

sudo mkdir -p /chroot/named/var/cache/bind sudo mkdir -p /chroot/named/var/run/bind/run 移动原始的 /etc/bind 目录到 /chroot/named/etc sudo mv /etc/bind /chroot/named/etc

sudo ln -s /chroot/named/etc/bind /etc/bind // 为原位置创建符号链接,以便将来更新

创建设备并修改权限

sudo mknod /chroot/named/dev/null c 1 3 sudo mknod /chroot/named/dev/random c 1 8 sudo chmod 666 /chroot/named/dev/null sudo chmod 666 /chroot/named/dev/random sudo chown -R bind:bind /chroot/named/var/* sudo chown -R bind:bind /chroot/named/etc/bind 修改 BIND 的默认启动参数

使用如下命令修改 /etc/default/bind9 sudo vi /etc/default/bind9将如下的行 OPTIONS=\改为

OPTIONS=\添加 BIND 系统日志路径 使用如下命令修改 /etc/init.d/sysklogd sudo vi /etc/init.d/sysklogd将如下的行 SYSLOGD=\改为

SYSLOGD=\重新启动 bind9 和 sysklogd sudo /etc/init.d/sysklogd restart

sudo /etc/init.d/bind9 start进一步阅读 全面提升BIND DNS服务器安全(上) 全面提升BIND DNS服务器安全(下)

用bind9构架自动根据来源ip动态解析的智能主、辅DNS

26

由于各运营商之间网络连接的瓶颈问题,使得处于某一网络的用户在访问位于其他网络的服务器时,速度慢的令人难以忍受,不得已我们采取了在不同运营商处分别放置服务器的方式来解决,原来已经介绍过,可以通过cache来比较方便的解决不同服务器内容同步问题,这次主要介绍如何通过动态智能DNS,来将用户自动导向速度快的服务器。 以下我们通过一个实例来说明如何实现动态解析域名。例如,我们在教育网和网通分别有一台具有相同内容的服务器,cache1.test.com(202.194.15.22)和cache2.test.com(218.56.57.125)。我们要做的就是使用户通过域名www.sdada.edu.cn访问时,根据用户使用的网络,将用户动态分配到速度快的服务器上。(原来可能使用过www1和www2分别指向的方式,但毕竟不方便。)

我们有两台DNS服务器,主DNS(MASTER):202.194.15.1,辅DNS(SLAVE):202.194.15.2,202.194.15.3。实际上,动态解析的工作是通过bind9的view功能来实现的,这里为了省事,主辅DNS都安装redhat as4,使用其自带的bind9.2.4,我们主要学习如何设置bind view。

辅DNS的数据都来源于主DNS,若我们使用了view功能,那么辅DNS使用常规设置,就只能获取到某一view的内容,不能同步所有的view,所以我们给辅dns设置了两个ip地址,通过在主DNS上设置view的选择功能,以及在辅DNS上设置transfer-source,即使用哪个ip同步功能来实现多个view的同步。

首先明确一下我们要实现的目标,即网通用户访问www.sdada.edu.cn自动导向cache2,其他网络用户访问www.sdada.edu.cn自动导向cache1。要识别是否为网通用户,我们需要有一个网通网络的ip地址列表,这个可以从网上找到。放到acl.conf文件中,并将acl.conf复制到主、辅DNS的/var/named/chroot/var/named目录中(目录视具体情况而定)。 acl.conf

//cnc acl list acl \\\\\\\58.16.0.0/16; 58.17.0.0/17; 58.17.128.0/17; 58.18.0.0/16; 58.19.0.0/16; 58.20.0.0/16; 58.21.0.0/16; 58.22.0.0/15; 58.240.0.0/15; 58.242.0.0/15; 58.244.0.0/15; 58.246.0.0/15; 58.248.0.0/13; 60.0.0.0/13; 60.8.0.0/15; 60.10.0.0/16; 60.11.0.0/16; 60.12.0.0/16; 60.13.0.0/18; 60.13.128.0/17;

27

60.14.0.0/15; 60.16.0.0/13; 60.24.0.0/14; 60.30.0.0/16; 60.31.0.0/16; 60.208.0.0/13; 60.216.0.0/15; 60.218.0.0/15; 60.220.0.0/14; 61.48.0.0/13; 61.133.0.0/17; 61.134.96.0/19; 61.134.128.0/17; 61.135.0.0/16; 61.137.128.0/17; 61.138.0.0/17; 61.138.128.0/18; 61.139.128.0/18; 61.148.0.0/15; 61.156.0.0/16; 61.158.0.0/16; 61.159.0.0/18; 61.161.0.0/18; 61.161.128.0/17; 61.162.0.0/16; 61.163.0.0/16; 61.167.0.0/16; 61.168.0.0/16; 61.176.0.0/16; 61.179.0.0/16; 61.180.128.0/17; 61.181.0.0/16; 61.182.0.0/16; 61.189.0.0/17; 125.32.0.0/16; 125.40.0.0/13; 202.96.0.0/18; 202.96.64.0/21; 202.96.72.0/21; 202.97.128.0/18; 202.97.224.0/21; 202.97.240.0/20; 202.98.0.0/21; 202.98.8.0/21;

28

202.99.64.0/19; 202.99.96.0/21; 202.99.128.0/19; 202.99.160.0/21; 202.99.168.0/21; 202.99.176.0/20; 202.99.208.0/20; 202.99.224.0/21; 202.99.232.0/21; 202.99.240.0/20; 202.102.128.0/21; 202.102.224.0/21; 202.102.232.0/21; 202.106.0.0/16; 202.107.0.0/17; 202.108.0.0/16; 202.110.0.0/17; 202.111.128.0/18; 203.93.8.0/24; 203.93.192.0/18; 210.13.128.0/17; 210.14.160.0/19; 210.14.192.0/19; 210.15.32.0/19; 210.15.96.0/19; 210.15.128.0/18; 210.16.128.0/18; 210.21.0.0/16; 210.51.0.0/16; 210.52.128.0/17; 210.53.0.0/17; 210.53.128.0/17; 210.74.96.0/19; 210.74.128.0/19; 210.82.0.0/15; 211.152.0.0/13; 218.7.0.0/16; 218.8.0.0/14; 218.12.0.0/16; 218.21.128.0/17; 218.24.0.0/14; 218.28.0.0/15; 218.56.0.0/14; 218.60.0.0/15;

29

218.62.0.0/17; 218.67.128.0/17; 218.68.0.0/15; 218.104.0.0/14; 219.154.0.0/15; 219.156.0.0/15; 219.158.0.0/17; 219.158.128.0/17; 219.159.0.0/18; 220.252.0.0/16; 221.0.0.0/15; 221.2.0.0/16; 221.3.0.0/17; 221.3.128.0/17; 221.4.0.0/16; 221.5.0.0/17; 221.5.128.0/17; 221.6.0.0/16; 221.7.0.0/19; 221.7.32.0/19; 221.7.64.0/19; 221.7.96.0/19; 221.7.128.0/17; 221.8.0.0/15; 221.10.0.0/16; 221.11.0.0/17; 221.11.128.0/18; 221.11.192.0/19; 221.12.0.0/17; 221.12.128.0/18; 221.13.0.0/18; 221.13.64.0/19; 221.13.96.0/19; 221.13.128.0/17; 221.14.0.0/15; 221.192.0.0/15; 221.194.0.0/16; 221.195.0.0/16; 221.196.0.0/15; 221.198.0.0/16; 221.199.0.0/19; 221.199.32.0/20; 221.199.128.0/18; 221.199.192.0/20;

30

221.200.0.0/14; 221.204.0.0/15; 221.206.0.0/16; 221.207.0.0/18; 221.207.64.0/18; 221.207.128.0/17; 221.208.0.0/14; 221.212.0.0/16; 221.213.0.0/16; 221.214.0.0/16; 221.215.0.0/16; 221.216.0.0/13; 222.128.0.0/14; 222.132.0.0/14; 222.136.0.0/13; 222.160.0.0/15; 222.162.0.0/16; 222.163.0.0/19; 222.163.32.0/19; 222.163.64.0/18; 222.163.128.0/17; 219.235.56.194; };

然后,我们需要在主DNS的named.conf中设置view,以及添加区域,如下named.conf //

// named.conf for Red Hat caching-nameserver //

options {

directory \\\\\\\设置工作目录 dump-file \\\\\\\

statistics-file \\\\\\\/*

* If there is a firewall between you and nameservers you want * to talk to, you might need to uncomment the query-source * directive below. Previous versions of BIND always asked * questions using port 53, but BIND 8.1 uses an unprivileged * port by default. */

// query-source address * port 53; }; //

31

// a caching only nameserver config //

controls {

inet 127.0.0.1 allow { localhost; } keys { rndckey; }; };

zone \\\\\\\设置查询根服务器 type hint;

file \\\\\\\};

zone \\\\\\\type master;

file \\\\\\\allow-update { none; }; };

zone \\\\\\\type master;

file \\\\\\\allow-update { none; }; };

zone \\\\\\\type master;

file \\\\\\\allow-update { none; }; }; zone

\\\\\\\IN {

type master;

file \\\\\\\allow-update { none; }; };

zone \\\\\\\type master;

file \\\\\\\allow-update { none; }; };

zone \\\\\\\type master;

file \\\\\\\allow-update { none; }; };

include \\\\\\\

include \\\\\\\包含acl.conf view \\\\\\\

32

match-clients { CNC;202.194.15.3; }; //view cnc使用202.194.15.3来传输 zone \\\\\\\type master;

file \\\\\\\allow-transfer { 202.194.15.3; }; }; };

view \\\\\\\使用202.194.15.2来传输 match-clients { any; }; zone \\\\\\\type master;

file \\\\\\\allow-transfer { 202.194.15.2; }; }; };

然后我们分别设置cnc.sdada.edu.cn.hosts和edu.sdada.edu.cn.hosts这两个记录文件。 cnc.sdada.edu.cn.hosts $ttl 38400

sdada.edu.cn. IN SOA dns1.sdada.edu.cn. admin.sdada.edu.cn. ( 1160617933 10800 3600 604800 38400 )

sdada.edu.cn. IN NS dns1.sdada.edu.cn. sdada.edu.cn. IN NS dns2.sdada.edu.cn. @ A 218.56.57.125

@ MX 10 mail.sdada.edu.cn. mail A 192.168.0.11 www A 218.56.57.125 edu.sdada.edu.cn.hosts $ttl 38400

sdada.edu.cn. IN SOA dns1.sdada.edu.cn. admin.sdada.edu.cn. ( 1160561482 10800 3600 604800 38400 )

sdada.edu.cn. IN NS dns1.sdada.edu.cn. sdada.edu.cn. IN NS dns2.sdada.edu.cn. @ A 202.194.15.22

@ MX 10 mail.sdada.edu.cn. mail A 192.168.0.11 www A 202.194.15.22

33

这样,重新启动Bind后,主DNS就生效了,网通用户输入www.sdada.edu.cn会自动访问218.56.57.125,而其他用户会访问202.194.15.22,我们还可以根据需要添加反向解析区域,这里不再作介绍。 然后需要设置辅助DNS,

辅助DNS只需要设置named.conf指定master,无须设置记录文件,它会从master自动同步。

named.conf //

// named.conf for Red Hat caching-nameserver //

options {

directory \\\

dump-file \\\

statistics-file \\\/*

* If there is a firewall between you and nameservers you want * to talk to, you might need to uncomment the query-source * directive below. Previous versions of BIND always asked * questions using port 53, but BIND 8.1 uses an unprivileged * port by default. */

// query-source address * port 53; }; //

// a caching only nameserver config //

controls {

inet 127.0.0.1 allow { localhost; } keys { rndckey; }; };

zone \\\type hint;

file \\\};

zone \\\type master;

file \\\allow-update { none; }; };

zone \\\type master;

file \\\allow-update { none; }; };

zone \\\

34

type master;

file \\\allow-update { none; }; };

zone \\\IN {

type master;

file \\\allow-update { none; }; };

zone \\\type master;

file \\\allow-update { none; }; };

zone \\\type master;

file \\\allow-update { none; }; };

include \\\

include \\\包含acl.conf server 202.194.15.1 { };

view view_cnc { match-clients { cnc; };

zone \\\type slave; masters { 202.194.15.1; };

file \\\

transfer-source 202.194.15.3; //view cnc使用202.194.15.3同步}; };

view view_any { match-clients { any; };

zone \\\type slave; masters {

35

202.194.15.1; };

file \\\

transfer-source 202.194.15.2; //view any使用202.194.15.2同步 }; };

设置完成后重启辅dns的Bind,很快就可以看到辅助dns已经分别同步到不同View的内容了。

我们可以分别在网通网和教育网上使用nslookup - 202.194.15.1和nslookup - 202.194.15.2分别测试两个DNS服务器的工作情况。

36

202.194.15.1; };

file \\\

transfer-source 202.194.15.2; //view any使用202.194.15.2同步 }; };

设置完成后重启辅dns的Bind,很快就可以看到辅助dns已经分别同步到不同View的内容了。

我们可以分别在网通网和教育网上使用nslookup - 202.194.15.1和nslookup - 202.194.15.2分别测试两个DNS服务器的工作情况。

36

本文来源:https://www.bwwdw.com/article/ugh8.html

Top