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
ping
、curl
和所有其他应用程序实际上并不直接使用 DNS – 它们使用操作系统提供的“gethostbyname”函数,然后调用多个提供程序。其中一个是“dns”(与 DNS 服务器通信),另一个是“files”(即/etc/hosts
);可以有使用其他协议的其他提供程序。它们都是通过 进行配置的/etc/nsswitch.conf
。
同时dig
,,host
和nslookup
从根本上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.conf
127.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.conf
nameserver 127.0.0.1
附言
一些 Debian 基础发行版会安装dnsmasq
DNS 缓存器。如果您要使用,unbound
请关闭dnsmasq
答案3
系统默认检查 /etc/hosts 然后使用名称服务器。你所做的完全没问题。只是有些程序被设计为直接与名称服务器对话,即 和host
。nslookup
这dig
就是为什么你会得到不同的结果。