BIND简易教程:安装及基本配置

Posted 小苹果的苹果树

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了BIND简易教程:安装及基本配置相关的知识,希望对你有一定的参考价值。

首先,为什么说是简易教程呢?因为BIND的功能实在太多,全写出来的话要连载好久,我觉得我没有那么多精力去写;而我了解的仅仅是有限的一点点,不敢造次。百度上的文章也是一抓一大把呐!所以,教点基本使用方法,有需求的同学可以再翻翻BIND管理员手册。
那么,还是直接开始说正题吧。本次还是像PowerDNS一样是一个连载,写三篇。

目录:
BIND简易教程(1):安装及基本配置(本篇)
BIND简易教程(2):BIND视图配置(待续)
BIND简易教程(3):DNSSec配置(待续)

首先说说安装。安装是非常简单的,在ubuntu下直接

apt-get install bind9 bind9-doc dnsutils

 

即可,相信centos中yum也可以装。但是这样安装有个问题,就是不会安装openssl。不安装openssl的话,就不能开启dnssec。所以,如果有dnssec的需求(比如说我司),就不能用apt了。需要用源码安装。其实源码安装也是相当轻松的。先到官网(https://www.isc.org/downloads/)下载最新的稳定版本BIND(我现在的最新稳定版是9.10.4-P2),之后

tar zxvf bind-9.10.4-P2.tar.gz
cd bind-9.10.4-P2
sudo ./configure
sudo make
sudo make install

 

别忘了要提前装好openssl。如果想源码安装又不想装openssl的话,在configure后面加上参数--without-openssl。

安装还是很简单的。装好的bind主要由三部分构成:解析库(配置文件)、解析器(named)、管理器(rndc),解析库是以named.conf为中心的一堆配置文件,具体配置方法我们后面讲;named程序是bind的后台进程,是负责解析域名的;rndc是bind的远程管理程序,可以动态的添加/删除域名,查看bind状态,重新加载等。在这里,我们主要使用的是解析库。
bind配置文件提供了两个非常巧妙的语法规则:注释和include。注释用// 和# 均可,满足了不同程序猿的喜好;include则可以将不同类型的配置分开来,放在不同的文件中。其实include倒更像是宏的作用。上文说“以named.conf为中心”大概意思是,在named.conf中可以不直接写配置,而是写几个include,不同的include是不同类型的配置。比如默认的named.conf中include了named.conf.options、named.conf.local、named.conf.default-zones这三个文件。后两个我现在还用不到,就暂时注释起来了。保留named.conf.options,把选项和日志记在这里。named.conf.options配置如下:

key "rndc-key" {
    algorithm hmac-md5;
    secret "RaxA6K9RyJLFbJeeV3PkYg==";
};
controls {
    inet 127.0.0.1 port 953
    allow { 127.0.0.1; } keys { "rndc-key"; };
};
options {
    directory "/var/cache/bind";
    max-cache-ttl 120;
    max-ncache-ttl 120;
    version "[no version.]";
    listen-on-v6 { none; };
    minimal-responses yes;
    recursion no;
    auth-nxdomain no;
    dnssec-enable no;
};

 

先写这几个,日志呆会再说。options里面有很多选项,我只写了这几个。具体都有什么,应该怎么写,可以参考管理员手册。

写好options之后,在named.conf中加入include "/etc/bind/named.conf.options";就好了(其实默认的named.conf文件中已经有了)。
接下来是说明本DNS服务器能解析哪些域,也就是zone部分。因为内容比较少,我就懒得单独建立文件了,直接写进了named.conf中:

zone "apple.tree" IN {
    type master;
    file "/etc/bind/views/zones/db.apple.zone";
};

有时候我们希望在某个特定域解析的时候使用一种options的属性,而其他域使用其他属性,那么就可以把options里面的属性放在zone里面写。管理员手册中有相应的写法。注意一下,各种配置,句末都要加分号,包括花括号结束,也要加分号。

这里我只说明了本机是主DNS服务器(这个选项可以设置主从),而本域的具体解析内容是在db.apple.zone文件中。db.apple.zone的配置为:

$TTL 86400
@   IN  SOA apple.tree. apple.apple.tree. (
          2016090100     ; Serial
               28800     ; Refresh
                7200     ; Retry
              604800     ; Expire
               86400     ; Negative Cache TTL
)
@   IN  NS  apple.tree.
@   IN  A   192.168.4.43
aaa     IN      A       192.168.4.100
bbb     IN      A       192.168.4.101
ccc     IN      CNAME   bbb

 

最前面的SOA,NS和A的部分是必须有的,具体写法是:

  • @符号代表对本机的解析;
  • IN表示Internet,表示是解析的是因特网中的域名。这个在RFC1035中也有介绍。据说以前也有别的东西,但是现在基本只剩下IN了。
  • SOA的写法可以参考这篇文章:https://bobcares.com/blog/understanding-soa-records/ 解释的比较详细。
  • NS写本域。
  • A写对本机解析到的A地址。

后面的是详细的可以解析的主机。在这里也许还需要简单的解释一下,一个域名是由“主机+域”共同组成的,比如我们常见的www.baidu.com这个域名,baidu.com是它的域,而www表示这个页面保存在这个主机上。像map.baidu.com,image.baidu.com都是存放在不同的主机的,对域名解析出来的地址有可能也不是同一个(我只是说有可能啊,当然扔同一个服务器上也没什么)。
我这里的aaa,bbb,ccc就表示3个主机,其中aaa和bbb解析到不同的地址,而ccc设定为bbb的别名。(A是IP地址,CNAME是别名。也有别的东西。具体参见RFC1035。)要注意,我这三个主机都在apple.tree这个域中,也就是aaa.apple.tree,bbb.apple.tree,ccc.apple.tree这三个域名,在解析时需要将后面的域名省略掉。假设我还有个域名ddd.apple.tree想解析到www.baidu.com,需要这么写:

ddd    IN    CNAME    www.baidu.com.

 

注意最后有个点,表示到这里结束,这是一个完整的域名,而不是一台主机。解析到A地址时候最后不加点。

以上。写好之后,可以用sudo service bind9 restart来重启服务器。当然我不建议这样重启。建议用sudo rndc reload重新加载,这样不影响当前DNS服务器的运行。重启OK之后测试一下:

$ dig aaa.apple.tree @192.168.4.43
; <<>> DiG 9.9.5-3ubuntu0.8-Ubuntu <<>> aaa.apple.tree @192.168.4.43
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 53833
;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; WARNING: recursion requested but not available
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;aaa.apple.tree. IN A
;; ANSWER SECTION:
aaa.apple.tree. 86400 IN A 192.168.4.100
;; Query time: 4 msec
;; SERVER: 192.168.4.43#53(192.168.4.43)
;; WHEN: Fri Jan 08 14:47:48 CST 2016
;; MSG SIZE rcvd: 59

 

就酱。如果重启没有成功,就把服务关掉(sudo service bind9 stop,使用之前可以先ps -ef | grep bind看看,有没有个named -u bind的进程,如果有再关,关不掉的就直接杀进程),然后用sudo named -g来检查一下,看看服务器是在哪一步挂掉的。说不定配置语法里少个分号。

最后说说日志的配法:
我直接在named.conf.options最后加上了logging选项:

logging {
    channel defaults {
        file "/var/log/named/default.log";
        severity dynamic;
        print-time yes;
        print-category yes;
        print-severity yes;
    };
    channel securitys {
        file "/var/log/named/securitys.log";
        severity dynamic;
        print-time yes;
        print-category yes;
        print-severity yes;
    };
    channel gsquery {
        file "/var/log/named/query.log"   versions 3 size 20m;
        severity info;
        print-time yes;
        print-category yes;
        print-severity yes;
    };
    category queries { gsquery; };
    category security { securitys; };
    category default { defaults; };
    category general { defaults; };
};

 

这里要注意:

(1)注意写到/var/log/named目录中的时候,可能会涉及到权限问题,如果bind启动不了,需要检查一下apparmor对bind的权限控制。具体检查方法:

sudo vim /etc/apparmor.d/usr.sbin.named

 

在最下面找到

# some people like to put logs in /var/log/named/ instead of having
# syslog do the heavy lifting.
/var/log/named/** rw,
/var/log/named/ rw,

 

加入一行

/var/log/named/* rw,

 

然后保存,用

sudo /etc/init.d/apparmor reload

 

或者

sudo /etc/init.d/apparmor restart

 

使配置生效。

(2)如果不特意配置logging,也会有默认的日志记录,是跟系统日志一起的。如果要彻底关闭日志,需要写成酱婶的:

logging {
    channel "null" { null; };
    category "default" { null; };
};

 

测试性能的时候需要关闭日志,否则QPS差到不能忍。因为经常需要打开关闭日志,所以,我发现有注释功能实在是太爽了!

BIND除了这种一般的域名解析功能,还可以对IP进行反解析,也就是从ip解析到域名。具体配置方法可以自行查找(我没用到,所以懒得写了。。囧。。)
好啦,基本配置就讲这么多。

以上是关于BIND简易教程:安装及基本配置的主要内容,如果未能解决你的问题,请参考以下文章

BIND简易教程:DNSSec配置

BIND简易教程:在Ubuntu下源码安装BIND(其实跟前面的教程没太大关系)

Oracle简易教程

nginx简易教程

nginx简易教程

Git简易实操教程