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

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 伺服器...但是客戶端將該回應解釋為“網域不存在”,而不是可以透過嘗試下一個伺服器來修復的錯誤。

答案1

感謝 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 包,因此希望它的設定和使用非常簡單。

答案2

為什麼不直接在主機檔案中新增一個條目並省去所有麻煩呢?

答案3

您可能想更詳細地了解您正在嘗試做什麼——這沒有多大意義。我的建議是不要調整 DNS 基礎知識——你會破壞一些正常工作的東西。

主要和輔助 DNS 伺服器位於您的網路配置中以確保可用性。如果 DNS 伺服器無法提供答案,客戶端就不會存取輔助伺服器——發明 DNS 的人們實現了「遞歸」的概念來解決該問題。

如果您使用的是 Mac,您可能會發現使用 Bonjour/mDNS 是更有效率的途徑。

答案4

嘗試使用unbound反而。

雖然它主要是一個遞歸伺服器,但我相信它有能力提供您需要的通配符覆蓋,並將其他所有內容轉發到目前的自動從 學習的上游 DNS 伺服器/etc/resolv.conf

相關內容