我要么无法理解 DNS 的工作原理,要么无法正确配置 DNS(两者都不好)。我目前正在使用一个域名,我将其称为网站域名,我需要允许所有内部用户访问 dotster 以获取我们的公共 DNS 条目,就像世界其他地方一样。然后,最重要的是,我希望能够提供一些覆盖 DNS 条目,用于测试不公开的服务器和设备。例如:
- public.webdomain.com - 应从 dotster 获取
outside.webdomain.com - 也应该从 dotster 获取
testing.webdomain.com - 应该从我的内部 DNS 控制器获取此信息
我似乎每次都遇到的问题是,如果我有一个包含 webdomain.com 区域的内部 DNS 控制器,那么我能获取我指定的内部条目,但是绝不从公共 DNS 服务器获取任何内容。无论我使用哪种类型的 DNS 服务器,这都是正确的——我尝试过 Linux Bind9 和 Windows 2008 域控制器。
我想我最大的疑问是:我认为一个系统应该能够检查我指定的内部 DNS,并且在请求的条目不存在的情况下,它应该故障转移到指定的公共 DNS 服务器 - 或者 - 这难道不是 DNS 的工作方式而我迷失了方向,这是不是不合理的?
看起来应该很简单,只需告诉我的内部 DNS 服务器将其无法满足的任何请求转发给 dotster 即可,但这似乎不起作用。这可能是防火墙问题吗?
提前致谢
扩展
好的,我做了大量研究,并花了几个小时研究这个问题。我的 named.conf 中有这个,但我仍然看到相同的结果。内部调用已输入,但任何外部调用(在区域控制域中)都被转储了。任何帮助都很棒!另外,这是我正在使用的 Ubuntu 9.04 操作系统。
Code removed because it was wrong.
正确方法——问题关闭后添加
好吧,感谢 serverfault 上的各位,现在我的服务器上可以完美地运行它,而且方式更加简洁。操作方法如下。从 bind9 的基本安装开始,编辑您的 named.conf.local 文件,并为要重定向的每个子域添加一个区域:
/etc/bind/named.conf
// WEBDOMAIN.COM ENTRIES
zone "test.webdomain.com" {
type master;
file "/etc/bind/zones/test.webdomain.com";
};
zone "alpha.webdomain.com" {
type master;
file "/etc/bind/zones/alpha.webdomain.com";
};
zone "beta.webdomain.com" {
type master;
file "/etc/bind/zones/beta.webdomain.com";
};
// INTERNETSITE.COM ENTRIES
zone "internal.internetsite.com" {
type master;
file "/etc/bind/zones/internal.internetsite.com";
};
zone "dev.internetsite.com" {
type master;
file "/etc/bind/zones/dev.internetsite.com";
};
编辑您的 /etc/bind/named.conf.options 文件并将您想要使用的任何转发器添加到正确的位置:
/etc/bind/named.conf.options
options {
directory "/var/cache/bind";
forwarders {
208.67.222.222;
208.67.220.220;
8.8.8.8;
8.8.4.4;
};
auth-nxdomain no; # conform to RFC1035
listen-on-v6 { any; };
};
在 /etc/bind/zones/ 创建一个名为 zone 的新文件夹,并为上面创建的每个与上述“文件”属性匹配的区域添加一个新文件。以 test.webdomain.com 为例:
/etc/bind/zones/test.webdomain.com
$TTL 604800
@ IN SOA test.webdomain.com. (
1 ; Serial
604800 ; Refresh
86400 ; Retry
2419200 ; Expire
604800 ) ; Negative Cache TTL
;
@ IN NS test.webdomain.com.
test.webdomain.com. IN A 10.0.1.20
其中 10.0.1.20 是您希望此(子)域转发到的 A 记录 IP 地址。通过这种方式,test.webdomain.com 的记录仅对子域具有权威性,而全局 DNS 将照常提供任何其他子域或根域。
答案1
您需要做的是在内部 DNS 服务器上为 testing.webdomain.com 创建一个 DNS 区域。这样,webdomain.com DNS 就不会由您的内部服务器托管,而是由 dotster 托管。
当有人查询 www.webdomain.com 时,请求将被转发到 dotster 进行查找(因为您的本地 DNS 服务器对该区域没有权威性),而对 testing.webdomain.com 的请求将由您的内部 DNS 服务器处理。
答案2
你需要分割视图 DNS。对于您的边境机器,使用外部的解析器。对于您的测试环境,请使用单独的内部的解析器。内部解析器将在 DNS 中拥有您的测试条目并从一个视图进行回答;但外部世界将看到您的区域的不同“视图”,从而省略了测试环境。
其他可能感兴趣的 SF 条目:
我今天只有时间浏览你的扩展帖子,因此这里是第一眼看到的内容:
options {
directory "/etc/bind";
listen-on { // why are these lines needed?
10.0.1.5; // the way it is set up, only your loopback
127.0.0.1; // and your LAN clients will be able to
// get answers; the outside world can't see boo
// because there's no interface/port pair
// to contact. I would just get rid of this and
}; // not worry about what interfaces are being bound to
// BTW, that listen-on line is why your outside queries are failing.
auth-nxdomain no;
allow-query { any; };
recursion no;
version "0";
};
此外,外部 match-clients 语句
view "external" {
match-clients { !localnets; any; };
可以制成
view "external" {
match-clients { any; };
因为当您添加到 match-clients 时,它已经假设一开始就没有什么可匹配的;否定 ACL 实际上不会增加太多(因为它从来没有在该视图中“存在”,所以没有理由将其取消)。
我确信我可能错过了一些东西,但这些是最明显的罪魁祸首。
答案3
您的区域定义似乎不正确。它缺少声明为“webdomain.com”的名称服务器的 IP 地址。
我建议您将区域定义更改为
$TTL 604800
@ IN SOA webdomain.com. email.webdomain.com. (
4 ; Serial
604800 ; Refresh
86400 ; Retry
2419200 ; Expire
604800 ) ; Negative Cache TTL
;
@ IN NS webdomain.com.
webdomain.com. IN A 10.0.1.5
test IN A 10.0.1.20
然后重新启动服务器(例如/etc/init.d/bind9 restart
)。
由于错误导致无法加载区域,因此无法解析域。
答案4
在 Windows DNS 服务器上设置新的区用于 testing.webdomain.com。添加第一个主机时,请将名称字段留空,并输入您希望内部用户解析的 IP 地址。
该服务器将对该区域具有权威性,因此任何请求都将定向到该 IP,这样就不会与您的外部解析相冲突。
我在所有 mail.corpdns.com 网站上都使用它(因为用户在尝试访问网络邮件等时从来不会记得使用内部服务器名称)。
我怀疑这也可以在 Linux/Bind 中完成,但我不知道步骤。