Linux

如何強制 dnsmasq 僅對某些指定域名使用上游 dns 伺服器?

  • May 8, 2018

現在我在 dnsmasq.conf 中有以下行,它可以很好地處理所有請求(/#/匹配任何域;這是必需的):

address=/#/127.0.0.1

但是,有些域需要解析為 .以外的 IP 地址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 地址?

您可以通過使用server=指令來做到這一點,例如

server=/ajax.googleapis.com/8.8.8.8

將查詢 ajax.googleapis.com 域的Google公共 DNS 伺服器,類似地

server=/amazonaws.com/209.244.0.3

將查詢 amazonaws.com 域的 Level3 的公共 DNS 伺服器。

您可以將多個域組合在一起

server=/co.uk/com/8.8.4.4

將 .co.uk 和 .com 域發送到位於 8.8.4.4 的 DNS 伺服器

你也可以有多個server=指令

-S,–伺服器=

$$ /[<domain> $$/$$ domain/ $$]$$ <ipaddr>[#<port> $$$$ @<source>[#<port> $$]] 直接指定上游伺服器的 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 標誌,它提供域但不提供 IP 地址;這告訴 dnsmasq 域是本地的,它可以回答來自 /etc/hosts 或 DHCP 的查詢,但不應該將該域上的查詢轉發到任何上游伺服器。在這種情況下,本地是伺服器使配置文件更清晰的同義詞。

@ 字元後可選的第二個 IP 地址告訴 dnsmasq 如何將查詢的源地址設置為此名稱伺服器。它應該是屬於執行 dnsmasq 的機器的地址,否則該伺服器行將被記錄,然後被忽略。對於任何指定了源地址但埠可以直接作為源地址的一部分指定的伺服器,查詢埠標誌將被忽略。

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