如何覆盖 ubuntu 中的默认 dns 配置以便 nslookup 返回静态值?

如何覆盖 ubuntu 中的默认 dns 配置以便 nslookup 返回静态值?

nslookup、dig 和 ping 为我返回不同的值。我希望 foo.bar.name 始终静态解析为我机器上的 localhost。

我使用了命令

host foo.bar.name

并编辑 /etc/hosts 以包含以下行

1.1.1.1 foo.bar.name foo

(其中 1.1.1.1 是我的主机的 IP 地址)

当我运行 ping 或 curl 时,它会按照我想要的方式运行。

但是当我运行 dig 或者 nslookup 时,foo.bar.name 地址的解析完全不同。

我错过了什么?

我需要修改哪些配置才能确保该特定主机上的 DNS 解析按照我所述的方式进行。

答案1

pingcurl和所有其他应用程序实际上并不直接使用 DNS – 它们使用操作系统提供的“gethostbyname”函数,然后调用多个提供程序。其中一个是“dns”(与 DNS 服务器通信),另一个是“files”(即/etc/hosts);可以有使用其他协议的其他提供程序。它们都是通过 进行配置的/etc/nsswitch.conf

同时dig,,hostnslookup从根本上DNS 客户端 – 它们绕过操作系统的“gethostbyname”函数,而是直接制作和发送 DNS 数据包。(它们是专门以这种方式编写的。)因此,它们还会跳过/etc/hosts任何其他名称解析机制,并且您无法配置任何内容来“修复”此问题。

(操作系统本身不会检查每个 UDP 数据包以检查其是否是 DNS,也不会仅仅因为这个就从 /etc/hosts 注入虚假的 DNS 回复。)

确保 &c. 遵守 /etc/hosts 的唯一方法dig是设置一个实际的DNS 服务器让应用程序与之对话,从而提供所需的静态回复。例如,域名系统将充当 DNS 缓存/代理,并默认从 /etc/hosts 加载静态数据。此外,Unbound 具有广泛的“本地数据”配置,尽管它无法直接读取 /etc/hosts。

配置好 dnsmasq 或 Unbound 后,指向/etc/resolv.conf127.0.0.1(或 dnsmasq 正在运行的任何其他主机)。

答案2

我需要修改哪些配置才能确保该特定主机上的 DNS 解析按照我所述的方式进行。

您可以设置轻量级 DNS 转发器,例如unbound可以在其中覆盖任何 DNS 记录。

使用您的示例,它在配置中看起来unbound像:

local-zone: "foo.bar.name" redirect
local-data: "foo.bar.name A 1.1.1.1"

如果您想覆盖外部 DNS,您可以使用:

local-data: "www.google.com.  1800  IN  A    172.16.34.12"
local-data: 'www.google.com.  7200  IN  TXT "My own TXT record for text"'
local-data-ptr: "172.16.34.12        www.google.com"

完成设置后,请使用以下方法进行测试:如果新的解析器工作正常,则通过更改以下行将dig @127.0.0.1 foo.bar.name a
其设置为系统范围:nameserver/etc/resolf.confnameserver 127.0.0.1

附言

一些 Debian 基础发行版会安装dnsmasqDNS 缓存器。如果您要使用,unbound请关闭dnsmasq

答案3

系统默认检查 /etc/hosts 然后使用名称服务器。你所做的完全没问题。只是有些程序被设计为直接与名称服务器对话,即 和hostnslookupdig就是为什么你会得到不同的结果。

相关内容