公司需要智能DNS服务,偶本来想用DNSPOD的,但觉得现在的服务的商业化保证还是很弱,所以干脆自己架一个得了,Bind本来就不怎么复杂,因为当年的Bind的漏洞还仔细研究过所以且偶对DNS的整个工作机制比较了解,所以自己动手丰衣足食就成为了努力的方向,按照这个时代的惯例,做什么时候先学习,学习的过程当然是Google的过程,那就开搜,一搜这个关于智能DNS的文章还真不少,不过仔细阅读了以后发现,大多数文章出自两个人之手,两个人的思路几乎相同,不过一个写的细致一些,另一个写的比较随意。
仔细阅读了一下之后发现没什么特别的难点,就开干吧,偶用的是CentOS 5.2, 用yum update更新到最新,顺序一如两位前辈的方法:
1. 到isc.org获得最新版的源码包,偶用的是9.6.1
[bash]
mkdir /usr/local/named
cd /usr/local/named
wget http://ftp.isc.org/isc/bind9/9.6.1/bind-9.6.1.tar.gz
[/bash]
2.如果Linux安装的时候有装named或者bind9就直接给灭了,主要的原因是版本不够新,而Bind的漏洞比较多,旧版本都很危险啊
[bash]
yum groupremove "DNS Name Server"
[/bash]
3.上传源码包,解压,用./configure 改编译选项,我除了选了prefix之外还disable了IP6和enable了multi-threading,然后发现openssl有安全漏洞,懒得去修补,直接给warning也disable了
[bash]
tar zxvf bind-9.6.1.tar.gz
cd bind-9.6.1
./configure --prefix=/usr/local/named --disable-ipv6 --enable-threads
[/bash]
4. 用make进行编译,然后用 make clean清理垃圾
[bash]
make
make install
[/bash]
5.创建用户和配置文件目录
[bash]
groupadd dnsadmin
useradd -g dnsadmin -d /usr/local/named -s /sbin/nologin dnsadmin
mkdir –p /usr/local/named/etc
chown dnsadmin:dnsadmin /usr/local/named/etc
chmod 700 /usr/local/named/etc
[/bash]
6.创建配置文件,这是个主要的地方,之所以说主要是因为这个文件是bind的灵魂,我就是因为这个文件有错,调试了N久才过,网上的文件有把zone区挪到view之外,这样不行,都要在view之内,而且每个view都必须包含
[bash]
key "rndc-key" {
algorithm hmac-md5;
secret "IGSfr4eB37aKhkDTAYqSjA==";
};
controls {
inet 127.0.0.1 port 953
allow { 127.0.0.1; } keys { "rndc-key"; };
};
key "cnckey"{
algorithm hmac-md5;
secret "cnXsAYNrypKcTdhfy3FABA==";
};
acl "trust-lan" { 127.0.0.1/8;10.50.0.0/16;};
options {
directory "/usr/local/named/etc/";
pid-file "/var/run/named/named.pid";
version "0.0.0";
datasize 40M;
/*
allow-transfer {
"trust-lan";
};
recursion yes;
allow-notify {
"trust-lan";
};
allow-recursion {
"trust-lan";
};
auth-nxdomain yes;
*/
recursion yes;
forwarders {
202.102.192.68;
202.102.200.101;
};
};
logging {
channel warning
{ file "/var/log/named/dns_warnings" versions 3 size 1240k;
severity warning;
print-category yes;
print-severity yes;
print-time yes;
};
channel general_dns
{ file "/var/log/named/dns_logs" versions 3 size 1240k;
severity info;
print-category yes;
print-severity yes;
print-time yes;
};
category default { warning; };
category queries { general_dns; };
};
/*
zone "." {
type hint;
file "named.root";
};
zone "0.0.127.IN-ADDR.ARPA" {
type master;
file "localhost.rev";
};
*/
include "/usr/local/named/etc/master/cnc_acl.conf";
view "view_cnc"{
match-clients { CNC;};
recursion yes;
# allow-transfer {key cnckey;};
# server 218.22.93.237 {keys cnckey;};
zone "." {
type hint;
file "named.root";
};
zone "0.0.127.IN-ADDR.ARPA" {
type master;
file "localhost.rev";
};
include "master/cnc.def";
};
view "view_any" {
match-clients {any; };
recursion no;
# allow-transfer {key rndc-key;};
# server 218.22.93.237 {keys rndc-key;};
zone "." {
type hint;
file "named.root";
};
zone "0.0.127.IN-ADDR.ARPA" {
type master;
file "localhost.rev";
};
include "master/telecom.def";
};
include "/etc/rndc.key";
[/bash]
7.更新根区文件
[bash]
cd /usr/local/named/etc/
wget ftp://ftp.internic.org/domain/named.root[/bash]
8.创建PID和日志文件
[bash]
mkdir /var/run/named/
chmod 777 /var/run/named/
chown dnsadmin:dnsadmin /var/run/named/
mkdir /var/log/named/
touch /var/log/named/dns_warnings
touch /var/log/named/dns_logs
chown dnsadmin:dnsadmin /var/log/named/*
mkdir master
touch master/cnc.def
touch master/ct.def
[/bash]
10.生成rndc-key
[bash]
cd /usr/local/named/etc/
../sbin/rndc-confgen > rndc.conf
[/bash]
把rndc.conf中:
# Use with the following in named.conf, adjusting the allow list as needed:
后面的部分去掉注释
11.运行测试,这里特别要注意加上 -u dnsadmin 这个选项,否则即使用root登录,也会有permission denied的错误,这个错误搞了偶老半天。。
[bash]
/usr/local/named/sbin/named -u dnsadmin -gc /usr/local/named/etc/named.conf &
[/bash]
12.用“nano /etc/init.d/named”创建运行脚本,然后设置自动运行的Service
[bash]
if [ `id -u` -ne 0 ]
then
echo "ERROR:For bind to port 53,must run as root."
exit 1
fi
case "$1" in
start)
if [ -x /usr/local/named/sbin/named ]; then
/usr/local/named/sbin/named -u dnsadmin -c /usr/local/named/etc/named.conf && echo . && echo 'BIND9 server started.'
fi
;;
stop)
kill `cat /var/run/named/pid` && echo . && echo 'BIND9 server stopped.'
;;
restart)
echo .
echo "Restart BIND9 server"
$0 stop
sleep 10
$0 start
;;
*)
echo "$0 start | stop | restart"
;;
esac
[/bash]
然后调整权限
[bash]
chmod 755 /etc/init.d/named
chown root:root /etc/init.d/named
chkconfig --add named
chkconfig named on [/bash]
13.添加Domain和CNC和CTC的zone
[bash]
cd /usr/local/named/etc/master
mkdir cnc
mkdir ct
nano cnc.def
[/bash]
cnc.def的内容:
[bash]
zone "dal.cn"{
type master;
file "master/cnc/dal.cn";
};
[/bash]
master/cnc/dal.cn的内容
[bash]
$TTL 3600
$ORIGIN dal.cn.
@ IN SOA ns.dal.cn. root.ns.dal.cn.(
2005121013 ;Serial
3600 ; Refresh ( seconds )
900 ; Retry ( seconds )
68400 ; Expire ( seconds )
15 );Minimum TTL for Zone ( seconds )
;
@ IN NS ns.dal.cn.
@ IN A 61.45.55.78
www IN A 61.45.55.78
;
;end
[/bash]
ct.def的内容:
[bash]
zone "dalkia.cn"{
type master;
file "master/ct/dalkia.cn";
};
[/bash]
master/ct/dal.cn的内容
[bash]
$TTL 3600
$ORIGIN dal.cn.
@ IN SOA ns.dal.cn. root.ns.dal.cn.(
2005121013 ;Serial
3600 ; Refresh ( seconds )
900 ; Retry ( seconds )
68400 ; Expire ( seconds )
15 );Minimum TTL for Zone ( seconds )
;
@ IN NS ns.dal.cn.
@ IN A 210.75.1.178
www IN A 210.75.1.178
;
;end
[/bash]
14.启动服务,测试
这个不需要再详细说了吧,起服务,然后用nslookup指定server之后就可以测试了,呵呵。。你如果有两个不同的内网,可以把一个内网的地址段扔进CNC 的ACL地址列表里,然后就可以很容易的测试出不同了。。
大多数步骤跟前辈的文章一样,但有些地方细节需要摸索和调整,中间我也是经历了很多错误和问题,不过网上发现了几篇格式很好的,很容易阅读的Bind配置手册,中间的介绍让很多问题立刻就解决了,配置前后花了两天的时间,中间主要卡在named.conf的权限上和一些view里的zong的包含的问题,不过后来都顺利的搞定了,今天下午终于配通了启动之后,从两个不同的子网query之后看到不同的IP,心中那个高兴啊,有一次尝到了成功的喜悦,呵呵。。虽然现在的样子也就基本能用,到了配置的很好,工作非常稳定还有一定的距离,这个需要逐步的摸索,我估计我还需要两周的时间就能成为配置这个服务器的专家了,哈哈。。
文章评论