是否有可能为一个域设置一个内部 DNS,其中包含所有内部 IP(如 192.168.0.0/24),并为同一个域设置一个外部 DNS。
我希望 bind 能够解析所有内部地址,如果找不到记录,则将其转发到外部 DNS。
让我举例说明。
域名 mydomain.com 由 Gandi 托管,并采用 Gandi 外部 DNS。它具有邮件、www 等记录。可从任何地方访问。
另一方面,我有一个内部 DNS,它与 nas、raspberry pi 等内部机器具有相同的域。
如果我想从内部网络连接到 nas,我会输入 nas.mydomain.com,它将由内部 dns 解析,但如果我想连接到 webmail,我会转到 mail.mydomain.com。此记录在内部 dns 上不存在。然后它应该将查询转发到外部 dns
我已将 bind 配置为具有一个区域“mydomain.com”的缓存/转发服务器,但如何转发在内部 DNS 中未找到任何记录的 mydomain.com 的所有查询
答案1
这个概念的名字确实是分割 DNS或者DNS 视图view
(因为 BIND 使用语句配置它们[文档])。但是,仅凭这一点并不能回答您的问题,因为如果内部视图中不存在记录,您希望将查询从内部视图转发到外部视图。我认为这是不可能的。(我也相信这个确切的问题之前在 ServerFault 上已经被问过很多次了,所以你应该做更好的搜索。但由于我自己无法快速找到类似的问题,我会原谅你并再次在这里回答这个问题)。
拆分 DNS 并不完全符合您所问的问题,因为它假设您将设置单个 DNS 服务器,该服务器将根据哪个客户端(源 IP 地址)提出问题提供不同的答案。您需要两个 DNS 服务器,并在它们之间进行转发。所以让我们试一试。
您的内部 DNS 服务器将成为所有内部记录的主服务器和所有外部记录。您的外部 DNS 服务器(托管在 DMZ 中)将仅是外部记录的主服务器。为了避免必须在两个 DNS 服务器上输入外部记录,您应该将它们放在单独的文件中,同步两个 DNS 服务器之间的该文件,以及$INCLUDE
[文档; 在两个区域文件中搜索“INCLUDE”。然后内部服务器将如下所示:
/etc/bind/named.conf.local
zone "example.com" {
type master;
file "/etc/bind/db.example.com";
};
/etc/bind/db.example.com(在内部 DNS 服务器上)
example.com. SOA ns1.example.com. hostmaster.example.com. (
2017030300 ; serial
3600 ; refresh
1800 ; retry
604800 ; expire
600 ) ; ttl
NS ns1.example.com.
NS ns2.example.com.
ns1 A 192.168.0.53
ns2 A 192.168.0.153
$INCLUDE /etc/bind/db.example.com.external
internal1 A 192.168.0.5
internal2 A 192.168.0.12
client5 A 192.168.0.23
/etc/bind/db.example.com.external
该文件需要在两个 DNS 服务器之间手动同步或通过 cron 同步。
example.com. A 203.0.113.80
MX 10 mail.example.com.
mail A 203.0.113.25
www A 203.0.113.80
需要记住的是,SOA 和 NS 记录需要在两个 DNS 服务器上定义,并且需要特定于内部或外部区域。因此,声明上方的所有内容都$INCLUDE
需要针对每个 DNS 服务器进行自定义。接下来,内部和外部 DNS 服务器都包含外部条目。最后,只有内部服务器指定内部记录。
一个小问题是您无法覆盖条目。因此,如果您有一个公共条目(例如指向 203.0.113.80 的 www.example.com),但您想覆盖该条目,以便内部 DNS 服务器指向 192.168.0.80,则需要通过不在共享文件中列出该条目,而是在$INCLUDE
两个服务器上的语句下单独指定该条目来完成此操作。
答案2
是的,您可以在内部 DNS 和外部 DNS 中使用相同的域(但 DNS 服务器不同)。此配置称为裂脑 DNS。