本教程将向您展示如何使用 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 地址,这样您就不必外出上网然后返回到您的本地网络以访问 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 解析器启动并运行,请按照以下说明进行操作。
如何在 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/named/
. - 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; };
Save 和 close 文件。 然后创建 /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 客户端就不必为了连接到 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.
笔记 所有左手名称不得以点结尾,所有右手名称必须以点结尾。
Save 和 close 文件。 接下来,我们应该设置 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 解析。
配置区域传输
如果您有另一个 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
指令将使主 DNS 解析器在 RPZ 区域更改时向从解析器发送通知消息。 Save 和 close 文件。 重新启动 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; }; };
Save 和 close 文件。
您还需要配置从解析器的防火墙以允许主 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; }; };
Save 和 close 文件。 然后我们需要创建区域文件。 我们可以使用区域模板文件,而不是从头开始创建区域文件。 复制内容 named.empty
到一个新文件。
sudo cp /var/named/named.empty /var/named/rpz.local.notransfer
编辑区域文件。
sudo nano /var/named/rpz.local.notransfer
包起来
我希望本教程可以帮助您在 CentOS/RHEL 上设置响应策略区域/DNS 防火墙。 与往常一样,如果您发现这篇文章有用,请订阅我们的免费时事通讯以获取更多提示和技巧。 保重?