我的设置变得越来越复杂,通常我倾向于将事物分成几部分,然后自己将它们组装在一起。但这次我似乎需要更多帮助才能让整个齿轮协同工作。这就是为什么用户 @Rui F Ribeiro 要求我将这个问题作为一个单独的问题提出。
我想实现什么目标?基本上我在互联网上发现的称为 DNS 防火墙。
我需要一个配置有以下功能的 BIND 服务器:
- 它希望它能够默认将所有请求转发到外部 DNS(在我的例子中 OpenDNS:208.67.222.222、208.67.220.220)
- 它不能在任何情况下查询根服务器,因为 OpenDNS 有一些有用的域阻止/操作功能。因此,如果我的绑定服务器开始随机向 OpenDNS 和根服务器询问,我每次都会得到不同的结果。(注意:由于各种原因,此转发必须在加密模式下完成,包括不被中间的其他服务器拦截和进一步操纵)
- 绑定服务器还必须充当缓存,可以将查询发送到 OpenDNS,但如果我已经有新鲜数据,则无需一次又一次查询,浪费带宽和时间。
- 这是我的另一个主要请求,这使我的配置变得更加复杂:我想设置一个包含大量域列表的 RPZ 区域,我不希望它们能够被解析,基本上我想让它们解析为 127.0.0.1 或我的局域网的另一个 ip/主机,这应该作为捕获-所有用于广告目的的http服务器等等。
我怎样才能实现如此复杂的配置?
这是我的配置文件,我想这里有些东西没有按需要工作,所以请帮助我进行配置。
命名配置文件
// 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.选项
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";
命名.conf.默认区域
// 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
因此,让我们检查一下您的所有愿望。我改变顺序只是为了首先解决更容易的问题。
1)BIND必须充当缓存。
这就是它默认所做的;无需配置任何东西。
2) 我们不会与根名称服务器交谈。
我看到你已经评论了根提示;现在,当我们与组织/家庭外部的 DNS 服务器通信时,我建议不要转发带有 IP 地址的请求。所以评论forward only;
和取消评论include "/etc/bind/zones.rfc1918";
3)这里的 RPZ 看起来不错。在中,rpz-foreign.db
您必须定义 DNS 名称/域正则表达式
www.domaintoblacklist.xxx CNAME myserver
或者
www.domaintoblacklist.xxx A 127.0.0.1
4)至于加密连接;我正在这样做域名加密。 DNS crypt 让您可以通过 TLS/SSL 与包括 OpenDNS 在内的多个 DNS 提供商讨论 DNS;另一个优点是人们无法监听或更改您的 DNS 请求。
最简单的安装方法是下载脚本dnscrypt 自动安装
要下载脚本,请执行以下操作:
git clone https://github.com/simonclausen/dnscrypt-autoinstall
该脚本是为独立的 dnscrypt 使用而完成的,因此在其之上使用 BIND 需要一些额外的工作。
那么开始吧:
./dnscrypt-autoinstall.sh
该脚本将询问一系列问题,包括您是否喜欢使用 DNS 服务。
它将更改您的 /etc/resolv.conf 以指向您的本地主机,即 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