Configure o BIND com backend de banco de dados e suporte a DLZ

6

Decidi mover meus servidores DNS baseados no Windows para o Linux. O problema é que eu preciso atualizar dinamicamente os arquivos de zona sem precisar reiniciar o bind. Parece que a solução mais popular é instalar os drivers de ligação para um servidor de banco de dados (postgresql, sqlite, mysql) e, em seguida, atualizar o arquivo de zona. Parece bastante simples, mas não consigo que funcione para a vida de mim.

Atualmente, estou usando a distribuição do Amazon Linux, mas também tentei tudo no RHEL 6.2 sem mais sorte.

Eu tentei alguns métodos diferentes. O primeiro deles foi compilar o bind com as mudanças do código-fonte para o suporte a mysql link . Isso compila muito bem com as mudanças e não recebo nenhum erro, mas depois de executar make install , todos os binários são copiados para / usr / local / sbin, mas não consigo iniciar o processo do daemon, corro service named start e isso me diz não há nenhum serviço chamado named (sem trocadilhos). Em segundo lugar, nenhum dos arquivos de configuração é gerado. Então eu criei um arquivo named.conf e coloquei em /etc/named.conf, em seguida, executei /usr/local/sbin/named-checkconf e ele me disse que não poderia encontrar o arquivo /etc/named.conf, então eu não tenho ideia.

A próxima coisa que eu tentei foi instalar o pacote bind-sdb e usar o postgresql. Pacotes instalados %código% Seguindo os passos no link eu criei um novo banco de dados e tabela de postgre, etc. Abaixo está meu atual named.conf

//
// named.conf
//
// Provided by Red Hat bind package to configure the ISC BIND named(8) DNS
// server as a caching only nameserver (as a localhost DNS resolver only).
//
// See /usr/share/doc/bind*/sample/ for example named configuration files.
//

options {
    listen-on port 53 { 127.0.0.1; };
    listen-on-v6 port 53 { ::1; };
    directory       "/var/named";
    dump-file       "/var/named/data/cache_dump.db";
    statistics-file "/var/named/data/named_stats.txt";
    memstatistics-file "/var/named/data/named_mem_stats.txt";
    allow-query     { localhost; };
    recursion yes;

    dnssec-enable yes;
    dnssec-validation yes;
    dnssec-lookaside auto;

    /* Path to ISC DLV key */
    bindkeys-file "/etc/named.iscdlv.key";
};

logging {
    channel default_debug {
            file "data/named.run";
            severity dynamic;
    };
};

zone "." IN {
    type hint;
    file "named.ca";
};

dlz "my.zone" {
   database "postgres 1
   {host=localhost port=5432 dbname=bind user=postgre password=****}
   {select zone from dns_records where zone = '%zone%'}
   {select ttl, type, mx_priority, case when lower(type)='txt' then '\"'
         || data || '\"' when lower(type)='soa' then data || ' ' || resp_person || ' '
         || serial || ' ' || refresh || ' ' || retry || ' ' || expire || ' ' || minimum
         else data end from dns_records where zone = '%zone%' and host = '%record%'}";
};

include "/etc/named.rfc1912.zones";

Saída da minha tabela de banco de dados

    zone    |    host     |  ttl   | type | mx_priority |          data          |     resp_person      | serial | refresh | expire | minimum
------------+-------------+--------+------+-------------+------------------------+----------------------+--------+---------+--------+---------
 my.cloud   | my.cloud.   | 259200 | SOA  |           0 | dns01.my.cloud.        | it.cloud.com.        |      1 |   28800 |  86400 |   28800
 my.cloud   | my.cloud.   | 259200 | NS   |           0 | dns01.my.cloud.        |                      |      0 |       0 |      0 |       0
 my.cloud   | dns01       | 259200 | A    |           0 | 127.0.0.1              |                      |      0 |       0 |      0 |       0
(3 rows)

Aberto a qualquer solução realmente se alguém puder me apontar na direção certa. Eu preferiria usar o MySQL como banco de dados porque tenho 0 experiência usando postgresql ou sqlite.

    
por bwight 01.03.2012 / 21:50

4 respostas

9

Talvez não seja realmente uma resposta para sua pergunta, mas de qualquer forma. (Eu também estava investigando essa questão recentemente, e aqui estão minhas conclusões):

O suporte a DLZ no BIND9 se parece mais com um "patch". Não está bem documentado - nem uma palavra sobre isso no BIND ARM. Parece não ser amplamente usado. O desempenho da consulta é terrível - de acordo com este ponto de referência , o PostgreSQL será 30 vezes (!) mais lento que a operação normal na memória. (o benchmark é antigo, mas não há razão para supor que as coisas melhoraram drasticamente).

Eu não acho que seja uma "solução mais popular".

Outras opções:

O BIND9 suporta atualizações dinâmicas. É bem documentado, amplamente utilizado e é fácil de implementar. Sem penalidade de desempenho - todas as consultas ainda são respondidas da memória . A instalação é mais simples, pois não é necessário um banco de dados. Você executa atualizações programaticamente usando bibliotecas de protocolo DNS (que provavelmente existem para a maioria dos idiomas, eu mesmo uso PHP) ou via linha de comando nsupdate tool. Esta é a solução que eu recomendaria.

