[DNS]ubuntu搭建DNS服务器(bind9)- IPv6

前言

       公司AP系统增加IPv6功能,为测试基于域名-IPv6的放行规则,需要搭建支持IPv6的DNS服务器。

Ubuntu采用bind9配置DNS服务器,并增加IPv6部分内容。本文以bind9作为DNS服务器

参考:

https://blog.csdn.net/colourzjs/article/details/44491479(搭建bind9

https://www.isc.org/downloads/bind/doc/ (bind官方使用文档)

注意:

1、如果目标网站支持V4和v6地址 ,如果用户(访问目标网站的人)是使用的是v4地址则DNS返回V4的地址。如果用户(访问目标网站的人)是使用的是v6地址则DNS返回V6的地址。 

2、如果目标网站仅支持v4地址,这种是比较常见的 

如果用户(访问目标网站的人)是使用的是v4地址则DNS返回V4的地址。如果用户(访问目标网站的人)是使用的是v6地址则DNS返回一个可以进行V6到V4地址转换的网关地址。

1. BIND介绍

BIND (Berkeley Internet Name Domain)是Domain Name System (DNS) 协议的一个实现,提供了DNS主要功能的开放实现,包括

* 域名服务器 (named)

* DNS解析库函数

* DNS服务器运行调试所用的工具

是一款开放源码的DNS服务器软件,由美国加州大学Berkeley分校开发和维护的,按照ISC的调查报告,BIND是世界上使用最多最广泛的域名服务系统。不论你的邮件服务器,WEB服务器或者其他的services如何的安全可靠,DNS的故障会给你带来用户根本无法访问这些服务。

BIND,也是我们常说的named,由于多数网络应用程序使用其功能,所以在很多BIND的弱点及时被发现。主要分为三个版本:

v4:

1998年多数UNIX捆绑的是BIND4,已经被多数厂商抛弃了,除了OpenBSD还在使用。OpenBSD核心人为BIND8过于复杂和不安全,所以继续使用BIND4。这样一来BIND8/9的很多优点都不包括在v4中。

v8:

就是如今使用最多最广的版本,其详细内容可以参阅 BIND 8+ 域名服务器安全增强

v9:

最新版本的BIND,全部重新写过,免费(但是由商业公司资助),也添加了许多新的功能(但是安全上也可能有更多的问题)。BIND9在2000年十月份推出,现在稳定版本是9.3.2。

2. 安装

   目前有两种方式:源码安装和apt-get或者rpm安装。

2.1 源码安装

源码获取地址:http://www.isc.org/products/BIND

解压

tar -xvf bind-9.2.6.tar.gz

包括以下子目录:bin(全部BIND二进制源代码,包括named),contrib(一些工具) ,doc(BIND的文档,包括资源手册),lib(BIND使用的库的源代码),make(makefile文件). 

#./configure 

编译BIND,输入: 

#make all 

安装BIND 

#make install

2.2 apt-get

apt-get install bind9

3、配置文件说明

1、配置文件目录

一般位于/etc/bind/

2、Zone文件和资源记录Resource Record

介绍配置文件前需要明确两个配置中的概念:zone和RR。

BIND的配置文件描述了一个域名服务器的所有属性,这些属性BIND的行为和功能。

zone文件描述了域名服务器中包含的主机,所提供的服务类型等信息,BIND通过将zone文件中的信息加载到内存数据结构中并有效组织起来,然后对外部的DNS请求提供验证和查询请求。需要注意的是,zone文件的格式不是由BIND制定的,而是DNS标准文档制定的(见RFC1035)。通常情况下,一个zone文件描述该DNS服务器服务的一个授权服务器域。例如我有一个DNS服务器可以解析taobao.com的域名和baidu.com的域名,那么我的DNS服务器的配置文件中就可以设置两个zone标签,一个描述taobao.com的域名信息,另一个描述baidu.com的域名信息。

资源记录resource Record记录了一个域(domain)的属性和特性

3、配置文件简介

named.conf:  Bind主配置文件

named.conf.options:全局选项

db.root :根服务器指向文件, 由Internet NIC创建和维护, 无需修改, 但是需要定期更新

db.local:localhost正向区文件,用于将名字localhost转换为本地回送IP地址 (127.0.0.1)

db.127:localhost反向区文件,用于将本地回送IP地址(127.0.0.1)转换为名字localhost

named.conf.options 一些配置选项

named.conf.default-zones 默认的本地规则,包含跟文件、正向区文件、反向区文件等

named.conf.local:一般放置zone

 

主配置文件/etc/named.conf的配置语句:

acl 定义IP地址的访问控制清单 

control 定义ndc使用的控制通道 

include 把其他文件包含到配置文件中 

key 定义授权的安全密钥 

