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