現在我在 dnsmasq.conf 中有以下行,它可以很好地處理所有請求(/#/
匹配任何網域;這是必需的):
address=/#/127.0.0.1
然而,有一些域需要解析為127.0.0.1
.
作為臨時解決方案,它們已添加到/etc/hosts
:
209.85.148.95 ajax.googleapis.com
207.97.227.245 underscorejs.org
72.21.194.31 s3.amazonaws.com
不幸的是,這是一個非常臨時的解決方案:一旦任何目標網域的 IP 位址發生變化,它就會停止運作。
我的問題是:如何強制 dnsmasq 使用上游 dns 伺服器來解析某些(指定)網域的 IP 位址?
答案1
您可以使用server=
指令來做到這一點,例如
server=/ajax.googleapis.com/8.8.8.8
會查詢 google 公共 DNS 伺服器的 ajax.googleapis.com 網域,類似地
server=/amazonaws.com/209.244.0.3
將查詢 Level3 的公共 DNS 伺服器的 amazonaws.com 網域。
您可以將多個網域分組在一起
server=/co.uk/com/8.8.4.4
將 .co.uk 和 .com 網域傳送到位於 8.8.4.4 的 DNS 伺服器
你也可以有多個server=
指令
-S, --server=[/[<網域>]/[網域/]][<ip位址>[#<連接埠>][@<來源>[#<連接埠>]]]
直接指定上游伺服器的IP位址。設定此標誌不會禁止讀取 /etc/resolv.conf,請使用 -R 來執行此操作。如果給了一個或多個可選網域,則伺服器僅用於這些網域,並且僅使用指定的伺服器查詢它們。這適用於私有名稱伺服器:如果您的網路上有名稱伺服器,處理 192.168.1.1 處 xxx.internal.thekelleys.org.uk 形式的名稱,則給予標誌 -S /internal.thekelleys.org.uk/ 192.168.1.1 會將內部電腦的所有查詢傳送到該名稱伺服器,其他所有內容將傳送至/etc/resolv.conf 中的伺服器。空域規範 // 具有「僅非限定名稱」的特殊意義,即名稱中不帶任何點。可以使用 # 字元將非標準連接埠指定為 IP 位址的一部分。允許有多個 -S 標誌,並根據需要使用重複的網域或 ipaddr 部分。
也允許使用 -S 標誌,它給出域但不給出 IP 位址;這告訴 dnsmasq 一個網域是本地的,它可以回答來自 /etc/hosts 或 DHCP 的查詢,但永遠不應該將該網域上的查詢轉送到任何上游伺服器。 local 是 server 的同義詞,在這種情況下使設定檔更清晰。
@ 字元後的可選第二個 IP 位址告訴 dnsmasq 如何將查詢的來源位址設定為此名稱伺服器。它應該是屬於運行 dnsmasq 的電腦的位址,否則該伺服器行將被記錄然後被忽略。對於指定了來源位址的任何伺服器,查詢連接埠標誌將被忽略,但連接埠可以直接指定為來源位址的一部分。