Ubuntu服务器无法解析局域网主机名。

有点卡住了。
我有两台机器无法解析局域网主机名,除非在/etc/hosts中有具体的条目。
但是局域网上的其他机器可以解析主机名。
我的局域网:
1x运行DD-WRT v24-sp2的Cisco路由器,启用了DNSMasq。我已经在路由器上配置了主机名和IP地址。
1x Kubuntu 12.10(只要它们被输入到路由器的DNSMasq中,就可以正确解析所有主机名)。
2x NAS(也可以正确解析所有名称)。
1x Ubuntu Server 12.04(除非将它们输入到/etc/hosts中,否则无法解析本地主机名)。
1x XBMCLive(Dharma)(同样的情况-除非在/etc/hosts中有条目,否则无法解析)。
如何让最后两个机器使用路由器上的DNSMasq条目?每台机器都设置为使用路由器作为名称服务器,并且所有设备都能够正确解析外部地址。
谢谢。
一些更多信息:
在服务器上,如果我ping另一台电脑(工作站)
$ ping wstation
PING wstation.local.domain (x.x.x.x) 

如果我接下来添加.local
$ ping wstation.local
PING wstation.local.local.domain (x.x.x.x)

和直接

$ ping 10.0.0.4
PING 10.0.0.4 (10.0.0.4) 56(84) bytes of data.
64 bytes from 10.0.0.4: icmp_req=1 ttl=64 time=0.387 ms
64 bytes from 10.0.0.4: icmp_req=2 ttl=64 time=0.316 ms
64 bytes from 10.0.0.4: icmp_req=3 ttl=64 time=0.312 ms
64 bytes from 10.0.0.4: icmp_req=4 ttl=64 time=0.280 ms
64 bytes from 10.0.0.4: icmp_req=5 ttl=64 time=0.322 ms
^C
--- 10.0.0.4 ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 3998ms
rtt min/avg/max/mdev = 0.280/0.323/0.387/0.038 ms                                                                       

我不知道答案,也不确定这是否有帮助,但是以防你不知道...我发现如果在机器名后面添加“.local”,它会被找到而无需任何配置。这对我很有帮助,因为我需要指定地址,但是当我添加或删除用于测试的操作系统时,我需要不断更改条目。但是,通过指定machinename.local,我不再需要担心了。如果你知道这是从哪里来的,请随时告诉我。 :) - Marty Fried
1嗨马蒂,谢谢你的回答。我已经添加了一些更多的信息来展示在.local上发生了什么问题。 - teracow
3个回答

关于您当前的输出
ping wstation
PING wstation.local.domain

明显表明您的计算机正在将“.local.domain”附加到非FQDN查询中。这是配置不正确或设置错误的问题(除非您确实有意使用“.local.domain”后缀)。

名称解析和句点

许多人不知道的一个重要事项是,完整的名称应始终以句点(.)结尾。如果省略它,计算机将尝试在本地搜索域内解析它(例如mydomain.tld)。因此,在这种情况下,对于mypc.local的查询将变为mypc.local.mydomain.tld。为了防止这种情况发生,请在查询中包含句点。

解析器配置

解析器配置在这里非常重要。在Ubuntu(和Debian)中,这是在文件/etc/network/interfaces中配置的(假设您没有运行NetworkManager):

iface eth0 inet static
   address 192.168.3.3
   netmask 255.255.255.0
   gateway 192.168.3.1
   dns-nameservers 192.168.3.45 192.168.8.10
   dns-search foo.org bar.com                      # <-- these are the search domains

在Linux中,名称解析也可以通过其他方式完成。不仅仅是查询本地DNS服务器来进行所有这些操作。请查看您的/etc/nsswitch.conf文件以获取解析的hosts配置信息。
hosts:          files mdns4_minimal [NOTFOUND=return] dns mdns4

