在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