覆盖 BIND 中用于内部网络的某些 DNS 条目

覆盖 BIND 中用于内部网络的某些 DNS 条目

我有一个内部网络,其中的 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

未绑定递归 DNS 服务器具有覆盖单个资源记录的能力。

查看local-zonelocal-data配置设置手动的,例如:

local-zone: "example.com." transparent
local-data: "foo.example.com. IN A 192.168.1.1"

transparent上的设置告诉local-zone它对任何未提供的名称执行正常的递归查找local-data

答案3

您可能需要研究一下“dnsmasq”,它可以让您通过调整分辨率做一些非常聪明的事情。

答案4

使用 dnsmasq 会使一切变得非常容易。http://www.thekelleys.org.uk/dnsmasq/doc.html 充当 DNS 服务器,但从本地 DNS 服务器获取答案。好处是您可以覆盖单个域记录,而无需处理区域文件

相关内容