在Ubuntu 14.04上用BIND配置一个私有网络DNS服务器

来源:互联网 发布:电脑硬盘加密软件 编辑:程序博客网 时间:2024/06/08 05:35

提供:ZStack云计算

系列教程

本教程为7篇系列中的第6篇:DNS管理简介

前言

服务器管理中很重要的一部分就是设置一个有效的域名系统(DNS),这样可以方便的通过网络名称连接到指定的IP地址和端口。使用有效域名(FQDN)相比IP的好处是,它们简化了服务和应用的网络配置,提升了配置文件的可维护性。在私有网络内设置一个自己的DNS服务可以有效加强服务器群组的可管理性。

本教程将设置使用BIND(BIND9)在Ubuntu 14.04上搭建一个DNS服务器,它可以将内网各主机的IP和主机名映射起来。对于主机数量不小的环境而言,这提供了非常有必要的管理能力。

本文的CentOS版本可以参阅这里。

准备工作

首先,你需要准备如下事项:

  • 几台运行在同一数据中心的服务器,并且启用了私有网络
  • 一台新主机,用来作为主DNS服务器——ns1
  • 可选:可以用另一台主机作为次DNS服务器——ns2
  • 上述所有主机的root权限(参考这个教程设置root权限账号)

如果你对DNS的概念不熟悉,可以参阅这篇文章的前三部分内容。

示范所用命名规范

本教程将使用如下一套命名规范:

  • 两台现有的服务器分别叫做“host1”和“host2”
  • 两台服务器所在数据中心为“nyc3”
  • 两台服务器处于私有网络 10.128.0.0/16 子网
  • 两台服务器都与我们的一个“example.com”服务有关

我们将使用“nyc3.example.com”作为私有子网。因此,“host1”的FQDN将是“host1.nyc3.example.com”。以下是两台主机的信息:

主机功能内网FQDN内网IP地址host1通用主机1host1.nyc3.example.com10.128.100.101host2通用主机2host2.nyc3.example.com10.128.200.102

你的服务器应该会有不同的主机名和内网IP,在本教程进行中只需将相关主机名和IP替换为你自己的即可。子网的命名也不一定要使用数据中心的region名称,如果你在多个数据中心都有服务器,那么这样以每个数据中心来命名各自的内网DNS还是比较方便的。

目标

本教程结束时,我们应该已经配置好一台ns1作为主DNS服务器,以及一台ns2作为备用DNS服务器。

主机功能内网FQDN内网IP地址ns1主DNS服务器ns1.nyc3.example.com10.128.10.11ns2备用DNS服务器ns2.nyc3.example.com10.128.20.12

安装BIND

在ns1和ns2上,更新apt:

sudo apt-get update

安装BIND:

sudo apt-get install bind9 bind9utils bind9-doc

IPv4模式

我们要将BIND设置为IPv4模式。在ns1和ns2上,用编辑器打开bind9参数文件:

sudo vi /etc/default/bind9

OPTIONS条目里添加“-4”:

OPTIONS="-4 -u bind"

保存退出。

配置主DNS服务器

BIND的配置涉及多个文件,这些文件均被include在主配置文件named.conf中。文件名中的“named”即是BIND运行时所用的进程名称。

配置options文件

在ns1上,用编辑器打开named.conf.options文件:

sudo vi /etc/bind/named.conf.options

在原来的options文本块之前,创建一个名为trusted的ACL文本块。我们将在此设置被允许前来寻址的主机列表(即跟ns1处于同一数据中心内的主机)。我们将在列表中加入ns1、ns2、host1和host2:

acl "trusted" {        10.128.10.11;    # ns1 - can be set to localhost        10.128.20.12;    # ns2        10.128.100.101;  # host1        10.128.200.102;  # host2};

然后,进入options文本块,找到directory条目:

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

directory条目下加入如下内容:

options {        directory "/var/cache/bind";        recursion yes;                 # 启用递归寻址        allow-recursion { trusted; };  # 允许“trusted”列表前来递归寻址        listen-on { 10.128.10.11; };   # 此处填写ns1的内网IP地址。仅在内网监听        allow-transfer { none; };      # 默认禁用zone transfer        forwarders {                8.8.8.8;                8.8.4.4;        };...};

保存退出。上述变更完成后,只有指定的“trusted”主机才可到我们的DNS服务器上查询。

接下来是DNS zones的设置。

配置Local文件

在ns1上用编辑器打开named.conf.local文件:

sudo vi /etc/bind/named.conf.local

当前,文件中应该只有几行注释。我们要在文件中定义我们的转发和反向区(zones)。

在文件中添加如下内容:

zone "nyc3.example.com" {    type master;    file "/etc/bind/zones/db.nyc3.example.com"; # 区文件路径    allow-transfer { 10.128.20.12; };         # ns2的内网IP地址};

针对我们的10.128.0.0/16子网添加如下反向区内容(其中的“128.10”是“10.128”的八进制反转):

zone "128.10.in-addr.arpa" {    type master;    file "/etc/bind/zones/db.10.128";  # 10.128.0.0/16 子网    allow-transfer { 10.128.20.12; };  # ns2的内网IP地址};

如果你的服务器不在同一子网(但在同一数据中心),则需要给每一个子网设置一个区以及区文件。当所有区都添加完毕后,保存退出。

接下来需要创建相应的区文件。

创建转发区文件

我们在转发区文件中定义需要转发的DNS查询记录,比如将针对“host1.nyc3.example.com”的请求转发到host1的对应IP地址。

首先创建区文件目录。根据我们的命名规范,该目录将位于/etc/bind/zones

sudo mkdir /etc/bind/zones

我们将基于db.local来创建这个区文件。输入如下命令复制文件:

cd /etc/bind/zonessudo cp ../db.local ./db.nyc3.example.com

用编辑器打开:

sudo vi /etc/bind/zones/db.nyc3.example.com

找到如下部分:

$TTL    604800@       IN      SOA     localhost. root.localhost. (                              2         ; Serial                         604800         ; Refresh                          86400         ; Retry                        2419200         ; Expire                         604800 )       ; Negative Cache TTL;@       IN      NS      localhost.      ; delete this line@       IN      A       127.0.0.1       ; delete this line@       IN      AAAA    ::1             ; delete this line

先是SOA记录的修改。把第一个“localhost”替换成ns1的FQDN,把“root.localhost”替换成“admin.nyc3.example.com”。此外,每次编辑一个新的区文件时,都要把序列值(Serial)+1,这里原来是2,所以我们要改成3。改完了应该是这样的:

@       IN      SOA     ns1.nyc3.example.com. admin.nyc3.example.com. (                              3         ; Serial

现在,把文件末尾的三条记录删除(后面标记了“delete this line”的三行)。

在文件末尾添加域名服务器的记录,注意第二列的“NS”:

; name servers - NS records    IN      NS      ns1.nyc3.example.com.    IN      NS      ns2.nyc3.example.com.

然后为本区内的主机添加A记录,即所有后缀为“.nyc3.example.com”的服务器。本教程将添加ns1、ns2、host1和host2的A记录:

; name servers - A recordsns1.nyc3.example.com.          IN      A       10.128.10.11ns2.nyc3.example.com.          IN      A       10.128.20.12; 10.128.0.0/16 - A recordshost1.nyc3.example.com.        IN      A      10.128.100.101host2.nyc3.example.com.        IN      A      10.128.200.102

保存退出。至此,本文件应该是这个样子的:

$TTL    604800@       IN      SOA     ns1.nyc3.example.com. admin.nyc3.example.com. (                  3       ; Serial             604800     ; Refresh              86400     ; Retry            2419200     ; Expire             604800 )   ; Negative Cache TTL;; name servers - NS records     IN      NS      ns1.nyc3.example.com.     IN      NS      ns2.nyc3.example.com.; name servers - A recordsns1.nyc3.example.com.          IN      A       10.128.10.11ns2.nyc3.example.com.          IN      A       10.128.20.12; 10.128.0.0/16 - A recordshost1.nyc3.example.com.        IN      A      10.128.100.101host2.nyc3.example.com.        IN      A      10.128.200.102

接下来是反向区文件。

创建反向区文件

我们在反向区文件中定义DNS PTR记录,以使DNS服务器在接受IP地址(如“10.128.100.101”)时能够查询到对应的FQDN(如“host1.nyc3.example.com”)。

在ns1上,为named.conf.local文件中指定的每一个反向区创建一个文件。我们将基于db.127区文件创建我们自己的文件。首先将该文件复制到指定位置,并将其命名为我们所使用的文件名:

cd /etc/bind/zonessudo cp ../db.127 ./db.10.128

用编辑器打开该文件:

sudo vi /etc/bind/zones/db.10.128

现在的文件内容应该是这样的:

$TTL    604800@       IN      SOA     localhost. root.localhost. (                              1         ; Serial                         604800         ; Refresh                          86400         ; Retry                        2419200         ; Expire                         604800 )       ; Negative Cache TTL;@       IN      NS      localhost.      ; delete this line1.0.0   IN      PTR     localhost.      ; delete this line

首先还是编辑SOA记录和序列号,如下:

@       IN      SOA     ns1.nyc3.example.com. admin.nyc3.example.com. (                              3         ; Serial

然后删除末尾的两行(标记有“delete this line”)。

然后在文件末尾添加如下内容(注意在第二栏标注NS):

; name servers - NS records      IN      NS      ns1.nyc3.example.com.      IN      NS      ns2.nyc3.example.com.

然后,为该子网下所有的服务器添加PTR记录。本文将添加10.128.0.0/16子网下的四台服务器(IP地址的最后两位,要反过来写):

; PTR Records11.10   IN      PTR     ns1.nyc3.example.com.    ; 10.128.10.1112.20   IN      PTR     ns2.nyc3.example.com.    ; 10.128.20.12101.100 IN      PTR     host1.nyc3.example.com.  ; 10.128.100.101102.200 IN      PTR     host2.nyc3.example.com.  ; 10.128.200.102

保存退出。现在的文件内容应该是这样的:

$TTL    604800@       IN      SOA     nyc3.example.com. admin.nyc3.example.com. (                              3         ; Serial                         604800         ; Refresh                          86400         ; Retry                        2419200         ; Expire                         604800 )       ; Negative Cache TTL; name servers      IN      NS      ns1.nyc3.example.com.      IN      NS      ns2.nyc3.example.com.; PTR Records11.10   IN      PTR     ns1.nyc3.example.com.    ; 10.128.10.1112.20   IN      PTR     ns2.nyc3.example.com.    ; 10.128.20.12101.100 IN      PTR     host1.nyc3.example.com.  ; 10.128.100.101102.200 IN      PTR     host2.nyc3.example.com.  ; 10.128.200.102

检查BIND配置语法

运行如下命令以检查named.conf*文件的语法:

sudo named-checkconf

如果配置文件中没有语法错误,该命令执行完毕后会直接返回到shell提示符而不输出任何错误。如果有错误信息(error),请对照之前的步骤重新检查后再运行named-checkconf,直到没有错误输出为止。

named-checkzone命令可以检查区文件的正确性,使用方式是在第一个参数中写入区名称,第二个参数中写入区文件名称,两个名称都是在named.conf.local当中定义的。

比如,输入如下命令以检查“nyc3.example.com”转发区:

sudo named-checkzone nyc3.example.com db.nyc3.example.com

输入如下命令以检查“128.10.in-addr.arpa”反向区:

* sudo named-checkzone 128.10.in-addr.arpa /etc/bind/zones/db.10.128

如果没有错误,则可以进入下一步骤。

重启BIND

输入如下命令以重启BIND:

sudo service bind9 restart

我们的主DNS服务器现在已经配置完毕,接下来开始配置备用DNS服务器。

配置备用DNS服务器

在大部分情况下,最好是配置一个备用DNS服务器以应对主服务器故障的场景。备用DNS服务器的配置要比主服务器的配置简单多了。

在ns2上,编辑named.conf.options文件:

sudo vi /etc/bind/named.conf.options

在文件开头,添加可信服务器的ACL列表:

acl "trusted" {        10.128.10.11;   # ns1        10.128.20.12;   # ns2 - 可以设置为localhost        10.128.100.101;  # host1        10.128.200.102;  # host2};

directory条目下添加如下内容:

        recursion yes;        allow-recursion { trusted; };        listen-on { 10.128.20.12; };      # ns2 private IP address        allow-transfer { none; };          # disable zone transfers by default        forwarders {                8.8.8.8;                8.8.4.4;        };

保存退出。至此,该文件的内容应该与ns1的named.conf.options文件内容一样,只是把ns1的内网IP换成了ns2的内网IP。

用编辑器打开named.conf.local文件:

sudo vi /etc/bind/named.conf.local

现在定义从属区(slave zones),该区对应着主服务器上的主区(master zones)。从属区文件自己不设置路径,而是设置一个masters目录指向主DNS服务器的内网IP。你在ns1上设置了多少区,在这里就需要都加上:

zone "nyc3.example.com" {    type slave;    file "slaves/db.nyc3.example.com";    masters { 10.128.10.11; };  # ns1 private IP};zone "128.10.in-addr.arpa" {    type slave;    file "slaves/db.10.128";    masters { 10.128.10.11; };  # ns1 private IP};

保存退出。

运行如下命令以检查配置文件的语法:

sudo named-checkconf

验证成功后,重启bind:

sudo service bind9 restart

现在,我们的主从DNS服务器都已经设置好,可以在服务器上把它们用起来了。

配置DNS客户端

所有在可信ACL列表上的服务器都可以使用上面配置好的DNS服务器——ns1和ns2。客户端的配置在不同的操作系统上有所不同,不过大部分Linux发行版都使用/etc/resolv.conf文件进行配置。

Ubuntu客户端

Ubuntu和Debian系统需要编辑一个head文件,该文件在系统启动时被附加到resolv.conf

sudo vi /etc/resolvconf/resolv.conf.d/head

在文件中添加如下内容(域名和IP地址替换成你自己的):

search nyc3.example.com  # 你的内网域名nameserver 10.128.10.11  # ns1内网IPnameserver 10.128.20.12  # ns2内网IP

运行resolvconf以生成resolv.conf文件:

sudo resolvconf -u

Ubuntu和Debian的配置就此完毕。

CentOS客户端

CentOS、红帽和Fedora系统可直接编辑resolv.conf文件:

sudo vi /etc/resolv.conf

在文件头添加如下命令(域名和IP地址替换成你自己的):

search nyc3.example.com  # 内网域名nameserver 10.128.10.11  # ns1内网IPnameserver 10.128.20.12  # ns2内网IP

保存退出。

测试客户端

使用nslookup测试客户端是否能够从域名服务器得到响应。可信列表上的每一台服务器都应该能够通过下述测试。

测试转发查询

首先测试是否能够获取host1.nyc3.example.com的IP地址:

* nslookup host1

这里只需要输入“host1”,因为我们在search选项中输入了子网的域名。该命令的输出结果应该是这样的:

Output:Server:     10.128.10.11Address:    10.128.10.11#53Name:   host1.nyc3.example.comAddress: 10.128.100.101

测试反向查询

现在测试是否能够从host1的IP获取其名称:

nslookup 10.128.100.101

该命令的输出结果应该是这样的:

Output:Server:     10.128.10.11Address:    10.128.10.11#5311.10.128.10.in-addr.arpa   name = host1.nyc3.example.com.

如果测试获得的结果均正确,则说明之前的区文件设置是正确的。如果出现问题,请回到之前步骤检查ns1上的区文件内容(即db.nyc3.example.comdb.10.128)。

至此,DNS服务器的配置已经完成。接下来讲讲区记录的维护。

维护DNS记录

实际使用中,我们需要维护DNS记录以匹配服务器环境的变更。

添加新主机

在数据中心添加新主机时,需要执行如下步骤将其添加到DNS。

主DNS服务器的配置

  • 转发区文件:添加新主机的A记录,“Serial”的值+1
  • 反向区文件:添加新主机的PTR记录,“Serial”的值+1
  • 将新主机的内网IP添加到“trusted” ACL列表(named.conf.options

然后,重启BIND:

sudo service bind9 reload

备用DNS服务器的配置

  • 将新主机的内网IP添加到“trusted” ACL列表(named.conf.options

然后,重启BIND:

sudo service bind9 reload

新主机上的配置

  • 编辑resolv.conf,启用ns1和ns2
  • nslookup命令测试

移除一台主机

移除一台主机,只需要把上述添加的内容逐一删除即可(即,反向操作上述步骤)。

总结

现在,我们的环境中可以通过主机名识别主机,所以我们配置服务的时候不再需要记住一大堆的IP,而配置文件的可读性也提升了。因为所有的映射关系都在主DNS服务器上管理,所以维护起来也更加方便。

DNS服务器的维护工作是非常重要的,因为一旦ns1和ns2都不可用,你的所有服务都会瘫痪。所以,请确保你的环境中至少有一台备用DNS服务器,并且给两台DNS服务器都做好备份工作。

本文来源自DigitalOcean Community。英文原文:How To Configure BIND as a Private Network DNS Server on Ubuntu 14.04 by Mitchell Anicas

翻译:lazycai

0 0
原创粉丝点击