这意味着首先尝试文件(这是/etc/hosts文件),然后是mDNS,最后才会查询真正的DNS服务器。在Linux中,mDNS使用Avahi实现,在Apple设备上称为Bonjour。它默认使用.local后缀,并通过广播消息进行工作。就像ARP一样工作,但用于DNS。
所有这些系统都可能非常令人困惑,特别是在常规DNS设置中混合了mDNS设备时更加复杂。我猜这就是为什么你现在感到困惑,为什么一个设备能工作而另一个设备不能工作:它们并不都使用相同的解析方法。

为了搞清楚事情

  • 除非您完全依赖mDNS,否则避免使用.local。从您的问题中我了解到您希望将事物配置在一个集中的地方,所以我的方法是避免使用它。
  • 配置您的本地DNS服务器(在您的情况下是DD-WRT设备)使用特殊的域名,例如my.home。对于dnsmasq来说,这是一个单一的设置,但在常规设置中,这应该在DNS服务器和DHCP服务器上都进行配置(因为它通过DHCP进行通告)。
  • 配置所有计算机具有简单且唯一的主机名称。它们在请求DHCP时使用此名称,并且此名称用于您的路由器上运行的dnsmasq以解析它们。或者,手动配置它们,以免依赖DHCP。
  • 如果您之前对/etc/resolv.conf进行了调整,请删除任何剩余的配置。
  • 配置您网络中的计算机以使用my.home作为本地搜索域。这可以通过DHCP自动完成,或者如果使用静态地址,则可以通过/etc/network/interfaces文件或Network Manager进行配置:

    enter image description here

  • 现在,简单名称解析(ping hostname)和完整名称解析(ping hostname.my.home)都应该正常工作。

5哇!gertvdijk的答案太棒了!非常全面。如此之详细,我需要一些时间来理解你所说的内容。我可以说我用一个点在主机名后进行了ping测试,结果正常。对于固定机器,我在此局域网上不使用DHCP。我从未在任何设备上配置过.local设置,因为我不明白它是关于什么的。根据你的指示,我会进一步调查,并回复你。 - teracow
非常感谢您提供的全面回答。我已经修改了/etc/nsswitch.conf文件,使得在mDNS之前尝试DNS解析files mdns4_minimal [NOTFOUND=return] dns mdns4。现在一切都按照我预期的方式运行,与我的(命名不当的)host.foo.local地址的机器相匹配。在此更改之前,ping hostname可以正常工作,但ping hostname.foo.local却无法成功。当我发现dig hostname失败而dig hostname.foo.local返回结果时,我感到非常困惑,这与我的预期相反。现在我可以如预期地对完全限定域名进行ping操作。将顺序设置为这样是否会有不利影响? - TafT

根据gertvdijk的回答,我只是在nsswitch.conf文件中注释掉了那一行。
sudo vim /etc/nsswitch.conf

.
.
.
hosts:          files dns # mdns4_minimal [NOTFOUND=return] dns

我遇到了类似的问题,/etc/hosts 文件中的 IP 和主机名之间有多个空格,而不是使用制表符。修改为制表符后,可以通过 ping 解析主机名。
127.0.0.1        test.local
         ^^^^^^^^ → Should be a TAB not multiple spaces.

请参阅https://superuser.com/a/938366/467479上的内容。

4对不起,那是错误的。hosts文件可以使用空格或制表符。此外,127.0.0.1应该首先是localhost,然后是localhost.localdomain,还有根据你的设置可能是你的机器主机名。(某些设置,如Ubuntu/Debian要求将主机名放在127.0.1.1行上)虽然可以在hosts文件中安装任何.local地址,但我不建议这样做,因为它们会与mDNS/Avahi冲突。 - The Dude
1如果您的域上有Windows机器,显然它使用的是单播DNS,这与Avahi或Zeroconf mDNS实现不兼容。此外,请检查您的/etc/nsswitch.conf文件,看看它是否在mdns4_minimal [NOTFOUND=return]之后退出或进行完整的mdns4查找(将其移回)。另外,请不要配置任何DNS服务器使用.local域,因为mDNS/sd-DNS解析器会掩盖对该域的查找。对于您的内部DNS TLD,请使用.lan、.work、.home等(但不要使用新的TLD,如.biz、.xyz、.web等)。祝您好运,并欢迎来到有趣的DNS解析世界。 - The Dude