Domain-Name-System

在 OS X 上快速傳播內部 DNS 更改

  • March 3, 2010

今天早上,我們發現(由於轉換)我們的一個重要服務的 DNS 記錄是錯誤的。它在我們的主 DNS 伺服器上已更改,但輔助站點的客戶端看不到更改。(我們的網路幾乎完全使用 OS X 10.5 伺服器和 OS X 10.5 客戶端執行)。

讓我命名一些機器作為範例:

  • primary = 主 DNS 伺服器
  • 輔助 = 輔助 DNS 伺服器
  • 客戶端 = 輔助站點的客戶端
  • service.ourdomain.com = DNS 記錄已更改的服務

在客戶端上(通過輔助進行 DNS 查找),當探測事物的配置方式時,我得到:

nslookup service.ourdomain.com
** server can't find service.ourdomain.com: NXDOMAIN

nslookup service.ourdomain.com secondary
** server can't find service.ourdomain.com: NXDOMAIN

nslookup service.ourdomain.com primary
(returns appropriate information about how to contact the service)

當我 ssh 進入

  • 次要的,它通過主要的 DNS 查找
  • 或主本身,它從自身進行 DNS 查找

我得到:

nslookup service.ourdomain.com
(returns appropriate information about how to contact the service)

nslookup service.ourdomain.com secondary
** server can't find service.ourdomain.com: NXDOMAIN

nslookup service.ourdomain.com primary
(returns appropriate information about how to contact the service)

我很困惑。Secondary 似乎知道服務在哪裡,但在查詢時不返回值。(當然,DNS 條目可以是完全獨立的,也可以是在查詢域名時返回的內容,但仍然——它看起來應該知道!)

我嘗試在輔助伺服器和客戶端刷新 DNS。( dscacheutil -flushcache)。我還在輔助伺服器上停止並重新啟動了 DNS。(sudo serveradmin stop dnssudo serveradmin start dns)

在我們的主站點上,我的同事重新啟動了主站點和那裡的客戶端,以獲取正確解析的名稱。不幸的是,我們有 14 個輔助站點,如果可能的話,我寧願在白天不重新啟動共享文件的伺服器,但如果它解決了問題,我會這樣做。


根據請求:

host -C ourdomain.com   # [with names substituted]:
ourdomain.com SOA record primary.ourdomain.com. admin.ourdomain.com. 2009121410 21600 3600 604800 345600

$$ I have no idea what admin.ourdomain.com is – I don’t believe we have a box by that name; I sure can’t ping it. The primary DNS server shows up right, though. $$


同樣根據請求,以下是dig service.ourdomain.com @secondary(帶有名稱替換)的輸出:

; <<>> DiG 9.4.3-P1 <<>> service.ourdomain.com @secondary
;; global options:  printcmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 19207
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 0

;; QUESTION SECTION:
;service.ourdomain.com. IN  A

;; AUTHORITY SECTION:
ourdomain.com.      10800   IN  SOA primary.ourdomain.com. admin.ourdomain.com. 2009121409 21600 3600 604800 345600

;; Query time: 3 msec
;; SERVER: [IP of secondary]#53([IP of secondary])
;; WHEN: Mon Dec 14 10:34:11 2009
;; MSG SIZE  rcvd: 88

和輸出dig service.ourdomain.com @primary

; <<>> DiG 9.4.3-P1 <<>> service.ourdomain.com @primary
;; global options:  printcmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 47885
;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 1
;; WARNING: recursion requested but not available

;; QUESTION SECTION:
;service.ourdomain.com. IN  A

;; ANSWER SECTION:
service.ourdomain.com. 10800    IN  A   [IP of service]

;; AUTHORITY SECTION:
ourdomain.com.      10800   IN  NS  primary.ourdomain.com.

;; ADDITIONAL SECTION:
primary.ourdomain.com.  10800   IN  A   [IP of primary]

;; Query time: 8 msec
;; SERVER: [IP of primary]#53([IP of primary])
;; WHEN: Mon Dec 14 10:34:18 2009
;; MSG SIZE  rcvd: 92

最顯著的區別是次要沒有回答,而主要說,“;; 警告:遞歸請求但不可用”。

您可以使用rndc實用程序手動強制進行區域傳輸。在所有輔助 DNS 伺服器上執行此命令:

rndc -p 54 retransfer mydomain.example.com IN com.apple.ServerAdmin.DNS.public

您還可以使用此實用程序重新載入配置,而無需重新啟動named

rndc -p 54 reload

在不知道您的配置的情況下,我猜這是記憶體問題或 DNS 傳播問題。

在不知道您正在使用的域的情況下,我無法從這裡真正對其進行測試。我個人不明白為什麼人們會忽略這類相關資訊,但他們經常這樣做。

  • 試試“host -C yourdomain.com”,告訴我你看到了什麼。如果您看到具有不同序列號的不同 SOA 記錄,那麼您需要修復您的 DNS 傳播。如果該區域的 NS 記錄中未列出輔助節點,則在執行 BIND 時添加“也通知”行。
  • 嘗試更改主伺服器上的序列號以確保它已正確更改,並測試傳播。
  • 嘗試設置一個更小的負記憶體時間,比如 600(10 分鐘)左右。這是 SOA 記錄中的值之一。
  • 嘗試“dig hostname.yourdomain.com @secondaryserver”並查看它返回的內容。在初級上做同樣的事情。如果它們不同,那就是破碎。
  • 如果這些返回錯誤數據的站點中的每一個都有大量記憶體時間,那麼您應該能夠通過 ssh 連接到它們並簡單地重新啟動名稱伺服器,而不是完全重新啟動每個站點。如果正在使用 BIND,它將快速重新啟動。

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