logging 定义日志写什么,写到哪 

opitons 定义全局配置选项和缺省值  

server 定义远程服务器的特征 

trunsted-keys 为服务器定义DNSSEC加密密钥 

zone 定义一个区

4、named.conf文件配置

named.conf是BIND的唯一的主配置文件,当然你也可以自己编写主配置文件,但是需要在BIND主进程named启动的时候用-c选项指定主配置文件的路径。named.conf由一个个子句组成,每个子句都有一个头跟一对大括号组成,大括号里面是该子句中的因子和值(具体见下面的例子)。

下面的代码是named.conf的一个最简配置。其中假设named.conf只负责解析授权域名cobb.com。

其中的key是由rndc-confgen生成的。

key "rndc-key" {

 algorithm hmac-md5;

 secret "eoiWMiCwCYPwNLWxl05rNw==";

 };

  

 controls {

 inet 127.0.0.1 port 953

 allow { 127.0.0.1; }

 keys { "rndc-key"; };

 };

  

 options {

 //域名文件存放的绝对路径

 directory "/usr/local/named/var";

 //如果bind启动,自动在/usr/local/named/var目录生成named.pid文件,打开文件就是named进程的ID

 pid-file "named.pid";

 };

  

 zone "." IN {

 //根域名服务器

 type hint;

 //存放在//usr/local/named/var目录,文件名为named.root

 file "named.root";

 };

  

 //域cobb.com的zone文件

 zone "cobb.com" IN {

 type master; //该域名服务器是主域名服务器,这个选项主要用在主备部署中

 file "cobb.com.zone"; //解析域名cobb.com的zone文件内容,其路径由options中的directory指定

 allow-update { none; }; //定义了允许向主zone文件发送动态更新的匹配列表

  

 };

  

 //反向解析

 zone "1.168.192.in-addr.arpa" in {

 type master;

 //存放反向解析的文件

 file "cobb.com.rev";

 allow-update { none; };

 };

 

上面的代码中,

controls子句定义了服务器的控制通道的一些信息,控制通道是named为外部提供的管理named服务器的接口。通常情况下named都在本机的953端口上监听控制信息;

allow表示允许本机上的rndc控制程序控制named服务器,allow出了指定ip地址外,还可以指定acl中的用户地址;

keys表示rndc控制named时需要携带的密钥,这个密钥由rndc-gen生成,并在named.conf中包含。

接下来的options选项中包含一些全局状态描述,这些描述信息在所有的zone文件和view中可见,但如果zone文件或view中重新定义这些描述信息,则options中的信息被覆盖。上面例子中的directory和pid-file的含义见代码注释。

4、zone文件配置

文件cobb.com.zone由用户自定义,其示例内容如下所示:

$TTL 86400

$ORIGIN cobb.com.

@       IN  SOA ns1 root(

            2013031901      ;serial

            12h     ;refresh

            7200        ;retry

            604800      ;expire

            86400       ;mininum

            )

            NS  ns1.cobb.com.

            NS  ns2.cobb.net.

            MX  10  mail.cobb.com.

ns1     IN  A   192.168.10.1

www     IN  A   192.168.10.10

        IN  A   192.168.10.11

mail        IN  A   192.168.10.20

ljx     IN  A   192.168.10.30

ftp     IN  CNAME   ljx

 

上面的配置表示:

1)该zone有两个域名服务器,一个是ns1.cobb.com,ip地址是192.168.10.1,另一个是ns2.cobb.net(它不在本域内);

2)该zone有一个邮件服务器,域名是mail.cobb.com,IP地址是192.168.10.20;

3)该zone有两个对外服务的万维网服务器,其域名是www.cobb.com,IP地址是192.168.10.10和192.168.10.11;

4)该zone有一个对外服务的ftp服务器,其域名是ftp.cobb.com,IP地址是192.168.10.30;

5)该zone有一个主机,其域名是ljx.cobb.com,IP地址也是192.168.10.30;

 

其中TTL和ORIGIN等标签在BIND中叫做指令。zone文件中的所有指令都以一个$开始,指令主要用来表示zone文件中的一些控制信息。

$TTL指令表示一个资源记录在其他DNS服务器中(这个DNS服务器是请求本BIND的服务器,一般情况下是local dns)的缓存时间,在这个缓存时间内,local dns(暂且先这么认为,好举例)不会再请求BIND,而是直接返回域名对应的IP地址。

$ORIGIN指令表示该zone文件用来描述的域(domain)名称

 

SOA(start of authority)资源记录:它定义了一个域的全局特性,必须是出现在zone文件中的第一个资源记录,而且一个zone文件中必须只有一个SOA资源记录。其中SOA后面的ns1与root分别是域名服务器和管理员邮箱([email protected]),其全写分别是ns1.cobb.com.和root.cobb.com,因为$ORIGIN指明了域名,所以这个地方可以略去。

