语境
我在 LAN 上有一台机器,运行 dnsmasq 服务器,设置为仅监听私有 IP(机器 A,而不是路由器)。LAN
上的所有其他机器(包括机器 A)都使用 dhcpcd,将优先级 DNS 服务器设置为机器 A 的私有 IP,/etc/dhcpcd.conf
并将公共 DNS 作为后备。dnsmasq
服务器在这里的唯一目的是提供适合内部使用的顶级域名映射到同一网络中的所有机器,公共域按原样从上游(后备)服务器解析(无黑名单/白名单)。
网络上的所有机器都运行某种形式的 Linux。
最后也是最重要的部分是,私有网络上的所有机器都可以在每台机器上运行 OpenVPN 隧道,并且仍然有望到达内部域。
/etc/dnsmasq.conf
机器A
domain-needed
listen-address=::1,127.0.0.1,192.168.1.1
cache-size=0
server=9.9.9.9
local=/private/
address=/websitea.private/192.168.1.1
address=/websiteb.private/192.168.1.2
/etc/dhcpcd.conf
网络上所有机器的尾部
# Don't attempt to obtain an IPv4LL address if we failed to get one via DHCP. See RFC 3927.
noipv4ll
# Additional config
static domain_name_servers=192.168.1.1 9.9.9.9
问题
使用上述设置,使用 dnsmasq 实例(机器 A)作为优先 DNS 提供商的客户端(机器 B、C..)最终会因机器 A 和客户端之间的公共 IP 差异而导致 DNS 泄漏。
另一方面,如果首先指定公共 DNS 提供商,DNS 名称解析不会在NXDOMAIN
响应(对于私有 TLD)的情况下与后备 dnsmasq 实例进行检查,它有时似乎最终可以在浏览器中解析,但这可能是由于优先级 DNS 超时造成的。
NXDOMAIN
如果以某种方式支持将公共流量的上游 DNS 提供商指定为优先名称服务器,并将私有 DNS 提供商指定为优先服务器响应时私有 TLD 的后备,那么所有这些问题都可以解决(据我所知,这/etc/resolv.conf
是无法实现的)。
存在问题的 DNS 泄漏示例
这泄漏了:
- 没有 VPN 连接的机器 B(192.168.1.2)查询 serverfault.com,机器 A(192.168.1.1)内部运行 VPN(10.80.0.1),泄漏是由于上游公共域名来源于 192.168.1.2->192.168.1.1->10.80.0.1->9.9.9.9
- 运行 VPN 隧道的机器 C(192.168.1.3)查询 serverfault.com,没有 VPN 连接的机器 A,由于公共域名来源为 192.168.1.3->10.80.0.1->192.168.1.1->9.9.9.9 而发生泄漏
这不:
- 机器 D (192.168.1.4) 和机器 A 均未运行任何 VPN 隧道
- 机器 E(192.168.1.5)将公共 DNS 提供商定义为优先名称服务器(通过使用 OpenVPN
--setenv foreign_option_0 "dhcp-option DNS 9.9.9.9
或/etc/dhcpcd.conf
),机器 A 隧道状态无关紧要,这可能会偶尔解析私有域(可能是由于优先 DNS 超时)
我正在寻找的内容的简短摘要
将 dnsmasq 设置为内部 DNS,同时声明客户端连接到它,仅将其用于内部顶级域名所有公共 DNS 流量都直接通过公共 DNS 提供商路由,无需内部 DNS 服务器当前的公共 IP 充当中间人
或者
如果域查询请求返回NXDOMAIN
(和/或是一个内部顶级域名)。