僅將 BIND 配置為轉發器(無根提示),加密 + RPZ 黑名單/白名單一起
我的設置變得越來越複雜,通常我傾向於將東西分成幾部分並自己組裝在一起。但這一次我似乎需要更多的幫助才能讓整個齒輪一起工作。這就是為什麼使用者@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"; };
因此,讓我們檢查一下您的所有願望。我正在更改順序只是為了先解決更容易的問題。
- BIND 必須充當記憶體。
這就是它預設的功能;無需配置任何東西。
- 我們不會與根名稱伺服器交談。
我看到你已經評論了根提示;現在,當我們與組織/家庭之外的 DNS 伺服器交談時,我建議不要轉髮帶有 IP 地址的請求。所以評論
forward only;
和取消評論include "/etc/bind/zones.rfc1918";
- 這裡的 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