采取以下设置:
- 我在 NAT 路由器后面运行一个专用网络
- 专用网络上的系统可以连接到 Internet 上的任何资源,因此需要对任何 Internet 资源进行 DNS 名称解析
- 我拥有一个在 Internet 上拥有资源的域(例如
example.com
)和一个由提供商管理的名称服务器。 - 提供商管理公共资源,并可能更新 DNS 记录以反映更改。也就是说,
MX
forexample.com
明天可能会指向不同的服务器,或者 for 的 IP 地址www.example.com
可能会在一夜之间发生变化,而我不会收到通知。 - 我想在我的内部网络上使用相同的域来获取资源;内部资源位于子域(例如
fileserver.internal.example.com
)上。但是,我不想将这些 DNS 记录暴露给 Internet。
最后一项意味着我需要在内部运行我自己的 DNS 服务器,并让它回答我的区域的查询。但是,我需要确保对任何公共资源的查询都由提供商的 DNS 服务器回答。
到目前为止,我一直在使用 pfSense 中的 DNS 转发器功能,这正是我所需要的。我可以为内部系统添加记录(甚至让 DHCP 服务器为它授予的任何租约自动插入它们),如果 DNS 服务器收到对其中任何一个的请求,这些记录将被返回。任何其他请求将被转发到相应的外部名称服务器。
现在我正在尝试使用 Linux 服务器完成相同的操作,可能使用 BIND。我正在设想如下设置:
- 将 BIND 配置为在递归/缓存模式下运行,就像 ISP DNS 一样。
- 将其设置为
internal.example.com
. - 为区域中的内部系统配置 RR
internal.example.com
。
鉴于外界没有人知道该internal.example.com
区域,这是否会按预期工作?BIND 是否优先考虑它具有权威性的任何区域(而不是尝试通过首先查询根区域来定位它),还是可以将其配置为这样做?
当配置为递归服务器时,BIND 将首先使用它具有权威性的区域,然后再从根开始遍历整个 DNS 树。因此,只要您的专用网络上的名称位于它们自己的区域中,上述配置就可以工作。
您甚至可以创建多个区域;唯一的限制是您需要维护您创建的区域中的所有记录并确保它们是最新的。它们可以引用 Internet 上的服务器,但您需要手动镜像您的托管服务提供商所做的所有更改,否则您的公共服务可能不再可以从您的内部网络访问。
在https://gist.github.com/Nilpo/1a70ebca988ad0743ea533d747445148上有关于这个确切主题的很好的文章。我在 Ubuntu 18.04 上进行了测试,BIND 包预配置为缓存名称服务器,因此您需要做的就是根据需要添加和填充区域文件,重新加载配置并将系统指向该服务器。