Debian

僅將 BIND 配置為轉發器(無根提示),加密 + RPZ 黑名單/白名單一起

  • March 1, 2018

我的設置變得越來越複雜,通常我傾向於將東西分成幾部分並自己組裝在一起。但這一次我似乎需要更多的幫助才能讓整個齒輪一起工作。這就是為什麼使用者@Rui F Ribeiro 要求我將這個問題作為一個單獨的問題提出。


我想要達到什麼目的?基本上我在網際網路上發現的稱為 DNS 防火牆。

我需要一個配置了以下功能的 BIND 伺服器:

  • 它希望它能夠預設轉發所有對外部 DNS 的請求(在我的情況下為 OpenDNS:208.67.222.222、208.67.220.220)
  • 在任何情況下都不能查詢 ROOT-SERVERS,因為 OpenDNS 具有一些有用的域阻止/操作功能。因此,如果我的綁定伺服器開始隨機向 OpenDNS 和根伺服器詢問事情,我每次都會得到不同的結果。(注意:由於各種原因,此轉發必須在加密模式下完成,包括不會被中間的其他伺服器攔截和進一步操縱)
  • 綁定伺服器還必須用作記憶體,可以將查詢發送到 OpenDNS,但如果我已經有新數據,則無需一次又一次地查詢,浪費頻寬和時間。
  • **這是我的另一個主要要求,它使我的配置更加複雜:**我想設置一個包含大量域列表的 RPZ 區域,我不希望它們能夠被解析,基本上我想讓它們解析為 127.0。 0.1 或我的區域網路的另一個 ip/host 應該用作用於廣告目的的包羅萬象的 http 伺服器等等。

我怎樣才能實現如此復雜的配置?

這是我的配置文件,我想這裡的某些東西沒有必要,所以請幫助我進行配置。


命名.conf

// This is the primary configuration file for the BIND DNS server named.
//
// Please read /usr/share/doc/bind9/README.Debian.gz for information on the
// structure of BIND configuration files in Debian, *BEFORE* you customize
// this configuration file.
//
// If you are just adding zones, please do that in /etc/bind/named.conf.local

include "/etc/bind/named.conf.options";
include "/etc/bind/named.conf.local";
include "/etc/bind/named.conf.default-zones";

命名.conf.options

acl "trusted" {
       127.0.0.1/8;
       10.0.0.0/8;
       172.16.0.0/12;
       192.168.0.0/16;
       ::1;
};

options {

       directory "/var/cache/bind";    # bind cache directory

       recursion yes;                  # enables resursive queries

       allow-query { trusted; } ;

       allow-recursion { trusted; };   # allows recursive queries from "trusted" clients

       //listen-on { 0.0.0.0; };       # interfaces where to listen

       allow-transfer { none; };       # disable zone transfers by default

       // 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 http://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.

       forward only;

       forwarders {
               208.67.222.222;
               208.67.220.220;
       };


       //========================================================================
       // If BIND logs error messages about the root key being expired,
       // you will need to update your keys.  See https://www.isc.org/bind-keys
       //========================================================================

       dnssec-enable no;
       dnssec-validation no;
       dnssec-lookaside auto;


       auth-nxdomain no;               # conform to RFC1035
       #listen-on-v6 { any; };

       response-policy {
               zone "rpz-white" policy PASSTHRU; // my own white list
               zone "rpz-foreign";    // obtained from producer
       };

};

zone "rpz-white" {
 type master;
 file "/etc/bind/rpz-white.db";
};

zone "rpz-foreign" {
 type master;
 file "/etc/bind/rpz-foreign.db";
};

命名.conf.local

//
// Do any local configuration here
//

// Consider adding the 1918 zones here, if they are not used in your
// organization
//include "/etc/bind/zones.rfc1918";

named.conf.default-zones

// prime the server with knowledge of the root servers
//zone "." {
//      type hint;
//      file "/etc/bind/db.root";
//};

// be authoritative for the localhost forward and reverse zones, and for
// broadcast zones as per RFC 1912

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

zone "127.in-addr.arpa" {
       type master;
       file "/etc/bind/db.127";
};

zone "0.in-addr.arpa" {
       type master;
       file "/etc/bind/db.0";
};

zone "255.in-addr.arpa" {
       type master;
       file "/etc/bind/db.255";
};

因此,讓我們檢查一下您的所有願望。我正在更改順序只是為了先解決更容易的問題。

  1. BIND 必須充當記憶體。

這就是它預設的功能;無需配置任何東西。

  1. 我們不會與根名稱伺服器交談。

我看到你已經評論了根提示;現在,當我們與組織/家庭之外的 DNS 伺服器交談時,我建議不要轉髮帶有 IP 地址的請求。所以評論forward only;和取消評論include "/etc/bind/zones.rfc1918";

  1. 這裡的 RPZ 看起來不錯。在rpz-foreign.db您必須將 DNS 名稱/域正則表達式定義為
www.domaintoblacklist.xxx CNAME myserver

或者

www.domaintoblacklist.xxx A 127.0.0.1

4)關於加密連接;我正在用dnscrypt做。DNS crypt 讓您通過 TLS/SSL 與包括 OpenDNS 在內的多個 DNS 提供商討論 DNS;具有額外的優勢,人們將無法收聽或更改您的 DNS 請求。

最簡單的安裝方法是下載腳本dnscrypt-autoinstall

要下載腳本,請執行以下操作:

git clone https://github.com/simonclausen/dnscrypt-autoinstall

該腳本是為獨立的 dnscrypt 使用而完成的,因此在它之上使用 BIND 需要一些額外的工作。

所以開始:

./dnscrypt-autoinstall.sh

該腳本將詢問一系列問題,包括您喜歡使用的 DNS 服務。

它會將您的 /etc/resolv.conf 更改為指向您的 localhost 和 dnscrypt。您必須將 resolv.conf 更改為 BIND。稍後再談。

在 localhost 你的 BIND 會聽;並且dnscrypt-proxy守護程序將監聽 127.0.0.2 和 127.0.0.3。dnscrypt-proxy將是與 opendns 伺服器交談的人。

轉發器 BIND 也必須配置為與dnscrypt

options {
 ...
   forwarders {
           127.0.0.2;
           172.0.0.3;
   };
 ...

}

我還編輯了 /etc/init.d/dnscrypt-proxy 並將 127.0.0.1 的行更改為 127.0.0.3

$DAEMON --daemonize --ephemeral-keys --user=dnscrypt --local-address=127.0.0.3 --resolver-address=$ADDRESS1 --provider-name=$PNAME1 --provider-key=$PKEY1

腳本也發生了變化/etc/resolv.conf;您必須將其更改為指向 BIND/0.0.0.0(在 DNS 術語中也稱為 127.0.0.1)

chattr -i /etc/resolv.conf

並編輯它。

完成:

service dnscrypt-proxy restart
service bind9 restart

加密配置完成後:

  • 使用 BIND 作為記憶體的客戶端
  • BIND 將與仍然使用“正常”DNS 協議的兩個 dnsproxy 實例進行通信
  • dnsproxy 通過 443/UDP 和 443/TCP 加密的 DNS 與選定的提供商交談。

如果要監視到外部的數據包:

sudo tcpdump -n port 443

引用自:https://unix.stackexchange.com/questions/270716