我正在設定一個簡單的 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
。