在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; };
建议对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; };
保存并关闭文件。 然后创建 /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.
注意 所有左手名称都不能以点号结尾,而所有右手名称都必须以点号结尾。
保存并关闭文件。 接下来,我们应该设置 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防火墙。 与往常一样,如果您发现这篇文章很有用,请订阅我们的免费新闻通讯以获取更多提示和技巧。 保重🙂