为内部网络覆盖 BIND 中的一些 DNS 条目

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 覆盖。

  • 请注意,BIND RPZ 实际上(还)不能在每个 QTYPE 的基础上覆盖单个记录 - 它会覆盖特定所有者名称的 _all_ 记录。这意味着,如果您想覆盖域的 A 记录,而不是例如 MX 记录,则不能。您还必须将 MX 记录放在 RPZ 区域中,并使其与真实区域保持同步。 (3认同)
  • 谢谢你像你一样打破这个。很有帮助。 (2认同)

Aln*_*tak 22

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

查看手册中的local-zonelocal-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

  • @bortzmeyer,有时别无选择。示例:SBS 2008 必须具有单个 LAN IP,但需要使用路由器转发的外部 IP 从外部访问它。Microsoft 不允许在 SBS 上使用两个网卡,也不允许在同一块卡上配置两个 IP。如果本地服务器将 DNS 名称解析为外部 IP,则路由器需要对 LAN ip 进行 DNAT 和 SNAT,然后 SBS 上的日志将显示所有访问都来自路由器的 IP,这是错误的。我将在我自己的路由器上安装 `unbound`,我认为解决方案要好得多。 (4认同)
  • 这不能回答问题,因为该问题特定于 BIND。 (2认同)