NS(name server)资源记录:它定义了为本域(domain)(这个例子中是cobb.com)服务的域名服务器。需要注意的是外部域名服务器(例子中的ns2)必须为zone cobb.com包含一个zone文件。

MX(mail exchanger)资源记录:它定义了本域中的邮件服务器。这个资源记录是可选的,因为一个域中不一定有邮件服务器。

A(Address)资源记录:这是个很关键的记录。它定义了zone文件中提到的主机或服务的IPv4地址(IPv6地址叫AAAA记录),而且这些IPv4地址必须是外部可见的。例如万维网服务器www.cobb.com的IPv4地址是192.168.10.10。

CNAME记录:是一个已经定义了IPv4地址的主机的别名记录。通常用来为已经存在的主机分配一个或多个服务。示例中的主机ljx.cobb.com既做主机又提供ftp服务。从上面的分析可以看出,我们也可以不用CNAME,只需要为不同的服务指定相同的IP地址即可。但是实际上两种情况下必须用CNAME记录:1)真是主机或别名主机在不同的域中,我们不知道外部域中的IP地址,所以必须要用CNAME,例如ftp.cobb.comftp.cobb.net的一个别名,但是在域cobb.com中无法知道ftp.cobb.net的IP地址,只能用CNAME记录;2)用户希望访问一个站点时用cobb.com产生www.cobb.com的效果,这时我们需要有如下的CNAME定义:

; 定义一个解析cobb.com的IP地址

                 IN              A              cobb.com

; 为www.cobb.com建立别名cobb.com

www     IN               A              cobb.com.

 

当然,上面介绍的只是一个最小配置,但是已经包含了大部分情况下我们需要配置的选项。更多的配置选项请参见:http://www.zytrax.com/books/dns/ch7/view.html

4、实例(实测可用)

测试域名:smart-clouds.cn

测试ip: 192.168.206.138 主域名服务器 

1、增加zone

在named.conf.local中增加

zone "smart-clouds.cn"{

    type master;

    file "/etc/bind/db.smart-clouds.cn";

    allow-query { any; };

    allow-update { any; };

};

zone "206.168.192.in-addr.arpa"{

    type master;

    file "/etc/bind/db.192.smart-clouds.cn";

};

2、创建db文件

文件名称应该与zone中的file名称相同

 

域名转ip

vi db.smart-clouds.cn

添加一下内容:

**********************************************************************

;ND data file for local loopback interface

;

$TTL 604800

$ORIGIN smart-clouds.cn.

@ IN SOA smart-clouds.cn. root.smart-clouds.cn. (

2006080401 ; Serial

604800 ; Refresh

86400 ; Retry

2419200 ; Expire

604800 ) ; Negative Cache TTL

;

@ IN NS ns1

@ IN A 192.168.206.138

ns1 IN A 192.168.206.138

www IN A 192.168.206.138

 

@ IN NS ns2

@ IN AAAA 3ffe:321f:0000:07c2:0000:0000:0000:0001

ns2 IN AAAA 3ffe:321f:0000:07c2:0000:0000:0000:0001

www IN AAAA 3ffe:321f:0000:07c2:0000:0000:0000:0001

*******************************************************************

上述四行代码为支持ipv6功能的dns

使用命令nslookup -querytype=AAAA smart-clouds.cn 0:0:0:0:0:0:0:1

可以测试是否工作。

 

IP转域名:

vi /etc/bind/db.192.smart-clouds.cn 

添加一下内容

*****************************************************

$TTL 60480

@ IN SOA smart-clouds.cn. root.smart-clouds.cn. (

2006080401 ; Serial

604800 ; Refresh

86400 ; Retry

2419200 ; Expire

604800 ) ; Negative Cache TTL

;

@ IN NS smart-clouds.cn.

138 IN PTR www.smart-clouds.cn.

138 IN PTR ns1.smart-clouds.cn.

****************************************************************

5、启动

重新启动bind9

/etc/init.d/bind9 restart  

查看启动日志文件

tail /var/log/syslog

 

Mar 19 22:43:14 ubuntu named[61378]: managed-keys-zone: loaded serial 3

Mar 19 22:43:14 ubuntu named[61378]: zone 0.in-addr.arpa/IN: loaded serial 1

Mar 19 22:43:14 ubuntu named[61378]: zone 255.in-addr.arpa/IN: loaded serial 1

Mar 19 22:43:14 ubuntu named[61378]: zone 127.in-addr.arpa/IN: loaded serial 1

Mar 19 22:43:14 ubuntu named[61378]: zone localhost/IN: loaded serial 2

