在 Debian/Ubuntu 上的 BIND 解析器中设置响应策略区 (RPZ)

[ad_1]

本教程将向您展示如何使用 BIND DNS 解析器覆盖公共 DNS 记录 应对政策区 (RPZ) 在 Debian/Ubuntu 上。

什么是响应策略区?

应对政策区 (RPZ) 允许 DNS 解析器修改 DNS 记录。 它最初是为了阻止访问危险网站而开发的。 例如,如果计算机查询传播恶意软件的已知危险站点的 IP 地址,DNS 解析器可以返回 127.0.0.1 作为 DNS 响应,因此计算机无法连接到危险站点。 这是原始用例。 因此,响应政策区也被称为 DNS防火墙.

您可以通过其他方式使用 RPZ。 例如,

  • 如果您在本地网络中有 Nextcloud 等自托管服务,您可以使用 RPZ 将您的 Nextcloud 域(nextcloud.your-domain.com)指向本地 IP 地址,这样您就不必外出上网然后返回到您的本地网络以访问 Nextcloud 服务器。
  • 父母可以使用 RPZ 来阻止他们的孩子访问色情网站。
  • 您可以阻止不需要的广告。
  • 我在我的 VPS 上安装了许多 Web 应用程序。 当 Web 应用程序不适用于公共访问时,我仅在 BIND RPZ 中添加 DNS 记录,并且不在我的域注册商处发布 DNS 记录以防止黑客入侵。

是的,您可以在 /etc/hosts 本地计算机上的文件以覆盖公共 DNS 记录,但它不能很好地扩展。 此外,iOS 和 Android 不允许您创建本地 DNS 条目。 如果 BIND DNS 解析器覆盖公共 DNS 记录,那么网络中使用 BIND 解析器的所有设备都可以使用自定义 DNS 记录,这不是很好吗?

先决条件

要学习本教程,假设您在 Debian/Ubuntu 服务器上运行了 BIND DNS 解析器。 如果没有,请阅读以下教程之一来设置 BIND 解析器。

  • 在 Debian 10 Buster 上设置您自己的 BIND9 DNS 解析器
  • 在 Ubuntu 16.04/18.04 上设置你自己的 BIND9 DNS 解析器
  • 在 Ubuntu 20.04 上设置你自己的 BIND9 DNS 解析器

一旦您的 BIND 解析器启动并运行,请按照以下说明进行操作。

如何在 Debian/Ubuntu 服务器上设置 BIND 响应策略区

首先,编辑 named.conf.options 文件。

sudo nano /etc/bind/named.conf.options

options {...} 子句以启用响应策略区域。 (第一行是注释。)

//enable response policy zone. 
response-policy { 
    zone "rpz.local"; 
};

Save 和 close 文件。 然后打开 named.conf.local 文件。

sudo nano /etc/bind/named.conf.local

在此文件中添加一个 RPZ 区域。

zone "rpz.local" {
    type master;
    file "/etc/bind/db.rpz.local";
    allow-query { localhost; };
    allow-transfer { 12.34.56.78; };
};

笔记:

  • 在目录中使用绝对路径而不是简单的文件名很重要 file 指令,否则 BIND 会假设文件在 /var/cache/bind/.
  • RPZ 区域应该只允许来自本地主机的查询。 您不需要添加本地网络客户端。
  • 代替 12.34.56.78 使用从属 BIND DNS 解析器的 IP 地址,允许进行区域传输。 如果只有一个 DNS 解析器,您可以使用 localhost 像这样: allow-transfer { localhost; };

Save 和 close 文件。 然后我们需要创建区域文件。 我们可以使用区域模板文件,而不是从头开始创建区域文件。 复制内容 db.empty 到一个新文件。

sudo cp /etc/bind/db.empty /etc/bind/db.rpz.local

然后编辑 db.rpz 文件。

sudo nano /etc/bind/db.rpz.local

无需更改现有内容。 我们只需添加我们的自定义 DNS 记录。 例如,如果您在本地网络上有一个 IP 地址为 192.168.0.103 的 Nextcloud 服务器,那么您添加以下 DNS 记录,这样 Nextcloud 客户端就不必为了连接到 Nextcloud 服务器而上网.

nextcloud.your-domain.com      A   192.168.0.103

如果您不希望您的孩子访问诸如 pornhub.com 之类的色情网站,请在此文件中添加以下行以阻止整个 pornhub.com 域。

*.pornhub.com          CNAME  .

如果您不喜欢在网页上看到 Google Adsense 广告,可以添加以下行来阻止 doubleclick.net 域,用于投放 Adsense 广告。

*.doubleclick.net      CNAME   .

要覆盖域名的 MX 记录,请添加如下一行。

example.com         MX     0    mail.example.com.

笔记 所有左手名称不得以点结尾,所有右手名称必须以点结尾。

