Назад | Перейти на главную страницу

Делегирование зоны in-addr.arpa в Bind 9 и Samba 4 в качестве AD DC с DDNS

Окружающая среда и цели

В моей тестовой лаборатории KVM есть виртуальная сеть 172.16.50/24, в этой сети у меня есть 2 виртуальные машины Centos 7, на которых работают DHCP-серверы Bind 9 и ISC:

Все клиенты в сети - это виртуальные машины Linux, и все они получают сетевую конфигурацию от DHCP-сервера. Этот сервер динамически обновляет зоны DNS.

Bind 9 - авторитетный сервер для wsvirt.home зона.

В лабораторных условиях я тестирую сценарий, который мне нужно реализовать в сети нашего офиса. В бизнес-среде я должен создать домен AD для обслуживания клиентов Windows, и для этой цели мы решили использовать Samba 4 в качестве контроллера домена. Я построил сервер Samba для Centos 7 с поддержкой Heimdal Kerberos из исходников.

Для AD выделил подсеть 172.16.50.192/26 и назначил ad.wsvirt.home домен.

AD DC - это виртуальная машина Centos 7, на которой работают DHCP-серверы Samba 4, Bind 9 и ISC. Samba использует BIND_DLZ как серверную часть DNS. Контроллер AD имеет addc1.ad.wsvirt.home доменное имя и IP 172.16.50.193.

Все клиенты Windows AD получают IP от DHCP-сервера, работающего на AD DC, который динамически обновляет зоны Bind DLZ.

В реальной рабочей физической среде все клиентские ПК из обеих сетей должны быть подключены к одному широковещательному домену.

Для выполнения требований делегировал полномочия нападающему. ad.wsvirt.home и наоборот 172.16.50.192/26 Зоны DNS из Привязки на controller.wsvirt.home сервер к контроллеру AD addc1.ad.wsvirt.home соответственно RFC 2317.


Проблема

Все работает отлично, кроме одного. Когда я тестирую обратный поиск для делегированной обратной зоны через AD DC, результат выглядит нормально, поэтому клиент Windows AD может разрешить все обратные доменные имена в обоих доменах. :

$ dig -x 172.16.50.193 @addc1.ad.wsvirt.home

; <<>> DiG 9.11.4-P2-RedHat-9.11.4-9.P2.el7 <<>> -x 172.16.50.193 @addc1.ad.wsvirt.home
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 43507
;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;193.50.16.172.in-addr.arpa.    IN      PTR

;; ANSWER SECTION:
193.50.16.172.in-addr.arpa. 86400 IN    CNAME   193.50.16.172.ddns.
193.50.16.172.ddns.     900     IN      PTR     addc1.ad.wsvirt.home.

;; Query time: 7 msec
;; SERVER: 172.16.50.193#53(172.16.50.193)
;; WHEN: Mon Mar 30 21:05:12 IDT 2020
;; MSG SIZE  rcvd: 121


Но когда я перенаправляю свои запросы на DNS-сервер controller.wsvirt.home он не разрешает обратное имя из ad.wsvirt.home домен, следовательно, клиенты Linux также не могли найти обратное имя:

$ dig -x 172.16.50.193 @controller.wsvirt.home

; <<>> DiG 9.11.4-P2-RedHat-9.11.4-9.P2.el7 <<>> -x 172.16.50.193 @controller.wsvirt.home
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 48825
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;193.50.16.172.in-addr.arpa.    IN      PTR

;; ANSWER SECTION:
193.50.16.172.in-addr.arpa. 86400 IN    CNAME   193.50.16.172.ddns.

;; AUTHORITY SECTION:
.                       8133    IN      SOA     a.root-servers.net. nstld.verisign-grs.com. 2020033001 1800 900 604800 86400

;; Query time: 0 msec
;; SERVER: 172.16.50.2#53(172.16.50.2)
;; WHEN: Mon Mar 30 21:49:41 IDT 2020
;; MSG SIZE  rcvd: 162


я нуждаюсь Клиенты Linux из wsvirt.home домен, чтобы иметь возможность разрешать обратные доменные имена в ad.wsvirt.home домен. Это вообще возможно?


Конфигурации

Чтобы быть более точным, я помещаю сюда свои файлы конфигурации для обоих серверов

Контроллер сервера.wsvirt.home

/etc/ named.conf

acl local { 172.16.50.0/24; 127.0.0.1; };

include "/etc/named.rfc1912.zones";
include "/etc/named.root.key";
include "/etc/rndc.key";

server 172.16.50.3 {
        keys { "rndc-key"; };
};

...

