Domain-Name-System
BIND/Named:禁用遞歸,客戶端使用替代伺服器
我正在設置一個簡單的 DNS 伺服器(BIND/Named),它在 OSX 筆記型電腦上本地執行。
其目的是將“*.laptop.example.com”的所有請求解析為“192.168.2.2”——這是手動分配的虛擬網路介面的 IP 地址(不是 DHCP)。
我正在使用虛擬網路介面(由 Parallels 提供)來確保 IP 地址始終保持不變(eth0 在連接到不同網路時將更改其 IP 地址),並確保它始終可用(eth0 已禁用/不可用未插入網路電纜時)。
我一直在使用以下設置:
options { ... forwarders { 192.168.1.1; }; forward only; };
但是,這需要每次筆記型電腦更改網路時更新配置(因為大多數網路使用不同的 DNS 地址)。
我想放棄這個要求,這樣如果 BIND/Named 不能辨識域名(即它不是“laptop.example.com”的子域),那麼它會返回一個錯誤,以便筆記型電腦可以嘗試第二個它記錄在案的 DNS 地址(從 DHCP 獲取的地址)。
一種可能性是使用:
options { ... forwarders { }; forward only; recursion no; };
這確實阻止了它花費 3 多秒來查詢 ROOT 伺服器……但是客戶端將該響應解釋為“域不存在”,而不是可以通過嘗試下一個伺服器來修復的錯誤。
感謝 Alnitak、duffbeer703、John Gardeniers,所有回饋都非常好。
我針對我的問題使用的解決方案是使用launchd 來檢測/etc/resolv.conf 中的更改,然後更新轉發器列表。
通過創建文件:
/Library/LaunchDaemons/myname.update.plist
與內容:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>Disabled</key> <false/> <key>Label</key> <string>myname.update</string> <key>ProgramArguments</key> <array> <string>[PATH]/update.sh</string> </array> <key>WatchPaths</key> <array> <string>/var/run/resolv.conf</string> </array> </dict> </plist>
並載入:
launchctl load /Library/LaunchDaemons/myname.update.plist launchctl start myname.update
一個腳本在:
[PATH]/update.sh
可以執行類似:
DST="/var/named/forwarders.conf"; echo "forwarders {" > $DST cat /etc/resolv.conf | \ grep -v -E "(127.0.0.1|localhost)" | \ awk '{ sub("^nameserver ", "\t"); sub("$", ";"); print }' >> $DST echo "};" >> $DST
然後在命名配置中,它可以使用它:
options { directory "[PATH]/conf/"; listen-on { 127.0.0.1; [IP_ADDRESS_HOST]; }; include "/var/named/forwarders.conf"; forward only; };
如果您想查看或使用完整的實現,請轉到我的 BIND 設置頁面並使用下載表單…它會創建一個帶有單個安裝腳本的 ZIP 包,因此希望它的設置和使用非常簡單。