Mar 19 22:43:14 ubuntu named[61378]: zone smart-clouds.cn/IN: loaded serial 2006080401

Mar 19 22:43:14 ubuntu named[61378]: all zones loaded

Mar 19 22:43:14 ubuntu named[61378]: running

Mar 19 22:43:14 ubuntu named[61378]: zone smart-clouds.cn/IN: sending notifies (serial 2006080401)

启动异常信息都从该日志中查看

查看bind进程是否启动 

ps -aux|grep named

bind     61378  0.0  0.8 164688 12904 ?        Ssl  22:43   0:00 /usr/sbin/named -u bind

root     61440  0.0  0.0  15940   916 pts/11   S+   22:47   0:00 grep --color=auto named

 

遇到的问题

   1、rndc: connect failed: 127.0.0.1#953: connection

      解决http://blog.csdn.net/lujisheng/article/details/4637204

 

   2、出现文件不能生成

      chown -R bind 某文件夹 如chown -R named /etc/bind/

   修改/etc/resolv.conf文件 该文件用来设置采用dns服务器 修改为nameserver 127.0.0.1即采用本地dns服务

6、设置log

启动日志

在默认情况下,BIND把日志消息写到/var/log/messages

而这些日志消息是非常少的,主要就是启动,关闭的日志记录和一些严重错误的消息,

详细日志

       在named.conf中设置,可以将服务器的运行情况和配置服务器的行为等记录到log文件中

       1、配置log生成位置:

              在named.conf中;说明日志配置信息统一放到named.conf.options;日志生成到哪取决于named.conf.options中的   directory "/var/cache/bind";的设置。如果日志不能生成同前面提到的chown -R bind

       2、配置log生成信息

在配置文件named.conf中使用logging语句来定制自己所需要的日志记录,logging语句的语法为:

logging {

                channel <string>; {

                file <logfile>;;

                        syslog <optional_facility>;;

                null;

                stderr;

                        severity <logseverity>;;

                        print-time <boolean>;;

                        print-severity <boolean>;;

                        print-category <boolean>;;

        };

        category <string>; { <string>;; ... };

};

 

在日志中主要有两个概念:通道(channel)和类别(category)。通道指定了应该向哪里发送日志数据:是发送给syslog,还是写在一个文件里,或是发送给named的标准错误输出,还是发送到位存储桶(bit bucket)。类别则规定了哪些数据需要记录。下面我们主要介绍一下文件通道和类别。

在定义通道的语句中,severity是指定记录消息的级别。在bind中主要有以下几个级别(按照严重性递减的顺序):

critical

error

warning

notice

info

debug [ level ]

dynamic

 

定义了某个级别后,系统会记录包括该级别以及比该级别更严重的级别的所有消息。比如定义级别为error,则会记录critical和error两个级别的信息。一般情况下,我们记录到info级别就可以了。print-time是设定在日志中是否需要写入时间,print-severity是设定在日志中是否需要写入消息级别,print-category是设定在日志中是否需要写入日志类别。

category语句是指定哪一种类别的数据使用哪个或者哪几个已经定义了的通道。在bind9中类别有:

default

        default类别匹配所有未明确指定通道的类别,但是不匹配不属于任何类别的消息。这些不属于任何类别的消息属于下面列出的这些类别。

general

        包括所有未明确分类的BIND消息。

client

        处理客户端请求。

config

        配置文件分析和处理。

database

        同BIND内部数据库相关的消息,用来存储区数据和缓存记录。

dnssec

        处理DNSSEC签名的响应。

lame-servers

        发现错误授权。

network

        网络操作

notify

        异步区变动通知。

queries

        查询日志

resolver

        名字解析,包括对来自解析器的递归查询的处理。

security

        认可/非认可的请求。

update

        动态更新事件。

xfer-in

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

xfer-out

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

 

例如要记录queries消息,就可以如下配置(把以下语句添加到named.conf中就可以了):

      logging {

              channel query_log {

                      file "query.log"        versions 3 size 20m;

                      severity        info;

                      print-time        yes;

                      print-category  yes;

              };

              category queries {

                      query_log;

              };

      };

 

这样服务器会在工作目录(directory语句所指定的目录)下创建query.log这个文件,并把运行过程产生的queries消息写如到query.log文件中, 另外解释一下“file "query.log" versions 3 size 20m;”语句中“version”和“size”的意义:version是指定允许同时存在多少个版本的该文件,比如指定3个版本(version 3),bind9会保存query.log、query.log0、query.log1和query.log2。

Size是指定文件大小的上限,如果只设定了size而没有设定version的话,当文件达到指定的文件大小上限时,服务器停止写入该文件。如果设定了version的话,服务器会进行循环,比如把query.log变成query.log1,query.log1变成query.log2等,然后建立一个新的query.log进行写入。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章