首先,为什么说是简易教程呢?因为BIND的功能实在太多,全写出来的话要连载好久,我觉得我没有那么多精力去写;而我了解的仅仅是有限的一点点,不敢造次。百度上的文章也是一抓一大把呐!所以,教点基本使用方法,有需求的同学可以再翻翻BIND管理员手册。
那么,还是直接开始说正题吧。本次还是像PowerDNS一样是一个连载,写三篇。
目录:
BIND简易教程(1):安装及基本配置(本篇)
首先说说安装。安装是非常简单的,在ubuntu下直接
apt-get install bind9 bind9-doc dnsutils
即可,相信centos中yum也可以装。但是这样安装有个问题,就是不会安装openssl。不安装openssl的话,就不能开启dnssec。所以,如果有dnssec的需求(比如说我司),就不能用apt了。需要用源码安装。其实源码安装也是相当轻松的。先到官网()下载最新的稳定版本BIND(我现在的最新稳定版是9.10.4-P2),之后
tar zxvf bind-9.10.4-P2.tar.gzcd bind-9.10.4-P2sudo ./configure --sysconfdir=/etc/bind --with-libtoolsudo makesudo make install
configure的参数视自己具体情况而定。我习惯把所有配置文件放在/etc/bind下面,就加上--sysconfdir,如果不加的话,name.conf默认在/etc下面,很乱;--with-libtool据说加上之后能让编译出来的文件是.so而非.a,占用空间较小。不过我加上这个参数之后make编译会报错,我对这种编译方式不是很熟,所以就放弃了。
如果源码安装有疑问,请移步,这里不详细解释了。
安装还是很简单的。装好的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.43aaa IN A 192.168.4.100bbb IN A 192.168.4.101ccc 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解析到域名。具体配置方法可以自行查找(我没用到,所以懒得写了。。囧。。)
好啦,基本配置就讲这么多。
最后的最后,还是配上图,以免无聊广告乱入: