ubuntu 服务器无法解析 LAN 主机名

ter*_*cow 16 hostname hosts lan dnsmasq

有点卡在这里。

我有 2 台机器无法解析 LAN 主机名,除非 /etc/hosts 中有特定条目

但是局域网上的其他机器可以解析主机名。

我的局域网:

  • 1 x Cisco 路由器运行 DD-WRT v24-sp2,启用 DNSMasq。我已经使用 LAN 上的主机名和 IP 对其进行了配置。
  • 1 x Kubuntu 12.10(只要将所有主机名输入到路由器上的 DNSMasq 中,它们就会正确解析)
  • 2 x NAS(也可以正确解析所有名称)

  • 1 x Ubuntu Server 12.04(这不会解析本地主机名,除非它们被输入到 /etc/hosts)

  • 1 x XBMCLive (Dharma)(相同 - 除非条目在 /etc/hosts 中,否则无法解析)

如何让最后 2 个使用路由器上的 DNSMasq 条目?每台机器都设置为使用路由器作为名称服务器,并且所有单元都正确解析外部地址。

谢谢。

更多信息:

在服务器上,如果我 ping 另一台 PC (wstation)

$ ping wstation
PING wstation.local.domain (x.x.x.x) 
Run Code Online (Sandbox Code Playgroud)

如果我然后附加.local

$ ping wstation.local
PING wstation.local.local.domain (x.x.x.x)
Run Code Online (Sandbox Code Playgroud)

并直接

$ 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                                                                       
Run Code Online (Sandbox Code Playgroud)

ger*_*ijk 18

关于您当前的输出

ping wstation
PING wstation.local.domain
Run Code Online (Sandbox Code Playgroud)

清楚地表明您的电脑正在附加.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
Run Code Online (Sandbox Code Playgroud)

Linux 中的名称解析也可以通过其他方式完成。这不仅仅是因为所有这些都在查询本地 DNS 服务器。查看您的/etc/nsswitch.conf文件以hosts了解解析的配置:

hosts:          files mdns4_minimal [NOTFOUND=return] dns mdns4
Run Code Online (Sandbox Code Playgroud)

这意味着首先尝试文件(这是/etc/hosts文件),然后是 mDNS,然后才查询真正的 DNS 服务器。mDNS 在 Linux 中使用 Avahi 实现,在 Apple 设备上称为 Bonjour。它.local默认使用后缀并通过广播消息工作。很像 ARP 的工作原理,但适用于 DNS。

.local在与 mDNS 设备混合的常规 DNS 设置中使用时,所有这些系统都可能非常混乱,甚至会更加混乱。我想这就是为什么您现在对为什么一台设备可以工作而另一台设备不工作感到困惑的原因:它们并非都使用相同的解析方法。

整理东西

  • .local除非您想完全依赖 mDNS,否则请避免使用。从您的问题中,我了解到您希望将自己配置的东西放在一个中心位置,所以我的方法是避免它。
  • 配置您的本地 DNS 服务器(您的案例中的 DD-WRT 设备)以使用特殊域名,例如my.home. 对于 dnsmasq,这是一个单一的设置,但在常规设置中,这应该在 DNS 服务器和 DHCP 服务器上进行配置(因为它是通过 DHCP 宣布的)。
  • 将所有 PC 配置为具有简单且唯一的主机名。他们在他们对 DHCP 的请求中使用它,并且在你的路由器上运行的 dnsmasq 中使用它来解决它们。或者,手动配置它们以不必依赖 DHCP。
  • 删除任何剩余的配置,/etc/resolv.conf以防您过去摆弄它。
  • 将网络中的 PC 配置my.home为本地搜索域。这可以通过 DHCP 自动完成,或者如果通过/etc/network/interfaces文件或网络管理器使用静态地址:

    在此处输入图片说明

  • 现在,简单名称解析 ( ping hostname) 和全名 ( ping hostname.my.home) 都应该可以工作。

  • 哇!很棒的答案 gertvdijk!非常全面。这么多,我需要一些时间来理解你所说的。我可以说我在主机名后测试了一个带点的 ping 并且它工作正常。我不在这个 LAN 上为永久机器使用 DHCP。我从来没有在任何机器上配置过 .local 设置,因为我不明白它是怎么回事。我会按照您的指示进一步调查此事,然后回复您。 (5认同)