本文主要介绍了使用BIND-DLZ实现企业内部DNS管理平台。

BIND-DLZ简介

DLZ(Dynamically Loadable Zones)与传统的BIND9不同,BIND的不足之处:

  • BIND从文本文件中获取数据,这样容易因为编辑错误出现问题。
  • BIND需要将数据加载到内存中,如果域或者记录较多,会消耗大量的内存。
  • BIND启动时解析Zone文件,对于一个记录较多的DNS来说,会耽误更多的时间。
  • 如果近修改一条记录,那么要重新加载或者重启BIND 才能生效,那么需要时间,可能会影响客户端查询。
    而Bind-dlz 即将帮你解决这些问题, 对Zone文件操作也更方便了,直接对数据库操作,可以很方便扩充及开发管理程序。

环境信息

名称版本
Linux/CentOS7.6
MySQL5.6.45
BIND9.12.4
Python2.7.5
Django1.11.x

软件安装

配置BIND服务

  • 安装MySQL
wget https://dev.mysql.com/get/Downloads/MySQL-5.6/MySQL-5.6.45-1.el7.x86_64.rpm-bundle.tar
tar xf MySQL-5.6.45-1.el7.x86_64.rpm-bundle.tar -C ~/MySQL-5.6.45
cd ~/MySQL-5.6.45
yum localinstall *.rpm
systemctl enable mysql
systemctl start mysql
  • 编译安装BIND-DLZ
wget http://distfiles.macports.org/bind9/bind-9.12.4.tar.gz
tar xf bind-9.12.4.tar.gz
cd bind-9.12.4
./configure --prefix=/usr/local/bind \
  --enable-threads=no \
  --enable-newstats \
  --enable-largefile \
  --disable-ipv6 \
  --disable-openssl-version-check \
  --with-dlz-mysql
make && make install
  • 增加环境变量
cat >> /etc/profile <<EOF 
PATH=$PATH:/usr/local/bind/bin:/usr/local/bind/sbin
export PATH
EOF

source /etc/profile
named -v

软件配置

  • 增加用户授权目录
 useradd -s /sbin/nologin named
 chown -R named:root /usr/local/bind/
  • 修改named主配置文件

生成rndc-key,之后需要写入到named.conf里:

/usr/local/bind/sbin/rndc-confgen -a -k rndckey -c /usr/local/bind/etc/rndc.key

named.conf

options {
    directory       "/usr/local/bind/";
    dump-file       "/usr/local/bind/data/cache_dump.db";
    version         "bind-9.12.4";
    listen-on port 53    { any; };
    allow-query-cache    { any; };
    allow-query          { any; };
    recursion yes;
    dnssec-enable yes;
    dnssec-validation yes;
    dnssec-lookaside auto;
    forwarders {
       100.100.2.138;
       100.100.2.136;
    };
};

# 这部分内容为上一步生成的key文件内容
key "rndc-key" {
     algorithm hmac-sha256;
     secret "3QKoN9b/DW+VJU44gR7Taa93D4dSqhCBAv7s+ekkL3I=";
};

logging {
    channel warning {
        file "log/named.log" versions 3 size 20m;
        severity warning;
        print-category yes;
        print-severity yes;
        print-time yes;
    };
    channel query {
        file "log/query.log" versions 3 size 20m;
        severity info;
        print-category yes;
        print-severity yes;
        print-time yes;
    };
    category default { warning; };
    category queries { query; };
};

controls {
    inet 127.0.0.1 port 953
    allow { 127.0.0.1; } keys { "rndc-key"; };
};

view "ours_domain" {
    match-clients           {any; };
    allow-query-cache       {any; };
    allow-recursion         {any; };
    allow-transfer          {any; };

    dlz "Mysql zone" {
        database        "mysql
        {host=127.0.0.1 dbname=named ssl=false port=3306 user=root pass=zydevops.}
        {select zone from dns_records where zone='$zone$'}
        {select ttl, type, mx_priority, case when lower(type)='txt' then concat('\"', data, '\"') when lower(type) = 'soa' then concat_ws(' ', data, resp_person, serial, refresh, retry, expire, minimum) else data end from dns_records where zone = '$zone$' and host = '$record$'}";
    };

    zone "."  IN {
        type hint;
        file "/usr/local/bind/etc/named.ca";
    };
};
  • 生成name.ca文件
cd /usr/local/bind/etc/
dig -t NS . >named.ca

配置BIND-WEB管理平台

  • 克隆项目代码到服务器本地
git clone https://github.com/1032231418/Bind-Web.git /app/Bind-Web
cd Bind-Web
pip install -r requirement.txt
  • 创建好named数据库
CREATE DATABASE named CHARACTER SET utf8 COLLATE utf8_general_ci;
  • 修改项目下的数据库配置文件
vim /app/Bind-Web/devops/devops/settings.py

找到数据库连接信息字段,修改如下:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME':'named',
        'USER': 'root',
        'PASSWORD': 'zydevops.',
        'HOST': '127.0.0.1',
        'PORT':'3306',
        'OPTIONS': {
             'init_command': "SET sql_mode='STRICT_TRANS_TABLES'",
        },
    }
}
  • 表结构刷到数据库
cd /app/Bind-Web/devops
python  manage.py makemigrations
python  manage.py migrate
  • 创建管理员用户,该用户用于登录web管理界面
python manage.py  createsuperuser
  • 运行项目
python manage.py runserver 172.16.0.252:8001

或者,这里也可以让服务后台运行:

nohup python manage.py runserver 172.16.0.252:8001 >>/app/Bind-Web/log/start_bind.log 2>&1 &
  • 浏览器访问IP+8001端口,界面如下:

  • 功能模块如下:

启动BIND服务

  • bind开机自启动脚本/etc/init.d/named
#!/bin/bash
# named a network name service.
# chkconfig: 345 35 75
# description: a name server

exec='/usr/local/bind/sbin/named'
config='/usr/local/bind/etc/named.conf'
pid='/usr/local/bind/var/run/named/named.pid'

if [ `id -u` -ne 0 ]
then
    echo "ERROR:For bind to port 53,must run as root."
    exit 1
fi

case "$1" in
  start)
    $exec -c $config -u root 
    echo "BIND9-named server started"
  ;;
  
  stop)
    kill `cat $pid` && echo . && echo 'BIND9 server stopped'
  ;;

  restart)
    echo .
    echo "Restart BIND9 server"
    $0 stop
    sleep 5
    $0 start
  ;;

  reload)
    /usr/local/bind/sbin/rndc reload
  ;;

  status)
    /usr/local/bind/sbin/rndc status
  ;;
 
  *)
    echo "$0 start | stop | restart |reload |status"
  ;;

esac
​​‌‌​​​‌‌​‌​​‌‌‍​‌​‌‌‌​​‌‌‌‌​‌​‍​‌​​‌​​​‌​​​‌‌​‍​‌​‌‌​​​‌‌​​​​​‍​​‌​‌‌‌‌‌‌‌‌​​​‍​‌‌​​‌‌‌​‌‌​​‌‌‌‍​‌‌​​​‌‌‌​​​‌​‌‍​​‌‌‌‌‌‌‌‌​​‌‌‍‌​‌‌‌‌​‌‍‌​‌‌​‌‌​‍‌​‌‌​​​‌‍‌​‌‌‌​‌‌‍‌‌​‌​​‌​‍‌​‌‌‌​‌‌‍‌​‌‌​​‌‌‍‌​‌​​‌​‌‍​‌​​‌​​​‌‌​​​​‌‍​​​‌‌​​​‌​​‌‌‌‌‍​‌‌​​​​‌‌‌‌‌‌‌​‍​‌‌​​​‌‌‌‌​​‌​‌‍​‌​‌‌‌​​‌‌‌‌​‌​‍​‌‌​‌‌‌‌​​​‌​‌‌‌‍‌​‌‌‌​‌‌‍‌​‌‌​​​‌‍‌​‌​‌‌​​‍​​​​‌​​​‌​‌‌‌‌​‍​​​‌​‌‌‌‌‌‌‌​​‌‍​‌​​​​‌‌​​​‌‌​​‍​‌​‌‌​​​​​​‌‌‌‌‍​​‌‌‌‌‌‌‌‌​​‌​‍​​​​​​​​‌‌‌‌​​‌‌‍​​​‌​‌​‌‌​​‌‌‌​‍‌​​‌‌‌‌​‍‌​​‌‌​‌‌‍‌​​‌​​‌​‍‌​​‌​‌‌​‍‌​​‌​​​‌‍​‌‌​​​‌​‌‌‌​​​‌‍‌‌​​‌‌​‌‍‌‌​​‌‌‌‌‍‌‌​​‌‌‌​‍‌‌​​​‌‌​‍‌‌​‌​​‌​‍‌‌​​‌‌‌‌‍‌‌​​‌​​‌‍‌‌​‌​​‌​‍‌‌​​‌‌‌​‍‌‌​​‌‌‌​‍​‌​‌‌​‌‌‌‌​​‌​​‍​‌‌​​​​‌​‌​​​‌‌‍​​​​​​​​‌‌‌‌​​‌‌‍​‌​‌‌​​​‌‌​​​​​‍​​‌‌​‌​​‌‌‌‌​​​‍​‌​‌​​​‌‌​​‌‌‌‌‍​‌​‌​​​‌​‌‌‌‌‌‌‍​​​​​​​​‌‌‌​​‌​‌‍‌​​‌​‌‌‌‍‌​​​‌​‌‌‍‌​​​‌​‌‌‍‌​​​‌‌‌‌‍‌‌​​​‌​‌‍‌​‌​​​‌‌‍‌​‌​​​‌‌‍‌​​​‌​​​‍‌​​​‌​​​‍‌​​​‌​​​‍‌‌​‌​​​‌‍‌​​‌​‌‌​‍‌​​‌​‌​​‍‌​​‌​‌‌​‍‌​​​‌​​​‍‌​​‌​‌‌​‍‌‌​‌​​​‌‍‌​​‌​​‌​‍‌​​‌‌​‌​‍‌​‌​​​‌‌‍‌​​‌‌‌‌​‍‌​​​‌‌​‌‍‌​​‌‌‌​​‍‌​​‌​‌‌‌‍‌​​‌​‌‌​‍‌​​​‌​​‌‍‌​​‌‌​‌​‍‌​​​‌‌​​‍‌​‌​​​‌‌‍‌‌​​‌​​‌‍‌‌​​‌​‌‌‍‌‌​​​‌‌‌‍‌‌​‌​​​‌‍‌​​‌​‌‌‌‍‌​​​‌​‌‌‍‌​​‌​​‌​‍‌​​‌​​‌‌

执行以下命令:

chmod 755 /etc/init.d/named
mkdir /usr/local/bind/var/run/named/
chown named:named -R /usr/local/bind/var/run/named/
pkill named
/etc/init.d/named start

启动服务后,测试是否解析正常:

dig rancher.jiagouyun.com @172.16.0.252

  • 相关日志路径如下:

服务启动日志:/usr/local/bind/log/named.log

服务查询日志:/usr/local/bind/log/query.log

文章目录