options {
        listen-on port 53 { local; };
        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";
        recursing-file  "/var/named/data/named.recursing";
        secroots-file   "/var/named/data/named.secroots";
        allow-query     { local; };
        allow-transfer { none; };
        notify no; 
        forwarders { 8.8.8.8; 8.8.4.4; };
        forward only;
        recursion yes;
        dnssec-enable yes;
        dnssec-validation yes;
        bindkeys-file "/etc/named.iscdlv.key";
        managed-keys-directory "/var/named/dynamic";
        pid-file "/run/named/named.pid";
        session-keyfile "/run/named/session.key";
};


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

zone "wsvirt.home" IN {
        type master;
        file "wsvirt.home.db";
        allow-update { key "rndc-key"; };
        allow-transfer { key "rndc-key"; };
        notify yes;
        forwarders {};
};

zone "50.16.172.in-addr.arpa" IN {
        type master;
        file "50.16.172.db";
        allow-update { key "rndc-key"; };
        allow-transfer { key "rndc-key"; };
        notify yes;
};


/var/ named/50.16.172.db

$ORIGIN .
$TTL 86400      ; 1 day
50.16.172.in-addr.arpa  IN SOA  controller.wsvirt.home. root.wsvirt.home. (
                                153        ; serial
                                3600       ; refresh (1 hour)
                                1800       ; retry (30 minutes)
                                604800     ; expire (1 week)
                                86400      ; minimum (1 day)
                                )
                        NS      controller.wsvirt.home.
                        NS      controller2.wsvirt.home.
$ORIGIN 50.16.172.in-addr.arpa.
2                       PTR     controller.wsvirt.home.
$TTL 86400      ; 1 day
3                       PTR     controller2.wsvirt.home.
...
;
50.16.172.ddns.         IN      NS      addc1.ad.wsvirt.home.
$GENERATE 193-254 $     IN      CNAME   $.50.16.172.ddns.


/etc/dhcp/dhcpd.conf

include "/etc/rndc.key";

default-lease-time 600;
max-lease-time 7200;
authoritative;
ddns-update-style interim;

class "windows" {  
        match if substring (option vendor-class-identifier, 0, 8) = "MSFT 5.0";
}

subnet 172.16.50.0 netmask 255.255.255.0 {
        log (info, concat("Vendor Class ID (60): ", option vendor-class-identifier));
        log (info, concat("DHCP Client ID (61): ", option dhcp-client-identifier));
        log (info, concat("User Class ID (77): ", option user-class));
        option domain-name-servers 172.16.50.2, 172.16.50.3;
        option ntp-servers 172.16.50.2;
        option routers 172.16.50.1;
        option broadcast-address 172.16.50.255;
        default-lease-time 600;
        max-lease-time 7200;
        option ip-forwarding off;
        ignore client-updates;
        option domain-name "wsvirt.home";
        option domain-search "wsvirt.home";
        option netbios-scope "";
        option netbios-node-type 8;
        option netbios-name-servers 172.16.50.2;
        option netbios-dd-server 172.16.50.2;
        ddns-updates on;
        ddns-domainname "wsvirt.home.";
        ddns-rev-domainname "in-addr.arpa.";

        pool {  
                range 172.16.50.21 172.16.50.190;
                deny members of "windows";
        }

        zone wsvirt.home {
                primary 172.16.50.2;
                key "rndc-key";
        }

        zone 50.16.172.in-addr.arpa {
                primary 172.16.50.2;
                key "rndc-key";
        }
}


AD DC addc1.ad.wsvirt.home

/etc/ named.conf

options {
    listen-on port 53 { any; };
    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";
    recursing-file  "/var/named/data/named.recursing";
    secroots-file   "/var/named/data/named.secroots";
    allow-query     { any; };
    forwarders  { 172.16.50.2; 172.16.50.3; };
    forward only;
    recursion yes;
    dnssec-enable no;
    dnssec-validation no;
    bindkeys-file "/etc/named.root.key";
    managed-keys-directory "/var/named/dynamic";
    pid-file "/run/named/named.pid";
    session-keyfile "/run/named/session.key";
    tkey-gssapi-keytab "/var/lib/samba/private/dns.keytab";
    minimal-responses yes;
};

...

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

include "/etc/rndc.key";
include "/etc/named.rfc1912.zones";
include "/etc/named.root.key";
include "/var/lib/samba/bind-dns/named.conf";


/etc/dhcp/dhcpd.conf

include "/etc/rndc.key";

default-lease-time 600;
max-lease-time 7200;
min-secs 5;
authoritative;
ddns-update-style none;

class "others" {
    match if substring (option vendor-class-identifier, 0, 8) != "MSFT 5.0";
}

