Rem*_*ank 55 domain-name-system bind
我有一个带有运行 BIND 的 DNS 服务器的内部网络,通过一个网关连接到互联网。我的域“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 提供商解析。
通过在 BIND 中为“host1.example.com”和“host2.example.com”定义两个单条目区域,我已经成功地为 host1 和 host2 条目做到了这一点。但是,如果我为“example.com”添加一个区域,对该域的所有查询都由我的本地 DNS 服务器解析,例如查询“otherhost.example.com”会导致错误。
是否可以将 BIND 配置为仅覆盖域的某些条目,并递归解析其余条目?
Flo*_*rei 38
最好的方法是通过 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.
Run Code Online (Sandbox Code Playgroud)
它有什么作用?
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";
};
Run Code Online (Sandbox Code Playgroud)
上面链接的教程告诉您添加更多内容,zone "rpz" { }但这在简单设置中不是必需的 - 我在这里展示的是使其在您的本地解析器上工作的最低要求。
编辑named.conf.options并在该options { }部分的某处添加response-policy选项:
options {
// bunch
// of
// stuff
// please
// ignore
response-policy { zone "rpz"; };
}
Run Code Online (Sandbox Code Playgroud)
现在重新启动绑定:
service bind9 restart
Run Code Online (Sandbox Code Playgroud)
就是这样。名称服务器现在应该开始覆盖这些记录。
如果您需要进行更改,只需编辑db.rpz,然后再次重新启动绑定。
奖励:如果您想将 DNS 查询记录到系统日志中,以便您可以密切关注程序,编辑named.conf.local并确保有一个logging部分包含以下语句:
logging {
// stuff
// already
// there
channel my_syslog {
syslog daemon;
severity info;
};
category queries { my_syslog; };
};
Run Code Online (Sandbox Code Playgroud)
再次重新启动绑定,就是这样。
在运行 Bind 的机器上测试:
dig @127.0.0.1 www.other-website.com. any
Run Code Online (Sandbox Code Playgroud)
如果您在不同的机器上运行 dig 只需使用 @the-ip-address-of-Bind-server 而不是 @127.0.0.1
我已经成功地使用这种技术来覆盖我正在处理的网站的 CNAME,并将其发送到我刚刚测试的新 AWS 负载均衡器。Raspberry Pi 用于运行 Bind,并且 RPi 还配置为用作 WiFi 路由器 - 因此,通过将设备连接到在 RPi 上运行的 SSID,我将获得测试所需的 DNS 覆盖。
Aln*_*tak 22
将未绑定的递归DNS服务器来覆盖各个资源记录的能力。
查看手册中的local-zone和local-data配置设置,例如:
local-zone: "example.com." transparent
local-data: "foo.example.com. IN A 192.168.1.1"
Run Code Online (Sandbox Code Playgroud)
上的transparent设置local-zone告诉它对未提供的任何名称进行正常的递归查找local-data。