当无法在本地找到记录时,是否可以将权威 DNS 服务器配置为递归?

当无法在本地找到记录时,是否可以将权威 DNS 服务器配置为递归?

希望这是可以实现的。

问题

是否可以配置一个对给定域具有权威性的 DNS 服务器,当它在本地找不到记录时,通过转发器/根提示进行“回退”和递归?

场景

为了给出一个具体的场景,想象一个私有(内部)网络,该网络由内部 Active Directory 支持的 DNS 服务器(10.10.10.10)为域提供服务poorlyplanned.com

查询记录的内部客户端hostgroupA.poorlyplanned.com从本地内部 DNS 服务器 (10.10.10.10) 获取答案。来自内部客户端对其他域的查询通过内部 DNS 服务器 (10.10.10.10) 使用转发器/根提示进行递归解析。

此外,还有一个公共 DNS 服务器(实际上是大型高可用性负载平衡服务器),IP 为 1.2.3.4,并且对同一个域名具有权威性poorlyplanned.com

查询记录的外部客户端直接转到位于 1.2.3.4 的公共 DNS 服务器进行解析。例如,公共查询webserverX.poorlyplanned.com直接从公共 DNS 服务器 1.2.3.4 解析,并向客户端返回 50.51.52.53。当我说直接解析时,我的意思是 NS 记录指向公共 DNS 服务器,查询是不是通过内部服务器(无论如何它都不是公开可访问的)。

内部 DNS 填充了poorlyplanned.com不打算公开解析的私有 DNS 记录,而外部 DNS 填充了应该公开解析的公共 DNS 记录(针对同一域)。

到目前为止,DNS 内容相当标准,尽管可以说并不理想。

问题

内部客户端无法解析公共 DNS 记录,webserverx.poorlyplanned.com因为这些记录未在内部 DNS 服务器上定义。由于内部 DNS 服务器对同一poorlyplanned.com域具有权威性,因此它在查看内部记录后只会返回“未找到 DNS 记录”结果 - 权威 DNS 服务器通常会这样做。

我们面临的一个限制是,公共 DNS 服务器由第三方管理并且经常变动,因此很难在内部 DNS 服务器上手动维护一组重复的记录而不出现失误。

作为一种解决方法,我们尝试添加指向外部 DNS 服务器的额外客户端 DNS 查找服务器条目(以尝试补充内部 DNS 服务器),但这种方法不起作用,因为两者都是权威的,并且一旦一个服务器返回结果,客户端就不会尝试列表中的后续服务器。

裂脑配置或水平配置也不可行,因为它们的两个服务器都包含相同的 DNS 记录,只是 IP 不同或可以共享区域文件。

但是,如果内部 DNS 服务器在本地无法找到记录时能够通过转发器/根提示进行递归解析,那么效果会很好。但是如何实现呢?

我意识到,如果内部域最初配置了一些子域偏移量,int.poorlyplanned.com那么我们就不会遇到问题。不幸的是,已部署的资源和涉及的站点的规模不允许进行这样的更改。

这肯定不是一个独特的问题?

我希望我已经表达得足够清楚了——如果我能帮助澄清的话,请告诉我。

感谢您的阅读/帮助!

答案1

这确实不是一个独特的问题。在我看来,有两种常用的“解决方案”:

  • 手动将需要公开的记录条目复制到两个 DNS 基础设施。请注意,这仅适用于公开托管的服务,例如 VPS 实例。由于app.example.com内部托管需要外部的公共 IP 地址,但内部可能需要私有 IP 地址。现在自动化成为炒作热点,如果您经常需要在两个位置更改这些公共 IP 地址,您将需要研究自动化。如果您当前的 DNS 托管提供商不好(质量差或没有自动化 API),那么您可以简单地切换到其他提供商。
  • 在内部使用不同的域。如果您拥有example.com并且您的公共服务器使用此域,例如,www.example.com如果您使用 Windows Active Directory,mail.example.com则您的内部网络可以使用,或者或您喜欢的任何内容。内部资源将存在于此名称空间中,而公共资源(例如)将转发到您的公共 DNS 提供商。这样您就不需要复制 DNS 条目。ad.example.comcomp.example.comwww.example.com

这两种解决方案各有利弊,并且可能存在其他解决方案。

如果权威 DNS 服务器在其数据库中找不到答案,则无法配置它来转发查询。“权威”意味着它知道有关区域的一切。您可以配置特定的转发器,例如:

zone "example.com" {
   type master;
   file "...";
};
zone "www.example.com" {
   type forward;
   forwarders { 203.0.113.53; };
};
zone "mail.example.com" {
   type forward;
   forwarders { 203.0.113.53; };
};

答案2

如果外部 DNS 使用 BIND,以下配置文件只是解决问题的示例

acl localnet { 1.2.3.4/24; }; <---- this is the range of your public ip addresses
view internal {
     match-clients { localnet; };

     allow-recursion { any; };

     zone "myzone.example" {
          type master;
          file "external.db.myzone.example"; <--- in this file put all your internal and external records
                                                  even if they have local ip addresses
     };

     };
}; 
view external {
     match-clients { any; };

     allow-recursion { any; };

     zone "myzone.example" {
          type master;
          file "internal.db.myzone.example"; <--- in this file put all just your external records
     };

     };
}; 
};

答案3

如果您有需要外部解析的记录列表,并且您正在使用 BIND,则可以将权威区域中的单个记录定义为NS记录,DNS 将对这些记录进行递归。不幸的是,这不适用于通配符记录(即:)*。示例(区域文件内poorlyplanned.com):

webserverx        IN NS ns1.external.com.
webserverx        IN NS ns2.external.com.

NS 记录的规则保持不变(即:它们不能是 IP,并且您可以拥有所需数量的 IP)。

我在其他地方找不到这方面的描述,所以即使这个问题已经很老了,我还是把它添加到了这里:希望我未来的自己会发现它很有用。

相关内容