我不太清楚如何准确地表达我需要什么,这使搜索变得具有挑战性。:) 基本上,我在 RackSpace 实例上运行了 Bind DNS,并且我想设置命名,以便我的任何客户端都可以递归查询,而不会冒开放解析器的风险。
所有客户端都是基于 Linux 的,但 Android 移动客户端配置起来有点困难。我知道我可以在笔记本电脑和网关上设置 Bind 的缓存实例,这可能允许某种形式的基于密钥的递归请求身份验证。但我不确定这在 Android 客户端上是否可行。
请注意,我知道我可以使用各种公共解析器,例如 Google 提供的解析器,但出于与此无关的原因,我需要尽可能通过自己的服务器运行客户端请求。我尝试过仔细阅读手册页和在线文档,但我不清楚我到底需要查找什么。
----- 更多信息请见评论。-----
客户端不通过 VPN 连接,出于某些原因,我正努力避免这种情况。其中一个原因是,即使是轻量级、低安全性 VPN 的额外内存占用和 CPU 负载,在最实惠的云实例上也是一项挑战。第二个原因是,在我见过的几乎所有 Android 实现中,VPN 都增加了一层复杂性,如果不是真正需要安全性的话,这非常烦人。
我并没有“固守”使用 Bind 作为名称服务器的原则。如果还有其他 FOSS 名称服务器可能在这个特定情况下更有用,我很乐意尝试一下。我只是花了 15 年以上的时间使用 Bind,不再考虑其他选择。
我也不太担心有人试图破解我客户端的 DNS 响应。如果我们生活在一个 DNS 系统设计为这样的世界里,我很乐意运行一个开放解析器。可惜的是,各种不法之徒都倾向于滥用我的开放解析器来攻击第三方。
我在这里运行的并不是“任务关键型”网络。它只有少数人使用,不是为了经济或个人利益,而是为了实验、开发和测试。
答案1
您可以在 BIND 解析器上使用基于 TSIG 的访问控制来实现这一点。这适用于能够实际使用 TSIG 的客户端,这可能仅限于那些自己运行本地 BIND 实例的客户端。
看http://www.cyberciti.biz/faq/unix-linux-bind-named-configuring-tsig/和http://ftp.isc.org/isc/bind9/cur/9.10/doc/arm/Bv9ARM.ch04.html#id2570685。
请注意,这使得对您的解析器发起拒绝服务攻击变得非常容易,因为解析器会被迫验证大量虚假签名。
总的来说,我强烈建议不要在互联网上为客户运行自己的解析器。它只在特殊情况下才有效,而且根本没有任何合理的用例。您的 DNS 查询不应包含敏感数据,否则您做错了。如果您的 ISP 的解析器太不可靠或不存在,请使用 OpenDNS 或 Google Public DNS(如果没有必要,我宁愿不使用这些)。
如果有的话,请在可以的情况下运行本地 BIND(或者更确切地说是不受约束的)解析器,启用 DNSSEC 并签署您的区域。
答案2
我不相信您可以根据客户端运行的操作系统进行过滤。但是如果您知道客户端(或缓存服务)连接的 IP,则可以使用如下 ACL:
acl "trusted" {
192.168.0.0/16;
10.153.154.0/24;
localhost;
localnets;
};
options {
...
allow-query { any; };
allow-recursion { trusted; };
allow-query-cache { trusted; };
...
};
答案3
下面的这个方法不适用于 Android,但在 GNU/Linux 客户端上效果很好。从技术上讲,它涉及设置 VPN,但不需要实际设置,您的实际网络流量也不会转到远程服务器(当然,除了您的 DNS 查询,它会转到远程服务器——这就是重点!),因此远程服务器上的负载很小。如果您有远程服务器的 ssh 访问权限,那么您可以这样做。
在 Rackspace 实例上(我将其称为 remote-server.com):确保 sshd 和 named 正常工作。
在 Linux 客户端上:
sudo apt install sshuttle ### or dnf install sshuttle, or whatever
sshuttle --dns -r [email protected] 192.0.2.0/24
这将设置一个 VPN,将所有 DNS 查询以及发送到 192.0.2.0/24 的所有网络流量路由到远程服务器。但 192.0.2.0/24 是一个 IP 地址黑洞 (RFC 5737),因此实际上没有实际的网络流量发送到远程服务器。但是,DNS 查询将要被发送到远程服务器。