在CentOS / RHEL上的BIND解析器中设置响应策略区域(RPZ)

本教程将向您展示如何使用以下方法在BIND DNS解析器中覆盖公共DNS记录 应对政策专区 (RPZ)在CentOS / RHEL上。

什么是响应策略区?

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

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

  • 如果您在本地网络中拥有诸如Nextcloud之类的自托管服务,则可以使用RPZ将您的Nextcloud域(nextcloud.your-domain.com)指向本地IP地址,因此您不必访问Internet然后返回您的本地网络以访问Nextcloud服务器。
  • 父母可以使用RPZ阻止孩子访问色情网站。
  • 您可以阻止不需要的广告。
  • 我在VPS上安装了许多Web应用程序。 当该Web应用程序不适合公众访问时,我仅在BIND RPZ中添加DNS记录,并且不在我的域名注册机构中发布DNS记录以防止黑客入侵。

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

先决条件

为了遵循本教程,假设您在CentOS / RHEL服务器上运行了BIND DNS解析器。 如果没有,请阅读以下教程来设置BIND解析器。

  • 在CentOS 8 / RHEL 8上设置您自己的BIND9 DNS解析器

BIND Resolver启动并运行后,请按照以下说明进行操作。

如何在CentOS / RHEL服务器上设置BIND响应策略区域

首先,编辑 named.conf 使用命令行文本编辑器(例如Nano)保存文件。

sudo nano /etc/named.conf

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

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

然后向下滚动到该文件的底部,然后在该文件中添加RPZ区域。

zone "rpz.local" {
    type master;
    file "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; };

centos-add-RPZ-zone

建议对RPZ使用单独的日志文件,以更好地分析日志,因此请在 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; };

centos RPZ日志记录

保存并关闭文件。 然后创建 /var/log/named/ 目录并制作 named 作为所有者。

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

然后,我们需要创建区域文件。 代替从头创建区域文件,我们可以使用区域模板文件。 复制内容 named.empty 到一个新文件。

sudo cp /var/named/named.empty /var/named/rpz.local

编辑区域文件。

sudo nano /var/named/rpz.local

无需更改现有内容。 我们只是添加我们的自定义DNS记录。 例如,如果您在本地网络上具有IP地址为192.168.0.103的Nextcloud服务器,则可以添加以下DNS记录,因此Nextcloud客户端不必连接到Internet就可以连接到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.

注意 所有左手名称都不能以点号结尾,而所有右手名称都必须以点号结尾。

response-policy-zone-bind9-centos-redhat
保存并关闭文件。 接下来,我们应该设置 named 作为组的所有者 /var/named/rpz.local 文件或命名文件将无法加载该区域。

sudo chown root:named /var/named/rpz.local

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

sudo named-checkconf

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

sudo named-checkzone rpz /var/named/rpz.local

如果未发现错误,请重新启动BIND。

sudo systemctl restart named

现在您可以运行 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/named.conf 文件,那么您的BIND解析器将成为转发器,它将DNS请求转发到上游DNS解析器,例如 8.8.8.8

options {
//      listen-on port 53 { 127.0.0.1; };
//      listen-on-v6 port 53 { ::1; };
        directory       "/var/named";
        max-cache-size 100m;
        dump-file       "/var/named/data/cache_dump.db";
        statistics-file "/var/named/data/named_stats.txt";
        memstatistics-file "/var/named/data/named_mem_stats.txt";
        secroots-file   "/var/named/data/named.secroots";
        recursing-file  "/var/named/data/named.recursing";
        allow-query     { localhost; 10.10.60.0/24;};

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

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

响应策略区域与此转发器设置一起使用。 绑定将首先查询本地响应策略区域。 如果在RPZ中找不到DNS记录,则该请求将被转发到上游DNS解析器。

配置区域传输

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

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

sudo nano /etc/named.conf

将从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 伪指令将使RPZ区域更改时,主DNS解析器向从属解析器发送通知消息。 保存并关闭文件。 重新启动BIND,以使更改生效。

sudo systemctl restart named

如果主DNS解析器上运行着防火墙,则需要允许从DNS解析器连接到端口53。

sudo firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="12.34.56.78" accept"
sudo systemctl reload firewalld

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

sudo nano /etc/named.conf

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

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

然后在此文件的末尾添加一个从属RPZ区域。 更换 11.22.33.44 使用主DNS解析器的IP地址。

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

保存并关闭文件。

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

sudo firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="11.22.33.44" accept"
sudo systemctl reload firewalld

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

sudo named-checkconf

如果未发现错误,请重新启动BIND。

sudo systemctl restart named

BIND重新启动后,区域传输将立即开始。 使用以下命令检查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)

区域文件将另存为 /var/named/rpz.local 在从属解析器上。

注意: 每当您修改主解析器上的RPZ区域时,都需要更新序列号。 使其更大,以便从属解析器知道RPZ区域已更改。

创建多个RPZ区域

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

sudo nano /etcnamed.conf

添加一个新的RPZ区域。

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

在此文件的底部为新区域添加定义。

zone "rpz.local.notransfer" {
    type master;
    file "/var/named/rpz.local.notransfer";
    allow-query { localhost; };
    allow-transfer { localhost; };
};

保存并关闭文件。 然后,我们需要创建区域文件。 代替从头创建区域文件,我们可以使用区域模板文件。 复制内容 named.empty 到一个新文件。

sudo cp /var/named/named.empty /var/named/rpz.local.notransfer

编辑区域文件。

sudo nano /var/named/rpz.local.notransfer

包起来

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

Sidebar