Se você realmente deseja banco de dados - o PowerDNS parece ser projetado para ser usado com o back-end do banco de dados. Ele tem recursos que podem ajudar a não sacrificar completamente o desempenho ao usar o banco de dados, como, por exemplo, armazenar em cache as consultas ao banco de dados em vez de consultar o banco de dados a cada vez. Alguns hosts de DNS decentes usam o PowerDNS.

Mais opções exóticas - BIND10 , embora ainda funcionem em andamento, mas os desenvolvedores afirmam que as pessoas realmente o usam na produção. Atualmente, o BIND10 usa o backend SQLITE.

    
por 01.03.2012 / 23:46
5

Para completar, para atender ao requisito original ("atualizar dinamicamente os arquivos de zona sem ter que reiniciar o bind"): edite o (s) arquivo (s) de zona, envie SIGHUP para named. O daemon irá reler os arquivos de zona.

    
por 10.03.2013 / 20:41
2

Está um pouco atrasado, mas eu fiz um tutorial aqui .

O suporte a DLZ é totalmente integrado ao bind9, você só precisa ativá-lo ao executar ./configure .
Não é difícil, na verdade, é bem simples, mas está muito mal documentado.
Meu tutorial muda isso.
Agora, você não deve levar mais de 30 minutos (incluindo tempo de compilação) para colocá-lo em funcionamento.

Infelizmente, não posso copiar o tutorial aqui, é muito grande.

    
por 26.11.2013 / 06:35
1

Instalar & Configure o Bind9 + PostgreSQL - CentOS7

[root@named ~]# yum install -y epel-release
[root@named ~]# yum install -y bind bind-sdb bind-devel postgresql postgresql-server

[root@named ~]# postgresql-setup initdb
[root@named ~]# systemctl start postgresql && systemctl enable postgresql
[root@named ~]# sudo -i -u postgres

$ createuser root --login --superuser --createdb --createrole --encrypted --replication -P -W <br/>

[root@named ~]# createdb bind-db --owner=root

[root@named ~]# psql -d bind-db

bind-db# create table forward_tbl ( name varchar(255) DEFAULT NULL, ttl int DEFAULT '86400', rdtype varchar(90) DEFAULT NULL, rdata varchar(255));
bind-db# create table reverse_tbl ( name varchar(255) DEFAULT NULL, ttl int DEFAULT '86400', rdtype VARCHAR(90) DEFAULT NULL, rdata varchar(255));

[root@named ~]# vim /etc/named.conf <br/> 

zone "maranet.local" {
   type master;
   database "pgsql bind-db forward_tbl 127.0.0.1 root Aa123456";
};

zone "1.168.192.in-addr.arpa" {
       type master;
       database "pgsql bind-db reverse_tbl 127.0.0.1 root Aa123456";
};

[root@named ~]# vim /var/lib/pgsql/data/pg_hba.conf
local   all             all                                  md5
host    all             all             127.0.0.1/32         md5

[root@named ~]# systemctl start postgresql && systemctl enable postgresql
[root@named ~]# systemctl start named-sdb && systemctl enable named-sdb

[root@named ~]# psql -d bind-db
bind-db# INSERT INTO forward_tbl VALUES ('maranet.local','86400','SOA','named.maranet.local. root.maranet.local. 201609100 3600 1800 2419200 86400');
bind-db# INSERT INTO forward_tbl VALUES ('maranet.local','86400','NS','named.maranet.local.');
bind-db# INSERT INTO forward_tbl VALUES ('named.maranet.local','86400','A','192.168.1.1');
bind-db# INSERT INTO forward_tbl VALUES ('nginx.maranet.local','86400','A','192.168.1.2');
bind-db# INSERT INTO forward_tbl VALUES ('PC1.maranet.local','86400','A','192.168.1.10');
bind-db# INSERT INTO forward_tbl VALUES ('PC2.maranet.local','86400','A','192.168.1.11');

bind-db# INSERT INTO reverse_tbl VALUES ('1.168.192.in-addr.arpa','86400','SOA','named.maranet.local. root.maranet.local. 201609100 3600 1800 2419200 86400');
bind-db# INSERT INTO reverse_tbl VALUES ('1.168.192.in-addr.arpa','86400','NS','named.maranet.local.');
bind-db# INSERT INTO reverse_tbl VALUES ('1.1.168.192.in-addr.arpa','86400','PTR','named.maranet.local.');
bind-db# INSERT INTO reverse_tbl VALUES ('2.1.168.192.in-addr.arpa','86400','PTR','nginx.maranet.local.');
bind-db# INSERT INTO reverse_tbl VALUES ('10.1.168.192.in-addr.arpa','86400','PTR','PC1.maranet.local.');
bind-db# INSERT INTO reverse_tbl VALUES ('11.1.168.192.in-addr.arpa','86400','PTR','PC2.maranet.local.');
    
por 04.07.2017 / 20:40