如果您需要对主机名进行负载平衡,那么您可以创建一个具有多个值的记录,如下所示。 DNS 客户端将随机使用这两个 IP 地址,流量将在它们之间分配。

host.example.com         A              12.34.56.78
                         A              12.34.56.79

Save 和 close 文件。 建议为 RPZ 使用单独的日志文件,以便更好地分析日志。 要进行配置,请编辑 BIND 主配置文件。

sudo nano /etc/bind/named.conf

将以下行添加到文件中。

logging {
    channel rpzlog {
  	file "/var/log/named/rpz.log" versions unlimited size 100m;
    	print-time yes;
    	print-category yes;
    	print-severity yes;
    	severity info;
    };
    category rpz { rpzlog; };
};

Save 和 close 文件。 然后创建 /var/log/named/ 目录并制作 bind 作为业主。

sudo mkdir /var/log/named/
sudo chown bind:bind /var/log/named/ -R

接下来,运行以下命令检查主配置文件中是否存在语法错误。 静默输出表示未发现错误。

sudo named-checkconf

然后检查 RPZ 区域文件的语法。

sudo named-checkzone rpz /etc/bind/db.rpz.local

如果没有发现错误,则重新启动 BIND9。

sudo systemctl restart bind9

现在你可以运行 dig BIND 服务器上的命令以查看 RPZ 是否正常工作。 例如,查询包含在响应策略区域中的域名的 DNS 记录。

dig A nextcloud.your-domain.com @127.0.0.1

您应该在命令输出中看到类似下面的内容,这表明 DNS 响应是从本地 RPZ 提供的。

;; AUTHORITY SECTION:
rpz.local			86400	IN	NS	localhost.

您还可以查看 BIND9 查询日志。

sudo tail /var/log/named/rpz.log

您会看到类似下面的内容,这意味着响应是从本地 RPZ 提供的。

(example.com): rpz QNAME Local-Data rewrite example.com via example.com.rpz.local

将 RPZ 与转发器一起使用

如果你添加一个 fowarders 指令如下 options 条款中的 /etc/bind/named.conf.options 文件,然后您的 BIND 解析器成为转发器,它将 DNS 请求转发到上游 DNS 解析器,例如 8.8.8.8.

options {
        directory "/var/cache/bind";

        // If there is a firewall between you and nameservers you want
        // to talk to, you may need to fix the firewall to allow multiple
        // ports to talk.  See https://www.kb.cert.org/vuls/id/800113

        // If your ISP provided one or more IP addresses for stable
        // nameservers, you probably want to use them as forwarders.
        // Uncomment the following block, and insert the addresses replacing
        // the all-0's placeholder.

        forwarders {
                8.8.8.8;
                8.8.4.4;
        };
        ...
};

响应策略区域与此转发器设置一起使用。 绑定将首先查询本地响应策略区域。 如果在 RPZ 中找不到 DNS 记录,则请求将转发到上游 DNS 解析器。 当您自己的 BIND 解析器花费太多时间解析 DNS 名称时,您可能希望使用转发器来加速 DNS 解析。

配置区域传输

如果您有另一个 BIND DNS 解析器,您可以将其配置为从解析器以自动接收来自主 DNS 解析器的更新。

首先,您需要编辑 /etc/bind/named.conf.local 文件在 主 DNS 解析器.

sudo nano /etc/bind/named.conf.local

将从 DNS 解析器的 IP 地址添加到 allow-transfer 指示。

zone "rpz.local" {
    type master;
    file "/etc/bind/db.rpz.local";
    allow-query { localhost; };
    allow-transfer { 12.34.56.78; };
    also-notify { 12.34.56.78; };
};

如果您有多个从属 DNS 解析器,则添加多个 IP 地址,如下所示。

 allow-transfer { 12.34.56.78; 12.34.56.79; };

also-notify 指令将使主 DNS 解析器在 RPZ 区域更改时向从解析器发送通知消息。 Save 和 close 文件。 重新启动 BIND 以使更改生效。

sudo systemctl restart bind9

如果主DNS解析器上运行了防火墙,则需要允许从DNS解析器连接到53端口。例如,如果您使用UFW防火墙,则运行以下命令。

sudo ufw insert 1 allow in from 12.34.56.78 to any port 53

接下来,编辑 named.conf.options 文件在 从属 DNS 解析器.

sudo nano /etc/bind/named.conf.options

options {...} 子句以启用响应策略区域。 (第一行是注释。)

//enable response policy zone. 
response-policy { 
    zone "rpz.local"; 
};

Save 和 close 文件。 然后编辑 named.conf.local 文件。

sudo nano /etc/bind/named.conf.local

在此文件中添加从属 RPZ 区域。 将 11.22.33.44 替换为主 DNS 解析器的 IP 地址。

