我想设置一个可以执行两项操作的基本 DNS 转发器。
首先,它只是将 DNS 查询转发到上游。其次,如果上游 DNS 服务器无法解析主机名,则此 DNS 转发器应返回垃圾 IP 地址,例如127.255.255.255
或100::
。
其结果可能是所有主机名都应始终解析,但通常无法解析的主机名会被解析为垃圾 IP 地址。
例如,如果我有两个主机名:resolvable
上游 DNS 服务器知道哪个主机名位于1.2.3.4
;notresolvable
上游 DNS 服务器不知道哪个主机名的 IP 地址。如果我使用这两个主机名查询转发的 DNS,resolvable
则会返回1.2.3.4
并且notresolvable
会返回127.255.255.255
(而不是未找到)。
Hostname: resolvable notresolvable
| / \ | / \
| | | |_________
\ / | \ / |
DNS Forwarder: forward found forward not __\ use garbage ip
upstream ip=1.2.3.4 upstream found / ip=127.255.255.255
| / \ | / \
| | | |
\ / | \ / |
Upstream DNS found ip=1.2.3.4 not found
server:
我最接近实现这个系统的方法就是使用 dnsmasq。dnsmasq 默认向上游发送 dns 查询,因此它可以满足我的第一个要求。
我还可以address=/#/127.255.255.255
在末尾添加/etc/dnsmasq.conf
,然后将所有主机名解析为垃圾 IP 地址。但是,这也会解析上游 DNS 服务器可以解析的主机名,这不是我想要的。
阅读后dnsmasq 手册页我在地址部分找到了这个:
域中的查询永远不会被转发
这表明我需要的东西无法通过 dnsmasq 实现。
所以我的问题是,哪个程序最适合实现这种设置以及我该如何进行?
编辑:上下文
我有一个在 Docker 容器内运行的应用程序,它使用 Docker 网络通过主机名与其他 Docker 容器连接。
我试图解决的问题是,如果主机名无法解析(如果它引用的容器没有运行就会发生这种情况),则应用程序将无法启动或继续运行。
因此,我上面提到的 DNS 服务器将是与 docker 容器内的应用程序一起运行的服务器。
我还删除了对的引用,resolv.conf
因为似乎没有必要让它工作。dns 服务器只需转发到 docker 的内部 dns 服务器,而该服务器恰好在 中列出resolv.conf
。