Domain-Name-System

BIND/Named:禁用遞歸,客戶端使用替代伺服器

  • July 13, 2009

我正在設置一個簡單的 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 包,因此希望它的設置和使用非常簡單。

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