subnet 172.16.50.192 netmask 255.255.255.192 {
    log (info, concat("Vendor Class ID (60): ", option vendor-class-identifier));
    log (info, concat("DHCP Client ID (61): ", option dhcp-client-identifier));
    log (info, concat("User Class ID (77): ", option user-class));
    option routers 172.16.50.1;
    option broadcast-address 172.16.50.255;
    default-lease-time 600;
    max-lease-time 7200;
    option ip-forwarding off;
    ignore client-updates;
    option ntp-servers 172.16.50.193;
    option domain-name-servers 172.16.50.193;
    option domain-name "ad.wsvirt.home";
    option domain-search "ad.wsvirt.home";
    option netbios-name-servers 172.16.50.193;
    option netbios-dd-server 172.16.50.193;
    option netbios-scope "";
    option netbios-node-type 8;
    ddns-rev-domainname "ddns";

    pool {
        range 172.16.50.210 172.16.50.254;
        deny members of "others";
    }
}

on commit {
    set noname = concat("dhcp-", binary-to-ascii(10, 8, "-", leased-address));
    set ClientIP = binary-to-ascii(10, 8, ".", leased-address);
    set ClientDHCID = concat (
    suffix (concat ("0", binary-to-ascii (16, 8, "", substring(hardware,1,1))),2), ":",
    suffix (concat ("0", binary-to-ascii (16, 8, "", substring(hardware,2,1))),2), ":",
    suffix (concat ("0", binary-to-ascii (16, 8, "", substring(hardware,3,1))),2), ":",
    suffix (concat ("0", binary-to-ascii (16, 8, "", substring(hardware,4,1))),2), ":",
    suffix (concat ("0", binary-to-ascii (16, 8, "", substring(hardware,5,1))),2), ":",
    suffix (concat ("0", binary-to-ascii (16, 8, "", substring(hardware,6,1))),2)
    );
    set ClientName = pick-first-value(option host-name, config-option-host-name, client-name, noname);
    log(concat("Commit: IP: ", ClientIP, " DHCID: ", ClientDHCID, " Name: ", ClientName));
    execute("/usr/local/sbin/dhcp-dyndns.sh", "add", ClientIP, ClientDHCID, ClientName);
}

on release {  
    set ClientIP = binary-to-ascii(10, 8, ".", leased-address);
    set ClientDHCID = concat (
    suffix (concat ("0", binary-to-ascii (16, 8, "", substring(hardware,1,1))),2), ":",
    suffix (concat ("0", binary-to-ascii (16, 8, "", substring(hardware,2,1))),2), ":",
    suffix (concat ("0", binary-to-ascii (16, 8, "", substring(hardware,3,1))),2), ":",
    suffix (concat ("0", binary-to-ascii (16, 8, "", substring(hardware,4,1))),2), ":",
    suffix (concat ("0", binary-to-ascii (16, 8, "", substring(hardware,5,1))),2), ":",
    suffix (concat ("0", binary-to-ascii (16, 8, "", substring(hardware,6,1))),2)
    );
    log(concat("Release: IP: ", ClientIP));
    execute("/usr/local/sbin/dhcp-dyndns.sh", "delete", ClientIP, ClientDHCID);
}

on expiry {   
    set ClientIP = binary-to-ascii(10, 8, ".", leased-address);
    log(concat("Expired: IP: ", ClientIP));
    execute("/usr/local/sbin/dhcp-dyndns.sh", "delete", ClientIP, "", "0");
}


DLZ меняет зону 50.16.172.ddns на AD DC

$ samba-tool dns query localhost 50.16.172.ddns @ ALL 
Password for [administrator@AD.WSVIRT.HOME]:
  Name=, Records=2, Children=0
    SOA: serial=3, refresh=900, retry=600, expire=86400, minttl=3600, ns=addc1.ad.wsvirt.home., email=hostmaster.ad.wsvirt.home. (flags=600000f0, serial=3, ttl=3600)
    NS: addc1.ad.wsvirt.home. (flags=600000f0, serial=1, ttl=3600)
  Name=193, Records=1, Children=0
    PTR: addc1.ad.wsvirt.home (flags=f0, serial=3, ttl=900)
  Name=230, Records=1, Children=0
    PTR: winxp-1.ad.wsvirt.home (flags=f0, serial=3, ttl=3600)

Это нормально не получить PTR на тот же ответ, что и controller.wsvirt.home. не авторитетный сервер имен для обеих зон. В flags: aa заявляет, что это авторитетный ответ, но это неверно для 193.50.16.172.ddns. IN PTR. Следовательно, он не может быть отправлен на этот авторитетный ответ.

На самом деле это не проблема, потому что это вызывает только другой запрос для 193.50.16.172.ddns. IN PTR, на который затем можно было бы ответить рекурсивно. Клиенты должны знать, что это делается автоматически в случае CNAME ответ.

Что касается этого, есть другая проблема, как только addc1.ad.wsvirt.home. есть зона 50.16.172.ddns.; вы бы получили NXDOMAIN ответ на:

dig 193.50.16.172.ddns. PTR @controller.wsvirt.home

