我想在我位于 example.com 的自托管服务器上维护一个 DNS 隧道。我还有一个 DNS 服务器,它为 example.com 提供一切服务。我目前在域 tunnel.example.com 上使用dns2tcp进行 DNS 隧道传输。 NSD3用于为权威区域提供服务,因为它既简单又安全。
但是,我只有一个公共 IPv4 地址,这意味着 NSD 和 dns2tcp 不能监听同一个 IP/端口。
所以我目前正在使用PowerDNS Recursor使用这样的forward-zones
参数:
forward-zones-recurse=tunnel.example.com=1.2.3.4:5354
forward-zones=example.com=1.2.3.4:5353
这使得对权威区域的请求能够被请求到正确的服务器,以及隧道请求。NSD 监听 5353 端口,dns2tcp 监听 5354 端口。
然而,这很糟糕,因为递归需要打开。它实际上回答了任何递归查询。
你有什么解决办法吗?我真的更喜欢不涉及设置 BIND 的解决方案,但如果您有心情说服我,请毫不犹豫地这样做;)
编辑:我将标题更改为更清楚。
两台服务器不能同时监听同一个 IP+端口组合。
你为这样一个有两个后卫的野兽所做的任何事情都是Hackery——这是错误的,不应该做的。痛苦、悲伤、疯狂和死亡横亘在这条路上——现在回头,否则你会被一只咕噜咕噜吃掉。
正确的解决方案
获取另一个IP。理想情况下完全获得另一台服务器,并且不要在与权威服务器相同的机器上运行递归 DNS。
简单的解决方案
克服对 BIND 的恐惧/不信任/仇恨(获取DNS 和 BIND的副本并做好准备),并使用该
allow-recursion{…};
指令来限制可以进行递归查询的人员。这个简单的解决方案可能仍然会让您面临缓存中毒和其他问题。如果你真的想要你的权威 DNS 服务器的安全,你需要运行一个单独的名称服务器进程来监听一个单独的 IP 地址,最好是在一个单独的主机(或监狱,VM,等等)上。
2021 年更新
来自(见下文)的
string
模块的解决方案不能用 翻译,所以我不得不找到另一个解决方案。iptables
nftables
我现在正在使用dnsdist,它是一个 DNS 负载平衡器。它使用更多的 CPU 和 RAM,但显然更强大。我喜欢它专注于这项任务,除非有要求,否则无需重写 DNS 答案。这是我的配置文件的摘录:
原始 2012 解决方案
我找到了解决问题的方法。但是,它不是该问题的通用解决方案。
在我的例子中,我依赖于 dns2tcp 使用的协议,它使用 tunnel.example.com 上的子域请求进行通信。所以想法是匹配包含此类请求的数据包,并构建一个 netfilter 规则:
hex-string
参数是对应tunnel.example.com
于 DNS 数据包中所见的字符串。from 42
确保只有子请求被重定向到 dns2tcp,而不是域本身的常规请求,例如 SOA 或 NS 请求。这并不完美,但它确实比以前使用了更少的软件。