Active-Directory

Bind 9 和 Samba 4 中的 in-addr.arpa 區域委託作為具有 DDNS 的 AD DC

  • April 4, 2020

環境和目標

在我的測試 KVM 實驗室中,我有一個虛擬網路172.16.50/24,在這個網路中,我有 2 個執行 Bind 9 和 ISC DHCP 伺服器的 Centos 7 VM:

  • DNS主:controller.wsvirt.home (172.16.50.2)
  • 從屬 DNS:controller2.wsvirt.home (172.16.50.3)

網路中的所有客戶端都是 Linux VM,它們都從 DHCP 伺服器獲取網路配置。此伺服器動態更新 DNS 區域。

Bind 9 是wsvirt.homezone 的權威伺服器。

在實驗室環境中,我測試了一個必須在我們的商務辦公網路中實現的場景。在業務環境中,我應該創建一個 AD 域來為 Windows 客戶端提供服務,為此我們決定使用 Samba 4 作為 DC。我已經為 Centos 7 建構了一個 Samba 伺服器,並從原始碼中獲得了 Heimdal Kerberos 支持。

對於 AD,我分配了子網172.16.50.192/26和分配的ad.wsvirt.home域。

AD DC 是一個執行 Samba 4、Bind 9 和 ISC DHCP 伺服器的 Centos 7 VM。Samba 使用 BIND_DLZ 作為 DNS 後端。AD 控制器具有addc1.ad.wsvirt.home域名和IP 172.16.50.193.

所有 Windows AD 客戶端從動態更新綁定 DLZ 區域的 AD DC 上執行的 DHCP 伺服器獲取 IP。

在真實的工作物理環境中,來自兩個網路的所有客戶端 PC 都應該連接到一個廣播域。

為了滿足要求,我將伺服器上的 Bind 中的正向ad.wsvirt.home和反向DNS 區域授權相應地授予AD 控制器172.16.50.192/26``controller.wsvirt.home``addc1.ad.wsvirt.home

$$ RFC 2317 $$$$ 1 $$.

# 問題 # 除了一件事,一切都完美無缺。當我在 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

我需要來自 wsvirt.home 域的 Linux 客戶端能夠解析 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 天 50.16.172.in-addr.arpa 在 SOA 控制器.wsvirt.home。root.wsvirt.home。(153;串列 3600;刷新(1 小時)1800;重試(30 分鐘)604800;過期(1 週)86400;最少(1 天))NS controller.wsvirt.home。NS 控制器 2.wsvirt.home。
$ ORIGIN 50.16.172.in-addr.arpa.
2 PTR controller.wsvirt.home.
$ TTL 86400 ; 1 天 3 PTR controller2.wsvirt.home。... ; 50.16.172.ddns。在 NS addc1.ad.wsvirt.home。
$ GENERATE 193-254  $  在 CNAME $.50.16.172.ddns。```
  

### /etc/dhcp/dhcpd.conf ### ``` 包括“/etc/rndc.key”;
預設租賃時間 600;最大租賃時間 7200;權威性; ddns-update-style 過渡;


class "windows" {   

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


子網 172.16.50.0 網路遮罩 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)); 選項域名伺服器 172.16.50.2、172.16.50.3;選項 ntp-servers 172.16.50.2;選項路由器 172.16.50.1;選項廣播地址 172.16.50.255;預設租賃時間 600;最大租賃時間 7200;選項 ip-forwarding off; 忽略客戶端更新;選項域名“wsvirt.home”;選項域搜尋“wsvirt.home”;選項 netbios 範圍“”;選項 netbios-node-type 8; 選項 netbios-name-servers 172.16.50.2;選項 netbios-dd-server 172.16.50.2;ddns 更新;ddns-域名 "wsvirt.home."; ddns-rev-域名"

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”; }


}

<br />

AD DC addc1.ad.wsvirt.home

/etc/named.conf


