ubuntu搭建本地网DNS服务器


在公司的服务器的内网搭建一个本地的DNS服务器,还是有不少好处的.本文是搭建过程的记录.

系统:ubuntu12.04 LTS server

bind介绍

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

  • 域名服务器 (named)
  • DNS解析库函数
  • DNS服务器运行调试所用的工具

Bind是一款开放源码的DNS服务器软件,由美国加州大学Berkeley分校开发和维护的,按照ISC的调查报告,BIND是世界上使用最多最广泛的域名服务系统。

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

  • v4 : 1998年多数UNIX捆绑的是BIND4,已经被多数厂商抛弃了,除了OpenBSD还在使用。OpenBSD核心人为BIND8过于复杂和不安全,所以继续使用BIND4。这样一来BIND8/9的很多优点都不包括在v4中。
  • v8 : 就是如今使用最多最广的版本,其详细内容可以参阅 BIND 8+ 域名服务器安全增强
  • v9 : 最新版本的BIND,全部重新写过,免费(但是由商业公司资助),也添加了许多新的功能(但是安全上也可能有更多的问题)。BIND9在2000年十月份推出,现在稳定版本是9.3.2

bind9的安装

sudo apt-get install bind9

## 辅助工具及文档,可选安装
sudo apt-get install bind9-host dnsutils bind9-doc

配置

SOA配置项解释

在配置之前,对重要的SOA配置项先做下说明。

Bind的SOA记录:每个Zone仅有一个SOA记录。SOA记录包括Zone的名字,一个技术联系人和各种不同的超时值。

超时值的说明如下:

  • Serial : 数值Serial代表这个Zone的序列号。作用:供Slave DNS判断是否从Master DNS获取新数据。每次Zone文件更新,都需要修改Serial数值。RFC1912 2.2建议的格式为YYYYMMDDnn 其中nn为修订号,采用每次自增1即可
  • Refresh : 数值Refresh设置Slave DNS多长时间与Master Server进行Serial核对。目前Bind的notify参数可设置每次Master DNS更新都会主动通知Slave DNS更新,Refresh参数主要用于notify参数关闭时
  • Retry : 数值Retry设置当Slave DNS试图获取Master DNS Serial时,如果Master DNS未响应,多长时间重新进行检查
  • Expire : 数值Expire将决定Slave DNS在没有Master DNS的情况下权威地提供域名解析服务的时间长短
  • Negative Cache TTL : 在8.2版本之前,由于没有独立的 $TTL 指令,所以通过 SOA 最后一个字段来实现。但由于 BIND 8.2 后出现了 $TTL 指令,该部分功能就不再由 SOA 的最后一个字段来负责,由 $TTL 全权负责,SOA 的最后一个字段专门负责 negative answer ttl(negative caching)。该项用于配置其他服务器对于由DNS服务器返回的no-such-domain(NXDOMAIN)响应的缓存时间。

主服务器的配置

这里还未加上一些权限控制及chroot设置,若想加强安全考虑,可加上这些配置.

这里假设安装dns服务机器的IP地址为 192.168.1.10


/etc/bind/named.conf.options

options {
    directory "/var/cache/bind";

    //当本dns服务器无法解析时,转发解析请求,这里配一些外面常用的dns地址即可
    forwarders {
        114.114.114.114;
        114.114.115.115;
    };

    dnssec-validation auto;
    auth-nxdomain no;    # conform to RFC1035
    listen-on-v6 { any; };
};

/etc/bind/named.conf.local

// 这里以配置 example.com 域名进行举例
zone "example.com" {
    type master;
    file "/etc/bind/db.example.com";
};

// 反向解析配置, IP地址需要倒过来写, 如 192.168.X.X 网段,得写成如下面的 169.192.in-addr.arpa
zone "168.192.in-addr.arpa" {
    type master;
    file "/etc/bind/db.168.192";
};

/etc/bind/db.example.com

$TTL    604800
@   IN  SOA ns1.example.com. root.example.com. (   ; 这里假设将本机的域名定义 ns1
            2014071101      ; Serial  序号,建议每次更新后加1或用当前时间值,只要大于原来的数值即可
            2H              ; Refresh 刷新时间
            4M              ; Retry   失败时再次重试的时间间隔
            7D              ; Expire  缓存时间
            1D )            ; Negative Cache TTL
;
@   IN  NS  ns1.example.com.    ; 最后一定要有个 . 符号

ns1 IN A 192.168.1.10   ;定义ns1的对应关系
h01 IN A 192.168.0.10   ;定义h01的对应关系

/etc/bind/db.168.192

$TTL    604800
@   IN  SOA ns1.example.com. root.example.com. (   ; 这里假设将本机的域名定义 ns1
            2014071101      ; Serial  序号,建议每次更新后加1或用当前时间值,只要大于原来的数值即可
            2H              ; Refresh 刷新时间
            4M              ; Retry   失败时再次重试的时间间隔
            7D              ; Expire  缓存时间
            1D )            ; Negative Cache TTL
;
@   IN  NS  ns1.example.com.

