12月23, 2017

BIND DLZ MYSQL

数据库表

表名 说明
dns_records 内网 DNS 记录
dns_xfer 主从间的传送信息

dns_records 表结构

Field Type null key default Extra Explain
id bigint(20) NO PRI auto increment 主键
zone text YES NULL 域名
host text YES NULL 记录名称
type text YES NULL 记录类型
data text NO 记录值
ttl int(11) YES NULL 存活时间
view enum NO beijing 视图
mx_priority text YES NULL MX 权重
primary_ns text YES NULL SOA记录 主NS
resp_person text YES NULL SOA记录 负责人
serial bigint(20) YES NULL SOA记录 序列号
refresh int(11) YES NULL SOA记录 刷新时间
retry int(11) YES NULL SOA记录 重试时间
expire int(11) YES NULL SOA记录 过期时间
minimum int(11) YES NULL SOA记录 最小时间
remark text YES NULL 备注信息
status tinyint(4) NO 1 记录状态
create_at timestamp NO CURRENT_TIMESTAMP 创建时间
updated_at timestamp NO CURRENT_TIMESTAMP 更新时间

说明:

    view:视图,以用来区分不同的网络区域
  serial:序列号,每次更改配置都会在原来的基础上加1
  status:0该记录无效, 1该记录有效

创建表

  • DNS 记录表

    CREATE TABLE `dns_records` (
    `id` bigint(20) NOT NULL AUTO_INCREMENT,
    `zone` varchar(255) DEFAULT NULL,
    `host` varchar(255) DEFAULT NULL,
    `type` varchar(255) DEFAULT NULL,
    `data` varchar(255) DEFAULT NULL,
    `ttl` int(11) DEFAULT NULL,
    `view` enum('any','beijing','shanghai') NOT NULL DEFAULT 'beijing',
    `mx_priority` int(11) DEFAULT NULL,
    `primary_ns` varchar(255) DEFAULT NULL,
    `resp_person` varchar(255) DEFAULT NULL,
    `serial` bigint(20) DEFAULT NULL,
    `refresh` int(11) DEFAULT NULL,
    `retry` int(11) DEFAULT NULL,
    `expire` int(11) DEFAULT NULL,
    `minimum` int(11) DEFAULT NULL,
    `status` tinyint(4) DEFAULT '1',
    `remark` varchar(255) DEFAULT NULL,
    `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
    `updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    PRIMARY KEY (`id`),
    KEY `zone_index` (`zone`),
    KEY `host_index` (`host`),
    KEY `type_index` (`type`),
    KEY `status_index` (`status`),
    KEY `created_at_index` (`created_at`),
    KEY `updated_at_index` (`updated_at`)
    ) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8 COMMENT='DNS记录'
    
  • DNS 区域传输表

    CREATE TABLE `dns_xfer` (
    `id` bigint(20) NOT NULL AUTO_INCREMENT,
    `zone` varchar(255) NOT NULL DEFAULT '',
    `client` varchar(255) NOT NULL DEFAULT '',
    `status` tinyint(4) DEFAULT '1',
    `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
    `updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    PRIMARY KEY (`id`),
    KEY `zone_client_index` (`zone`),
    KEY `zone_client_index` (`client`),
    KEY `zone_client_index` (`created_at`),
    KEY `zone_client_index` (`updated_at`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='DNS传送信息'
    

View zone 配置

view "beijing_view" {
    match-clients { beijing; };
    dlz "Mysql zone" {
        database "mysql
        {host=127.0.0.1 dbname=binddns ssl=false port 3306 user=binddns pass=binddns_pass}
        {select zone from dns_records where zone = '$zone$' and view = 'beijing' limit 1}
        {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$' and view = 'beijing'}
        {}
        {select ttl, type, host, mx_priority, case when lower(type)='txt' then concat('\"', data, '\"') else data end, resp_person, serial, refresh, retry, expire, minimum from dns_records where zone = '$zone$' and view = 'beijing'}
        {select zone from xfr_table where zone = '$zone$' and client = '$client$' and view = 'beijing' limit 1}";
    };
};

添加表数据

  • 添加 SOA 记录

    INSERT INTO `dns_records` \
    (`zone`, `host`, `data`, `type`, `refresh`, `retry`, `expire`, `minimum`, `serial`, `resp_person`, `primary_ns`, `status`) VALUES \
    ('mytest.cn', '@', 'mytest.cn.', 'SOA', '3600', '60', '1209600', '180', '2017120600', 'root.mytest.cn.', 'ns1.mytest.cn.', '1');
    
  • 添加 NS 记录

    INSERT INTO `dns_records` \
    (`zone`, `host`, `ttl`, `type`, `data`) VALUES \
    ('mytest.cn', '@', '86400', 'NS', 'ns1.mytest.cn.'), \
    ('mytest.cn', '@', '86400', 'NS', 'ns2.mytest.cn.');
    
  • 添加 NS A 记录

    INSERT INTO `dns_records` \
    (`zone`, `host`, `type`, `data`, `ttl`, `view`) VALUES
    ('mytest.cn', 'ns1', 'A', '10.37.8.2', 600, 'beijing'),
    ('mytest.cn', 'ns2', 'A', '10.37.8.3', 600, 'beijing');
    
  • 添加 A 记录

    INSERT INTO `dns_records` \
    (`zone`, `host`, `type`, `data`, `ttl`, `view`) VALUES
    ('mytest.cn', 'mytest', 'A', '10.37.18.158', 600, 'beijing');
    

遇到的问题

07-Dec-2017 08:44:55.271 dns_rdata_fromtext: buffer-0x7fffedf506b0:1: near eof: unexpected end of input
07-Dec-2017 08:44:55.271 dns_sdlz_putrr returned error. Error code was: unexpected end of input

这是因为网上有些资料在插入 SOA 记录时,没有data数据导致的。这里data应该为区域文件的域。

本文链接:https://fandenggui.com/post/bind-dlz-mysql.html

-- EOF --

Comments