根据手册页,host
应该查询“列出的服务器/etc/resolv.conf
”,但它仅使用该文件中的第一个条目:
thefourthtower:$cat /etc/resolv.conf
nameserver 8.8.8.8
nameserver 8.8.4.4
nameserver 192.168.1.254
domain gateway.2wire.net
search gateway.2wire.net
thefourthtower:$host thefourthtower
Host thefourthtower not found: 3(NXDOMAIN)
thefourthtower:$host thefourthtower 192.186.1.254
thefourthtower.gateway.2wire.net has address 192.168.1.74
该2wire
位来自 2Wire 调制解调器/路由器。AT&T(或 2Wire?)为该设备配备了非常差的固件,其 DNS 服务器(缓存)通常比 Google Public DNS 慢,而 AT&T 自己的 DNS 服务器不稳定(没有备用服务器选项)使这一问题更加严重。
我可以获得host
或nslookup
使用进一步的/etc/resolv.conf
条目吗(并避免手动指定服务器)?
或者,唯一的解决方案是手动映射主机/etc/hosts
,并给定所需的条目顺序resolv.conf
?
更新
上述内容并不意味着我认为 Google 的名称服务器应该了解我的本地主机。
我在问:是否可以将某个名称服务器仅用于本地名称(因为像“thefourthtower”这样的名称必须是本地的)?
答案似乎是不,而且我必须在我的计算机上运行一个名称服务器,因为现存的本地名称服务器太差了。
答案1
该host
命令使用解析器库,该库按顺序使用 /etc/resolv.conf 中的名称服务器条目,但仅在发生故障时使用。多个条目的目的是为了冗余,以防主服务器因某种原因发生故障。但如果主服务器提供响应,无论是正面的还是负面的(例如 NXDOMAIN),则不使用其他名称服务器条目。您最多可以有三个,以实现三重冗余。
外部名称服务器(如 Google)不会知道您的本地主机名。您应该将这些名称放入 /etc/hosts 文件中,或运行本地名称服务器。运行本地名称服务器的优点是可以缓存 DNS 查找,从而使将来或重复查找的速度更快。
我用域名系统作为本地 DNS 和缓存。这确实很有帮助。只需将您的设置/etc/resolv.conf
为使用127.0.0.1
第一个(或唯一)名称服务器,并配置 dnsmasq 以使用您的 ISP 上游服务器。即使您的 ISP 速度很慢,您的本地缓存也会在大多数时间进行补偿。
答案2
/etc/resolv.conf
如果他们不知道您的 LAN 上的主机或本地使用的域,请删除前两个名称服务器条目。
NXDOMAIN 响应可能是因为gateway.2wire.net
它不是一个可以在互联网上使用的注册域名。
$ dig gateway.2wire.net any
; <<>> DiG 9.3.6-P1-RedHat-9.3.6-4.P1.el5_5.3 <<>> gateway.2wire.net any
;; global options: printcmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 7984
;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 0
;; QUESTION SECTION:
;gateway.2wire.net. IN ANY
;; AUTHORITY SECTION:
2wire.net. 1200 IN SOA ns1.2wire.com. hostmaster.2wire.com. 2007041700 3600 600 604800 1200
;; Query time: 209 msec
;; SERVER: 10.0.0.9#53(10.0.0.9)
;; WHEN: Tue Aug 30 13:29:23 2011
;; MSG SIZE rcvd: 95
请注意,的权威名称服务器2wire.net
说没有这样的域名gateway.2wire.net
。我猜这只是 2wire 产品在 LAN 级别使用的便利。
8.8.8.8 是 Google 名称服务器,不应期望它了解您的私有 LAN 上的主机以及您的 2wire 路由器所做的有些奇怪的配置选择。
计算机 thefourthtower 的名称应该出现在它自己的/etc/hosts
表中(您应该安排在 DNS 之前查阅该表),并且您的 LAN(即您的 2wire 路由器)上的 DNS 名称服务器确实应该知道该名称。
/etc/nsswitch.conf
你的包含吗hosts: files dns
?
答案3
您可以使用以下代码来查询全部/etc/resolv.conf 中的名称服务器:
grep '^nameserver' /etc/resolv.conf | cut -c 12- | xargs -i host [HOSTNAME] {}
或者,如果你愿意的话dig(1)
:
grep '^nameserver' /etc/resolv.conf | cut -c 12- | xargs -i dig @{} [HOSTNAME]