我搜索了 google.com 但找不到答案...所以我在这里询问。
这就是问题:
我在我的电脑上建立了一个DNS测试环境,其主机名是gamepc
。
DNS 服务器 (bind9) 有一个通配符记录:
* IN A 192.168.0.1
/etc/resolv.conf 文件有一个条目:
domain bogus.
nameserver 127.0.0.1
因此当我 ping 时somehost
它将返回如下内容:
PING somehost.bogus (192.168.0.1) 56(84) bytes of data.
64 bytes from gamepc.bogus (192.168.0.1): icmp_req=1 ttl=64 time=0.042 ms
...
当我 ping 时google.com
它会返回如下内容:
PING google.com (74.125.71.99) 56(84) bytes of data.
64 bytes from hx-in-f99.1e100.net (74.125.71.99): icmp_req=1 ttl=51 time=68.0 ms
...
到目前为止一切都很好。但是如果我 ping 一些不存在的域,例如sldfjsldjflksdjf.com
它仍然会返回如下结果:
PING sldfjsldjflksdjf.com.bogus (192.168.0.1) 56(84) bytes of data.
64 bytes from gamepc.bogus (192.168.0.1): icmp_req=1 ttl=64 time=0.043 ms
...
预期结果应该是:
ping: unknown host sldfjslkdfjlksdjfklsdjf.com
我能想象这是怎么发生的。起初解析器尝试sldfjslkdfjlksdjfklsdjf.com
但未得到NXDOMAIN
响应。然后它附加域部分并重试sldfjslkdfjlksdjfklsdjf.com.bogus
。这次主机名与 DNS 服务器中的通配符记录匹配并返回192.168.0.1
...
有人遇到过同样的问题吗?你是如何解决的?
非常感谢您的阅读!
答案1
有人有同样的问题吗?
每个人都有这个问题。标准件大多数 DNS 客户端库都使用它。它被称作域搜索路径或者DNS 搜索路径或者DNS 委托。
您是如何解决这个问题的?
通过使用完全限定域名在我所期望的地方。你是不是使用 FQDN。
浏览器不使用 FQDN 来解析主机域名
这是您第一次提到 WWW 浏览器。您在问题中没有提到它。WWW 浏览器很奇怪,尤其是因为它们有两个(有时更多)域搜索路径,一个在另一个之上运行。 人们做正是出于这个原因,在 URL 中使用完全限定的域名。 如果您要设置 DNS 客户端库,使其搜索路径机制能够成功将名称映射到地址,那么您也必须这样做。这是您选择使用搜索路径和通配符来匹配整个子树中的所有内容的结果。 必须思考关于使用通配符。
答案2
从man resolv.conf
:
domain Local domain name.
Most queries for names within this domain can use short names relative
to the local domain. If no domain entry is present, the domain is
determined from the local hostname returned by gethostname(2); the domain
part is taken to be everything after the first '.'. Finally, if the
hostname does not contain a domain part, the root domain is assumed.
search Search list for host-name lookup.
The search list is normally determined from the local domain name;
by default, it contains only the local domain name. (...)
因此,如果您查询,sldfjslkdfjlksdjfklsdjf
则 bind 找不到匹配的记录,因此您的解析器会尝试sldfjslkdfjlksdjfklsdjf.bogus
,然后返回一个地址。
如果您 ping 成功sldfjslkdfjlksdjfklsdjf.
(注意末尾的点),则应该没问题(即查找将失败)。末尾的点表示您提供了主机的 FQDN,因此不应尝试任何域后缀。
答案3
由于您的 DNS 配置中有通配符,我认为您无法真正解决这个问题。
当不使用通配符时,您将收到错误消息,但使用通配符和 resolv.conf 选项,所有未知内容都将解析为您的域。