如何强制 dnsmasq 仅对某些指定的域名使用上游 dns 服务器?

如何强制 dnsmasq 仅对某些指定的域名使用上游 dns 服务器?

现在我在 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 地址?

答案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 = [/[<域>]/[域/]][<ipaddr>[#<端口>][@<源>[#<端口>]]]

直接指定上游服务器的 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 的机器的地址,否则将记录此服务器行,然后将其忽略。对于任何指定了源地址的服务器,查询端口标志将被忽略,但可以直接将端口指定为源地址的一部分。

相关内容