zone "rpz.local" {
    type slave;
    file "db.rpz.local";
    masters { 11.22.33.44;};
    allow-notify { 11.22.33.44; };
    allow-transfer { none; };
    allow-query { localhost; };
};

Save 和 close 文件。

您还需要配置从解析器的防火墙以允许主 DNS 解析器发送 notify 消息。

sudo ufw insert 1 allow in from 11.22.33.44 to any port 53

接下来,运行以下命令检查主配置文件中是否存在语法错误。 静默输出表示未发现错误。

sudo named-checkconf

如果未发现错误,则重新启动 BIND9。

sudo systemctl restart bind9

BIND9 重新启动后,区域传输将立即开始。 使用以下命令检查 BIND9 日志。

sudo journalctl -eu bind9

或者

sudo journalctl -eu named

您可以看到如下消息,这表明区域传输成功。

transfer of 'rpz.local/IN' from xx.xx.xx.xx#53: Transfer status: success
transfer of 'rpz.local/IN' from xx.xx.xx.xx#53: Transfer completed: 1 messages, 34 records, 899 bytes, 0.248 secs (3625 bytes/sec)

笔记: 无论何时修改主解析器上的 RPZ 区域,都需要更新序列号。 使它更大,以便从解析器知道 RPZ 区域已更改。

创建多个 RPZ 区域

有时您可能不希望某些 DNS 记录传输到从属解析器。 您可以创建单独的 RPZ 区域。 编辑 named.conf.options 文件。

sudo nano /etc/bind/named.conf.options

添加新的 RPZ 区域。

//enable response policy zone. 
response-policy { 
    zone "rpz.local";
    zone "rpz.local.notransfer"; 
};

Save 和 close 文件。 然后打开 named.conf.local 文件。

sudo nano /etc/bind/named.conf.local

在此文件中添加新区域的定义。

zone "rpz.local.notransfer" {
    type master;
    file "/etc/bind/db.rpz.local.notransfer";
    allow-query { localhost; };
    allow-transfer { localhost; };
};

Save 和 close 文件。 然后我们需要创建区域文件。 我们可以使用区域模板文件,而不是从头开始创建区域文件。 复制内容 db.empty 到一个新文件。

sudo cp /etc/bind/db.empty /etc/bind/db.rpz.local.notransfer

然后编辑 db.rpz 文件并添加自定义 DNS 记录。

sudo nano /etc/bind/db.rpz.local.transfer

故障排除提示

如果辅助 DNS 解析器无法从主 DNS 解析器复制 RPZ 记录,则可能在辅助 DNS 解析器上:

  • 防火墙规则错误。
  • BIND 解析器未运行。
  • BIND 未侦听所需的网络接口。

如何在 BIND 中将 RPZ 与视图一起使用

如果你想让你的 RPZ 只能被内部可信网络访问,你可以使用 BIND 中的视图来完成它。 此设置将与主从区域传输兼容。

首先,编辑 named.conf.options 文件。

sudo nano /etc/bind/named.conf.options

定义内部网络和访客网络 acl 指示。

options {
     .....
     .....
}

acl internal {
    10.10.10.0/24;
};

acl guest { 
   10.10.20.0/24;
};

这里的 10.10.10.0/24 network 是内部可信网络。 10.10.20.0/24 是访客网络。 此外,从该文件中删除以下几行。

  response-policy {
     zone "rpz.local";
  };

Save 和 close 文件。

接下来,编辑 named.conf.local 文件。

sudo nano /etc/bind/named.conf.local

您需要将区域定义放在一个 view 条款如下。 请注意,我们需要在内部启用响应策略区域 view 条款。

view "internal" {
  match-clients { internal; };

  //enable the response policy zone.
  response-policy {
     zone "rpz.local";
  };

  zone "rpz.local" {
    type master;
    file "/etc/bind/db.rpz.local";
    allow-query { localhost; };
    allow-transfer { 12.34.56.78; };
  };

};

Save 和 close 文件。 然后编辑 named.conf 文件。

sudo nano /etc/bind/named.conf.default-zones

将默认区域放在 guest 看法。

view guest {
     match-clients { guest; };
     allow-recursion { any; };

    zone "." {
        type hint;
        file "/usr/share/dns/root.hints";
    };

    zone "localhost" {
        type master;
        file "/etc/bind/db.local";
    };

    .....
    .....
};

Save 和 close 文件。 运行以下命令检查配置文件是否存在语法错误。 静默输出表示未发现错误。

sudo named-checkconf

如果未发现错误,则重新启动 BIND9 以使更改生效。

sudo systemctl restart bind9

包起来

我希望本教程可以帮助您在 Debian/Ubuntu 上设置响应策略区域/DNS 防火墙。 与往常一样,如果您发现这篇文章有用,请订阅我们的免费时事通讯以获取更多提示和技巧。 保重?

[ad_2]

Related Posts