把内部解析器放在首位、公共解析器放在其次,并不能告诉 Squid 哪些名字属于哪个命名空间。

在 Squid 6 和 7 中,dns_nameservers 会用服务器地址取代通常的解析器列表。它的语法没有按域名的映射。有效的否定回答也与无法访问的解析器不同,因此靠备选解析器遍历互不兼容的命名空间并不可靠。

按域名分流查询

本地 DNS 转发器可以表达缺失的策略。在已有的 dnsmasq 配置中,可以这样为一个私有后缀分流:

server=/internal.example/192.0.2.53

替换域名和地址。为其他名字配置一个经批准的默认上游、合适的监听器和访问限制。然后用在装版本支持的配置把 Squid 指向该解析器。

另一种做法是使用能正确解析两个命名空间的组织级 DNS 服务。避免使用会暴露私有名字却又无法应答的公共回退。

如果由父代理执行目的地查询,那么这一跳就必须能访问私有命名空间。本地 Squid 主机上的解析器无法修正父代理的查询。

也要检查否定情形

选择一个有效的私有名字、一个有效的公共名字和一个不存在的私有名字。对每个名字,确认预期的上游,以及预期回答是地址还是否定响应。最后一种情形会暴露内部否定回答之后意外落到公共上游的问题。

把客户端需要的地址族都包含进来。A 查询成功并不能证明 AAAA 也遵循策略,或返回了可达的目的地。还要注意缓存状态:缓存中的回答可能掩盖新的查询会选择哪个上游。

相关文章