经过两周开发,DNS管理平台终于开发完成。今天正好有时间,给大家分享一下。

1.整体架构

     Django+bind dlz DNS管理平台_第1张图片      > DNS 服务器分成两组,每组在不同的机房。保障一组机器出现问题,减少对用户的影响。

      > 每组DNS服务器使用lvs,实现负载均衡。

      > 针对不同运营商的用户,可以将dns 服务器分成两个view(我分成了电信和其它,你可以根据自己的业务进行定义)。

      > 使用dns的dlz功能,将zone和记录都保存至数据库,每次更改记录时,无需重新启动服务。

      > DNS管理平台对zone和记录进行管理。


2. DNS服务器搭建

  > 首先在每台DNS服务器安装bind软件,配置DLZ

#安装bind之前,首先安装mysql服务端和mysql-devel
yum install mysql-devel mysql-server mysql

#安装bind-9.9.5版本
#bind-9.9.5+版本才支持dlz功能
wget http://www.isc.org/downloads/file/bind-9-9-5-w1/?version=tar.gz
tar -zxvf bind-9-9-5.tar.gz
LDFLAGS=-L/usr/lib64/mysql ./configure --prefix=/usr/local/mydns/ --enable-rrl --enable-threads --enable-newstats --with-dlz-mysql  && make && make install

#配置BIND
#/usr/local/mydns/etc/named.conf   bind配置文件

key "rndc-key" {
         algorithm hmac-md5;
         secret "keZqPKmKedNuLBV2R3bwAg==";
};
controls {
         inet 127.0.0.1 port 953
         allow { 127.0.0.1; } keys { "rndc-key"; };
};

options {
        tcp-clients 50000;
        directory "/usr/local/mydns/etc/";
        pid-file "/usr/local/mydns/log/mydns.pid";
        dump-file "/usr/local/mydns/log/mydns_dump.db";
        statistics-file "/usr/local/mydns/log/mydns.stats";
        rate-limit {
                nxdomains-per-second 3;
                window 1;
        };
        recursion no;
        version "david-bind9-version.1.00";
        allow-notify       { none; };
        allow-recursion    { none; };
key "rndc-key" {
         algorithm hmac-md5;
         secret "keZqPKmKedNuLBV2R3bwAg==";
};

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

options {
        tcp-clients 50000;
        directory "/usr/local/mydns/etc/";
        pid-file "/usr/local/mydns/log/mydns.pid";
        dump-file "/usr/local/mydns/log/mydns_dump.db";
        statistics-file "/usr/local/mydns/log/mydns.stats";
        rate-limit {
                nxdomains-per-second 3;
                window 1;
        };
        recursion no;
        version "david-bind9-version.1.00";
        allow-notify       { none; };
        allow-recursion    { none; };
        allow-transfer     { none; };
        allow-query        { any; };
};

logging {
        channel info
        {
                file "/usr/local/mydns/log/dns_warnings" versions 3 size 100m;
                severity warning;
                print-category yes;
                print-severity yes;
                print-time yes;
        };
        channel general_dns
        {
                file "/usr/local/mydns/log/dns_logs" versions 3 size 100m;
                severity info;
                print-category yes;
                print-severity yes;
                print-time yes;
        };
        category default { info; };
        category queries { general_dns; };
        category client { info; };
        category resolver { info; };
        category lame-servers { null; };
};
include  "/usr/local/mydns/etc/master.conf";


#/usr/local/mydns/etc/master.conf
#/usr/local/mydns/etc/ct_acl_list.conf 是电信ACL列表

include "/usr/local/mydns/etc/ct_acl_list.conf";
view CT {
        match-clients {CT;};
        dlz "Mysql zone" {
        database "mysql
        {host=x.x.x.x dbname=mydns  port=3308 user=root pass=xxxxx}   #连接的数据库
        {select zone from bind_ct  where zone = '$zone$' limit 1}
        {select ttl, type, data, resp_person, serial, refresh,retry, expire, minimum from bind_ct  where zone ='$zone$' and host = '$record$'}";
        };
};

view  ANY  {
        match-clients {any;};
        dlz "Mysql zone" {
        database "mysql
        {host=x.x.x.x dbname=mydns  port=3308 user=root pass=xxxxxx}
        {select zone from bind_any where zone = '$zone$' limit 1}
        {select ttl, type, data, resp_person, serial, refresh,retry, expire, minimum from bind_any where zone ='$zone$' and host = '$record$'}";
        };
};

#启动bind
/usr/local/mydns/sbin/named -4

#表结构
mysql> desc bind_ct;
+-------------+------------------+------+-----+---------+----------------+
| Field       | Type             | Null | Key | Default | Extra          |
+-------------+------------------+------+-----+---------+----------------+
| id          | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
| zone        | varchar(255)     | NO   | MUL | NULL    |                |
| host        | varchar(255)     | NO   | MUL | @       |                |
| type        | varchar(6)       | NO   | MUL | NULL    |                |
| data        | varchar(255)     | NO   |     | NULL    |                |
| ttl         | int(11)          | NO   |     | 86400   |                |
| mx_priority | varchar(6)       | YES  |     | NULL    |                |
| refresh     | int(11)          | YES  |     | NULL    |                |
| retry       | int(11)          | YES  |     | NULL    |                |
| expire      | int(11)          | YES  |     | NULL    |                |
| minimum     | int(11)          | YES  |     | NULL    |                |
| serial      | bigint(20)       | YES  |     | NULL    |                |
| resp_person | varchar(255)     | YES  |     | NULL    |                |
+-------------+------------------+------+-----+---------+----------------+
13 rows in set (0.00 sec)

#插入数据
mysql> insert into bind_ct(zone, host, type, data, ttl) values('david.com', 'www', 'A', '202.106.11.3', '600');
Query OK, 1 row affected, 2 warnings (0.00 sec)

 >测试 


Django+bind dlz DNS管理平台_第2张图片

3.DNS 管理平台

    DNS管理平台主要功能批量增加记录、删除记录、修改记录、备份记录等功能。

    页面展示: Django+bind dlz DNS管理平台_第3张图片

    批量添加:

Django+bind dlz DNS管理平台_第4张图片


    本系统已经上线,代码不方便share。将思路share给大家,还请大家多提意见。