10.1  IN PTR ns1.example.com.  ; 反过来写IP地址,且最后一定要有个 . 符号,这一行表示反向解析 192.168.1.10为ns1.example.com
10.0  IN PTR h01.example.com.

配置项的检查

## 定义了那么多配置项,万一写错了语法可怎么办,有一个命令可进行配置项的检查
named-checkconf
## 运行此命令,如果没有错误则没有任何输出,若有错误会输出错误提示

启动,停止

## 启动
sudo service bind9 start

## 停止
sudo service bind9 stop

## 重启
sudo service bind9 restart

对各机器的hostname的配置

当配好dns服务器后,充分利用dns服务器的优势,对各机器的hostname建议做以下配置。 假设,现有一台机器,已将dns配置指向了搭建好的dns服务器,而在dns服务器上为该机的IP地址所分配的域名为 a01.example.com ,那么该机的hostname可做如下配置:

### 下面命令用于更改hostname,只要不重启就是一直生效的,对所有登录用户都生效。运行该命令时,第一次运行可能报一个无法解析的错误,不用理,再运行一次即好。
sudo hostname a01\.example\.com

### 就算重启之后还是同样生效
sudo echo 'a01.example.com' > /etc/hostname

这样配置之后,一两分钟后就会生效,有一个方便性,就是可直接使用 a01 来代替 a01.example.com 了,即可直接 ping a01 或 ssh a01 ,而无需再去动 /etc/hosts 文件了,相当方便。

增加从服务器

从服务器不是必须的,但增加一台从服务器,可加强容灾能力.从服务器不一定要在同一个网段,但至少要能互相访问.

这里假设主服务器就采用上面配置好的192.168.1.10,而从服务器我们选定机器的IP地址为192.168.1.11,需要做如下主从服务器的配置与更改.

主服务器的/etc/bind/named.conf.local

// 这里以配置 example.com 域名进行举例
zone "example.com" {
    type master;
    file "/etc/bind/db.example.com";
    allow-transfer { 192.168.1.11 };     // 只传输给从服务器,增加安全性
    notify yes;                          // 发出通知
    also-notify { 192.168.1.11 };        // 通知从服务器
};

// 反向解析配置, IP地址需要倒过来写, 如 192.168.X.X 网段,得写成如下面的 169.192.in-addr.arpa
zone "168.192.in-addr.arpa" {
    type master;
    file "/etc/bind/db.168.192";
    allow-transfer { 192.168.1.11 };
    notify yes;
    also-notify { 192.168.1.11 };
};

主服务器的/etc/bind/db.example.com

$TTL    604800
@   IN  SOA ns1.example.com. root.example.com. (   ; 这里假设将本机的域名定义 ns1
            2014071102      ; Serial  序号,建议每次更新后加1或用当前时间值,只要大于原来的数值即可
            12H             ; Refresh 刷新时间
            4M              ; Retry   失败时再次重试的时间间隔
            7D              ; Expire  缓存时间
            1D )            ; Negative Cache TTL
;
@   IN  NS  ns1.example.com.    ; 最后一定要有个 . 符号
@   IN  NS  ns2.example.com.

ns1 IN A 192.168.1.10   ;定义ns1的对应关系
ns2 IN A 192.168.1.11   ;定义ns2的对应关系
h01 IN A 192.168.0.10   ;定义h01的对应关系

主服务器的/etc/bind/db.168.192

$TTL    604800
@   IN  SOA ns1.example.com. root.example.com. (   ; 这里假设将本机的域名定义 ns1
            2014071102      ; Serial  序号,建议每次更新后加1或用当前时间值,只要大于原来的数值即可
            12H             ; Refresh 刷新时间
            4M              ; Retry   失败时再次重试的时间间隔
            7D              ; Expire  缓存时间
            1D )            ; Negative Cache TTL
;
@   IN  NS  ns1.example.com.
@   IN  NS  ns2.example.com.

10.1  IN PTR ns1.example.com.  ; 反过来写IP地址,且最后一定要有个 . 符号,这一行表示反向解析 192.168.1.10为ns1.example.com
11.1  IN PTR ns2.example.com.
10.0  IN PTR h01.example.com.

从服务器的/etc/bind/named.conf.options

options {
    directory "/var/cache/bind";

    //当本dns服务器无法解析时,转发解析请求,这里配一些外面常用的dns地址即可
    forwarders {
        114.114.114.114;
        114.114.115.115;
    };

    dnssec-validation auto;
    auth-nxdomain no;    # conform to RFC1035
    listen-on-v6 { any; };
};

从服务器的named.conf.local

zone "example.com" {
    type slave;                               //设为从服务器
    masters { 192.168.1.10; };                //指向主服务器
    file "/var/cache/bind/db.example.com";    //设置主服务器同步过来的设置文件的本机存放路径,这里建议使用 /var/cache/bind 目录,以避免同步时文件读写权限问题
    allow-transfer { none; };                 //设置从服务器不传输内容给其余服务器了
};

zone "168.192.in-addr.arpa" {
    type slave;
    masters { 192.168.1.10; };
    file "/var/cache/bind/db.168.192";
    allow-transfer { none; };
};

文章分类