選項 { 監聽埠 53 { 任何;}; 監聽 v6 埠 53 { ::1; }; 目錄“/var/named”;轉儲文件“/var/named/data/cache_dump.db”;統計文件“/var/named/data/named_stats.txt”;memstatistics-file "/var/named/data/named_mem_stats.txt"; 遞歸文件“/var/named/data/named.recursing”;secroots-file "/var/named/data/named.secroots"; 允許查詢{任何;}; 轉發器 { 172.16.50.2; 172.16.50.3;}; 僅轉發;遞歸是的;dnssec-啟用否;dnssec-驗證號;bindkeys-file "/etc/named.root.key"; 託管鍵目錄“/var/named/dynamic”;pid-file "/run/named/named.pid"; session-keyfile "/run/named/session.key"; tkey-gssapi-keytab "/var/lib/samba/private/dns.keytab"; 最小響應是的;};


...


區“。” IN {類型提示;文件“named.ca”;};


包括“/etc/rndc.key”;包括“/etc/named.rfc1912.zones”;包括“/etc/named.root.key”;包括“/var/lib/samba/bind-dns/named.conf”;

<br />

/etc/dhcp/dhcpd.conf


包括“/etc/rndc.key”;


預設租賃時間 600;最大租賃時間 7200;分秒 5;權威性; ddns-update-style 無;


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


子網 172.16.50.192 網路遮罩 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)); 選項路由器 172.16.50.1;選項廣播地址 172.16.50.255;預設租賃時間 600;最大租賃時間 7200;選項 ip-forwarding off; 忽略客戶端更新;選項 ntp-servers 172.16.50.193;選項域名伺服器 172.16.50.193;選項域名“ad.wsvirt.home”;選項域搜尋“ad.wsvirt.home”;選項 netbios-name-servers 172.16.50.193;選項 netbios-dd-server 172.16.50.193;選項 netbios 範圍“”;選項 netbios-node-type 8; ddns-rev-域名“ddns”;

pool { range 172.16.50.210 172.16.50.254; deny members of “others”; }


}


送出時 { set noname = concat("dhcp-", binary-to-ascii(10, 8, "-", leased-address)); 設置 ClientIP = binary-to-ascii(10, 8, ".", 租用地址); 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), ":", 後綴 (concat ("0", binary-to-ascii (16, 8, "", substring(hardware,4,1 ))),2), ":", 後綴 (concat ("0", binary-to-ascii (16, 8, "", substring(hardware,5,1))),2), ":",後綴 (concat ("0", binary-to-ascii (16, 8, "", 子字元串(硬體,6,1))),2));設置客戶端名稱 = 選擇第一個值(選項主機名、配置選項主機名、客戶端名稱、無名);log(concat("Commit: IP: ", ClientIP, " DHCID: ", ClientDHCID, " Name: ", ClientName)); 執行("/usr/local/sbin/dhcp-dyndns.sh", "add", ClientIP, ClientDHCID, ClientName); }


發佈時 {  

設置 ClientIP = binary-to-ascii(10, 8, ".", 租用地址); 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), ":", 後綴 (concat ("0", binary-to-ascii (16, 8, "", substring(hardware,4,1 ))),2), ":", 後綴 (concat ("0", binary-to-ascii (16, 8, "", substring(hardware,5,1))),2), ":",後綴(concat ("0", binary-to-ascii (16, 8, "", substring(hardware,6,1))),2) );log(concat("發布:IP:", ClientIP)); 執行(“/usr/local/sbin/dhcp-dyndns.sh”,“刪除”,ClientIP,ClientDHCID);}


到期時 {  

設置 ClientIP = binary-to-ascii(10, 8, ".", 租用地址); log(concat("過期:IP:", ClientIP)); 執行(“/usr/local/sbin/dhcp-dyndns.sh”,“刪除”,客戶端IP,“”,“0”);}

<br />

A DLZ revers zone 50.16.172.ddns on the AD DC


$ samba-tool dns 查詢 localhost 50.16.172.ddns @ALL 密碼

$$ administrator@AD.WSVIRT.HOME $$:名稱=,記錄=2,子項=0 SOA:序列=3,刷新=900,重試=600,過期=86400,minttl=3600,ns=addc1.ad.wsvirt.home.,電子郵件=hostmaster.ad。 wsvirt.home。(標誌=600000f0,序列=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.zone 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; };
}

如果您要使用 MY 腳本,請正確使用它;-)

在 DC 上執行 Bind9 和 isc-dhcp,別無他法。看這裡:

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 不適用於平面文件。

引用自:https://serverfault.com/questions/1010273