有点卡在这儿。
我有两台机器无法解析 LAN 主机名,除非 /etc/hosts 中有特定条目
但局域网上的其他机器能解析主机名。
我的局域网:
- 1 个 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 另一台电脑(wstation)
$ ping wstation
PING wstation.local.domain (x.x.x.x)
如果我接着追加。当地的
$ 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
答案1
关于您当前的输出
ping wstation
PING wstation.local.domain
清楚地表明您的 PC 正在附加.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 服务器。mDNS 在 Linux 中使用 Avahi 实现,在 Apple 设备上称为 Bonjour。它.local
默认使用后缀并通过广播消息工作。与 ARP 的工作方式非常相似,但后者适用于 DNS。
所有这些系统都可能非常令人困惑,在与 mDNS 设备混合使用的常规 DNS 设置中,情况会更加混乱.local
。我猜这就是为什么你现在感到困惑,为什么一个设备可以工作,而另一个却不能:它们并不都采用相同的解决方法。
理清事情
- 除非您想完全依赖 mDNS,否则请避免使用
.local
。从您的问题中我了解到您希望自己在一个中心位置进行配置,所以我的方法是避免使用它。 - 配置您的本地 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
)都应该可以工作了。
答案2
根据 gertvdijk 的回答,我刚刚注释掉了 nsswitch.conf 中的行
sudo vim /etc/nsswitch.conf
.
.
.
hosts: files dns # mdns4_minimal [NOTFOUND=return] dns
答案3
我遇到过类似的问题,因为 /etc/hosts 中的 IP 和主机名之间有多个空格,而我使用的是 TAB。改用 TAB 后,主机名就可以通过 ping 解析了。
127.0.0.1 test.local
^^^^^^^^ → Should be a TAB not multiple spaces.