本文共 5910 字,大约阅读时间需要 19 分钟。
前言:
了解named 如果说我们安装的rpm包不符合我们的要求怎么办、比如说我们想起用named的线程模式、比如说我想让他禁用IPv6、比如说我们想启用某种特性、而rpm在编译时没有提供、那这时我们只能去手动编译安装了,那如何去编译安装named: 编译安装named有一个麻烦之处、所有的配置文件你都得自己去建立、像/var/named/这个目录、编译安装时连这个目录都不会存在、得自己去创建这个目录、里面的各种配置文件、区域文件、像根的、localhost的、以及localhost的反向的、都得手动去做、连我们service启动脚本都没、所以不到万不得以最好别去编译他、因为很麻烦、但对于我们学习来讲、我们应该是变得法的去折腾自己、活着就是折腾嘛、那我们各种方法都去摸索一遍、将来我们真要用得着了也好应对。 首先上来就同步一下我们的时间: # hwclock -s 然后检查一下安装环境所需要的开发包组、确保所依赖的开发包组都装有了、我这里没有装、那我就用yum来装一下吧: # yum -y groupinstall "Development Tools" # yum -y groupinstall "Server Platform Development" # yum grouplist 装好后查看一下、最主要两项:Development tools和Server Platform Development 然后我们就去下载源码包了、这里我就去www.isc.org/donloads/官方网站下载了、支持使用的版本是9.9.5、当前使用的稳定版、这个版本中已经自带dlz了、以前的版本没有自带的、安装时要装这个dlz的、如果我们将来人希望指资源记录基于数据库的方式存放的话、而且要能够现场检索、现场响应的话、则自定义启用dlz功能即可、下载好我们就去解压缩: # tar xf bind-9.9.5.tar.gz
这里注意一下:我们要去编译安装一个服务、首先要去看他的README、然后看他的INSTALL、大体了解一下有没有我们所需要的信息、当然我们这里就不多说了、直接往下走:
# ./configure --prefix=/usr/local/bind9 --sysconfdir=/etc/named --enable-threads --enable-epoll --disable-chroot --prefix=/usr/local/bind9:指定编译存放的路径 --sysconfdir=/etc/named:指定配置文件存放路径 --enable-threads:启用了多线程的功能 然后make和make install就OK了、安装完成就可以去配置了 # make && make install
我们前面说过、编译安装named什么都得自己创建、用户也没有的、所以我们得给他创建一个用户先、而且用户是系统用户、要加-r、系统用户不会给他创建家目录的:
先创建用户组: # groupadd -g 53 -r named # useradd -g named -r named 这里我们先去创建named的工作目录、然后创建named.ca这个文件: # mkdir /var/named 这里@后面的IP是能访问互联网的服务器、生成的数据存在到/var/named/named.ca中去 # dig -t NS . @172.16.0.1 > /var/named/named.ca
然后再去编辑/etc/named/named.conf的配置文件、这个文件也没有、需要自己去编写的:
# vim /etc/named/named.conf 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | #定义全局的 options { #定义named的固定工作路径 directory "/var/named" ; }; #定义根的区域 zone "." IN { type hint; #类型、hint表示为根的 file "named.ca" ; #指定的文件 }; #定义本本地的区域 zone "localhost" IN { type master; #类型属于master、属于自己的 file "named.localhost" ; #指定的文件 allow-transfer { none; }; #不允许任何人传送的 }; #定义反向解析的 zone "0.0.127.in-addr.arpa" IN { type master; #类型属于master、属于自己的 file "named.loopback" ; #指定的文件 allow-transfer { none; }; #不允许任何人传送的 }; |
1 2 3 4 5 6 7 8 9 | $TTL 86400 ;定义宏 @ IN SOA localhost admin.localhost. ( 2014031101 ;序列号 2H ;刷新时间 10M ;失败时重试间隔时间 7D ;过期时间 1D) ;否定答案的时间 IN NS localhost. localhost. IN A 172.0.0.1 |
然后复制一份改写named.loopback的文件:
# cp /var/named/named.localhost /var/named/named.loopback # vim named.loopback 1 2 3 4 5 6 7 8 9 | $TTL 86400 @ IN SOA localhost admin.localhost. ( 2014031101 2H 10M 7D 1D ) IN NS localhost. 1 IN PTR localhost. |
为了方便、我们在PATH下加个的路径、/etc/profile.d/named.sh:
# vim /etc/profile.d/named.sh export PATH=/usr/local/bind9/bin:/usr/local/bind9/sbin:$PATH 在我们的终端重新登录一下就可以生效了 好的、检查一下我们的区域文件有没有语法错误、然后就可以启动了: # named-checkzone "localhost" /var/named/named.localhost # named-checkzone "0.0.127.in-addr.arpa" /var/named/named.loopback # named -u named #这个表示以named用户启动named # ss -tunl | grep "\<53\>" 然后再查看一下有没有监听53号端口最后、因为他是一个服务、所以我们要为他提供一个服务脚本、以后可以利用脚本启动、编辑/etc/rc.d/init.d/named:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 | # vim /etc/rc.d/init.d/named #!/bin/bash # # description: named daemon 描述信息 # chkconfig: - 25 88 启动和关闭级别 # # 启动named的pid文件、其实文件路径我们都可以自己指定的 pidFile= /usr/local/bind9/var/run/named .pid # 启动服务时的锁文件、判断一个服务是不是启动是靠这个锁文件的 lockFile= /var/lock/subsys/named # named的配置文件路径 confFile= /etc/named/named .conf # 判断/etc/rc.d/init.d/functions路径下的functios是否存在这个文件、存在就sources进来 [ -r /etc/rc .d /init .d /functions ] && . /etc/rc .d /init .d /functions # 定义启动方法 start() { # 判断锁文件是否存在、如果存在就说服务已经启动并退出 if [ -e $lockFile ]; then echo "named is already running..." exit 0 fi # 打印服务已经启动的信息 echo -n "Starting named:" # 调用functions中的daemon方法、并用--pidfile指定pid文件在什么地方、还指定用户和配置文件、我们本来是直接启用named的、现在利用daemon这个函数来启用这个服务、他会获得很多额外的属性、如果成功了会帮我们打印什么[ OK ]的、还可以做判断 daemon --pidfile "$pidFile" /usr/local/bind9/sbin/named -u named -c "$confFile" RETVAL=$? echo # 判断上面的命令是否执行成功、说明启动成功 if [ $RETVAL - eq 0 ]; then # 如果判断成功、就创建锁文件 touch $lockFile return $RETVAL else # 否则、就是失败了、那就删除锁文件和pid文件 rm -f $lockFile $pidFile return 1 fi } # 定义停止方法 stop() { # 如果锁文件不存在 if [ ! -e $lockFile ]; then # 说明服务还没有启动 echo "named is stopped." fi echo -n "Stopping named:" killproc named RETVAL=$? echo # 判断以上的命令是否执行停止成功、如果成功 if [ $RETVAL - eq 0 ]; then # 删除锁文件和pid文件 rm -f $lockFile $pidFile return 0 else # 否则打印说没能正常停止 echo "Cannot stop named." # 调用functions中的函数、会打印失败 failure return 1 fi } # 定义重启服务 restart() { # 调用停止方法 stop # 睡眠2秒 sleep 2 # 调用启动方法 start } # 定义重新加载服务方法 reload() { echo -n "Reloading named: " # killprco HUP信号、named进程的信号 killproc named -HUP RETVAL=$? echo return $RETVAL } # 定义服务状态 status() { if pidof named &> /dev/null ; then echo -n "named is running..." success echo else echo -n "named is stopped..." success echo fi } # 定义错误提示信息 usage() { echo "Usage: named {start|stop|restart|status|reload}" } case $1 in start) start ;; stop) stop ;; restart) restart ;; status) status ;; reload) reload ;; *) usage exit 4 ;; esac |