在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”。以下是两台主机的信息:
你的服务器应该会有不同的主机名和内网IP,在本教程进行中只需将相关主机名和IP替换为你自己的即可。子网的命名也不一定要使用数据中心的region名称,如果你在多个数据中心都有服务器,那么这样以每个数据中心来命名各自的内网DNS还是比较方便的。
目标
本教程结束时,我们应该已经配置好一台ns1作为主DNS服务器,以及一台ns2作为备用DNS服务器。
安装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.com
和db.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
- 在Ubuntu 14.04上用BIND配置一个私有网络DNS服务器
- 在Ubuntu 14.04上配置Bind作为缓存型/转发型DNS服务器
- 在Debian上用Bind配置DNS服务器
- 在Debian上用Bind 配置DNS服务器
- 在windowns xp上安装和配置BIND dns服务器
- 如何在Ubuntu 14.04当中将Bind配置为仅权威DNS服务器
- Ubuntu/CentOS使用BIND配置DNS服务器
- 在Ubuntu上配置DNS
- 在linux上使用BIND建立DNS服务器(1)
- 在linux上使用BIND建立DNS服务器(2)
- 在linux上使用BIND建立DNS服务器(3)
- 在 CentOS7.0 上搭建 Chroot 的 Bind DNS 服务器
- 使用bind配置DNS服务器
- 在FREEBSD 5.2上安装配置DNS SERVER(BIND 9)
- 在思科路由器上配置DNS服务器
- Linux配置bind服务器DNS服务器
- Ubuntu系统搭建bind DNS服务器
- linux上使用BIND建立DNS服务器
- C语言基础(八)- 进制转化、计算机补码、位运算符
- mysql的问题
- mysql存储过程详解实例
- _resultsMap
- 常用端口总结
- 在Ubuntu 14.04上用BIND配置一个私有网络DNS服务器
- 环信实现基本聊天功能
- 先验概率与后验概率与似然估计
- C语言基础(九)- 链表
- POj 1019 number sequence(数学)
- 安捷伦示波器的游戏
- redux介绍
- WebAPI GET和POST请求的几种方式
- 自定义NSLog宏输出