В controller.wsvirt.home. настроен как рекурсивный (recursion yes;), но не знает, что эти адреса можно найти на addc1.ad.wsvirt.home.. Поэтому он пытается разрешить их, как и все остальное: от forwarders { 8.8.8.8; 8.8.4.4; };... и терпит неудачу.

Вы можете добавить addc1.ad.wsvirt.home. в качестве экспедитора для 50.16.172.ddns. на controller.wsvirt.home.:

zone "50.16.172.ddns." { 
    type forward; 
    forwarders { 172.16.50.193; }; 
};

Наконец, зона для $ORIGIN 50.16.172.in-addr.arpa. мог делегировать управление только для своих собственных поддоменов, а не для совершенно несвязанных 50.16.172.ddns..

Если вы действительно хотите отправить PTR в том же ответе вам необходимо сделать этот домен авторитетным для 50.16.172.ddns. добавив slave зона (вместо forward зона), например

zone "50.16.172.ddns." { 
    type slave;
    file "50.16.172.ddns.db";
    masters { 172.16.50.193; }; 
};

Основной сервер (addc1.ad.wsvirt.home.) необходимо знать об этом и разрешить перенос зон из controller.wsvirt.home.controller2.wsvirt.home, если он должен действовать аналогично):

options {
    . . .
    allow-transfer { 172.16.50.2; 172.16.50.3; };
}

Наконец-то я обнаружил корень проблемы. Дело в том, что Bind 9 удаляет подписи DNSSEC, когда работает как сервер пересылки. Я знал это, поэтому в named.conf на сервере addc1.ad.wsvirt.home В качестве обходного пути я установил следующие параметры:

dnssec-enable no; 
dnssec-validation no;


Но я забыл сделать то же самое в controller.wsvirt.home, теперь я исправил свою оплошность, и все работает хорошо. И, очевидно, раздел зоны для 50.16.172.ddns должен быть в файле конфигурации Bind по адресу addc1.ad.wsvirt.home сервер:

zone "50.16.172.ddns." { 
    type forward; 
    forwarders { 172.16.50.193; }; 
};

По предложению Эсы Йокинена я сделал следующее:

На controller.wsvirt.home в /etc/named.conf Я создал раздел зоны для 50.16.172.ddns.

zone "50.16.172.ddns." { 
    type slave;
    file "slaves/50.16.172.ddns.db";
    masters { 172.16.50.193; }; 
};

В файле зоны /var/named/50.16.172.db Я закомментировал строки, делегирующие 50.16.172.ddns зона:

;50.16.172.ddns.                IN      NS      addc1.ad.wsvirt.home.
;$GENERATE 193-254 $    IN      CNAME   $.50.16.172.ddns.

На addc1.ad.wsvirt.home. в /etc/named.conf:

options {
    . . .
    allow-transfer { 172.16.50.2; 172.16.50.3; };
}


В результате у меня есть полномочия на зону 50.16.172.ddns но имена реверсов вообще не разрешены:

dig -x 172.16.50.193 @addc1.ad.wsvirt.home

; <<>> DiG 9.11.4-P2-RedHat-9.11.4-9.P2.el7 <<>> -x 172.16.50.193 @addc1.ad.wsvirt.home
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 30147
;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;193.50.16.172.in-addr.arpa.    IN      PTR

;; AUTHORITY SECTION:
50.16.172.in-addr.arpa. 10800   IN      SOA     controller.wsvirt.home. root.wsvirt.home. 154 3600 1800 604800 86400

;; Query time: 5 msec
;; SERVER: 172.16.50.193#53(172.16.50.193)
;; WHEN: Wed Apr 01 17:20:44 IDT 2020
;; MSG SIZE  rcvd: 118


$ dig -x 172.16.50.193 

; <<>> DiG 9.11.4-P2-RedHat-9.11.4-9.P2.el7 <<>> -x 172.16.50.193
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 62725
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;193.50.16.172.in-addr.arpa.    IN      PTR

;; AUTHORITY SECTION:
50.16.172.in-addr.arpa. 86400   IN      SOA     controller.wsvirt.home. root.wsvirt.home. 154 3600 1800 604800 86400

;; Query time: 0 msec
;; SERVER: 172.16.50.2#53(172.16.50.2)
;; WHEN: Wed Apr 01 17:20:56 IDT 2020
;; MSG SIZE  rcvd: 118

Если вы собираетесь использовать МОЙ сценарий, используйте его правильно ;-)

Запустите Bind9 и isc-dhcp на DC, больше нигде. Посмотреть здесь:

https://wiki.samba.org/index.php/Setting_up_a_BIND_DNS_Server

https://wiki.samba.org/index.php/Configure_DHCP_to_update_DNS_records_with_BIND9

Одна из ваших основных проблем заключается в том, что вы пытаетесь сохранить обратную зону в «плоском файле», а bind9_dlz не работает с плоскими файлами.