我有一个内部网络,其中的 DNS 服务器运行 BIND,通过单个网关连接到互联网。我的域名“example.com”由外部 DNS 提供商管理。该域中的某些条目(例如“host1.example.com”和“host2.example.com”)以及顶级条目“example.com”指向网关的公共 IP 地址。
我希望位于内部网络上的主机将“host1.example.com”、“host2.example.com”和“example.com”解析为内部 IP 地址,而不是网关的 IP 地址。其他主机(如“otherhost.example.com”)仍应由外部 DNS 提供商解析。
我已经成功地对 host1 和 host2 条目进行了上述操作,方法是在 BIND 中为“host1.example.com”和“host2.example.com”定义两个单条目区域。但是,如果我为“example.com”添加一个区域,则该域的所有查询都由我的本地 DNS 服务器解析,例如查询“otherhost.example.com”会导致错误。
是否可以配置 BIND 以仅覆盖一些域的条目,并递归地解决其余部分?
答案1
最好的方法是通过 Bind 9.8.1 或更新版本中的响应策略区域。它允许您覆盖任意区域中的单个记录(无需为此创建整个子域,只需创建要更改的单个记录),它允许您覆盖 CNAME 等。其他解决方案(例如 Unbound)无法覆盖 CNAME。
https://www.redpill-linpro.com/sysadvent/2015/12/08/dns-rpz.html
编辑:那么让我们正确地做这件事吧。我将根据上面链接的教程记录我所做的事情。
我的操作系统是用于 Raspberry Pi 的 Raspbian 4.4,但该技术应该可以在 Debian 和 Ubuntu 上无需任何更改即可运行,或者在其他平台上只需进行很少的更改即可运行。
转到系统中保存 Bind 配置文件的位置 - 这里/etc/bind
。在其中创建一个名为的文件,db.rpz
其内容如下:
$TTL 60
@ IN SOA localhost. root.localhost. (
2015112501 ; serial
1h ; refresh
30m ; retry
1w ; expiry
30m) ; minimum
IN NS localhost.
localhost A 127.0.0.1
www.some-website.com A 127.0.0.1
www.other-website.com CNAME fake-hostname.com.
它有什么作用?
www.some-website.com
它用假地址覆盖 IP 地址127.0.0.1
,有效地将该站点的所有流量发送到环回地址- 它将流量发送
www.other-website.com
到另一个名为fake-hostname.com
您可以在此处使用可以放入绑定区域文件的任意内容。
要激活这些更改,还需要几个步骤:
编辑named.conf.local
并添加此部分:
zone "rpz" {
type master;
file "/etc/bind/db.rpz";
};
上面链接的教程告诉您添加更多内容,zone "rpz" { }
但在简单的设置中这不是必需的 - 我在这里展示的是使其在您的本地解析器上运行的最低限度。
编辑named.conf.options
并在该部分的某处options { }
添加response-policy
选项:
options {
// bunch
// of
// stuff
// please
// ignore
response-policy { zone "rpz"; };
}
现在重新启动 Bind:
service bind9 restart
就是这样。名称服务器现在应该开始覆盖这些记录。
如果需要进行更改,只需编辑db.rpz
,然后重新启动 Bind。
奖励:如果您想将 DNS 查询记录到系统日志中,以便您可以密切关注进程,请编辑named.conf.local
并确保其中有一个logging
部分包含以下语句:
logging {
// stuff
// already
// there
channel my_syslog {
syslog daemon;
severity info;
};
category queries { my_syslog; };
};
再次重新启动 Bind 就完成了。
在运行 Bind 的机器上进行测试:
dig @127.0.0.1 www.other-website.com. any
如果您在另一台机器上运行 dig,只需使用 @the-ip-address-of-Bind-server 而不是 @127.0.0.1
我曾非常成功地使用过这种技术来覆盖我正在处理的网站的 CNAME,并将其发送到我刚刚测试的新 AWS 负载均衡器。Raspberry Pi 用于运行 Bind,并且 RPi 还配置为用作 WiFi 路由器 - 因此通过将设备连接到在 RPi 上运行的 SSID,我将获得测试所需的 DNS 覆盖。
答案2
答案3
您可能需要研究一下“dnsmasq”,它可以让您通过调整分辨率做一些非常聪明的事情。
答案4
使用 dnsmasq 会使一切变得非常容易。http://www.thekelleys.org.uk/dnsmasq/doc.html 充当 DNS 服务器,但从本地 DNS 服务器获取答案。好处是您可以覆盖单个域记录,而无需处理区域文件