在 OS X 上快速傳播內部 DNS 更改
今天早上,我們發現(由於轉換)我們的一個重要服務的 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 dns
和sudo 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,它將快速重新啟動。