尝试通过主机名联系 Raspberry Pi 时无法解析主机名(更新本地 LAN 上机器的主机名)

尝试通过主机名联系 Raspberry Pi 时无法解析主机名(更新本地 LAN 上机器的主机名)

我已通过 Wi-Fi 将运行 Ubuntu 20.04 的 Raspberry Pi 4 连接到我的本地 LAN。

我可以通过以下方式从我的笔记本电脑顺利地通过 SSH 连接到 Raspberry Pi:

$ ssh [email protected]
Welcome to Ubuntu 20.04.1 LTS (GNU/Linux 5.4.0-1022-raspi aarch64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage
 ...

我希望能够使用主机名通过 SSH 连接到该 IP,而不必每次都输入该 IP:。rasp01我找到了这个指南:

https://thepihut.com/blogs/raspberry-pi-tutorials/19668676-renaming-your-raspberry-pi-the-hostname

我已经遵循了。重启 Raspberry Pi 并登录后,我看到了以下内容:

ubuntu@rasp01:~$ hostname
rasp01

ubuntu@rasp01:~$ cat /etc/hosts

rasp01 localhost

# The following lines are desirable for IPv6 capable hosts
::1 ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
ff02::3 ip6-allhosts

ubuntu@rasp01:~$ cat /etc/hostname 
rasp01

但是,当我尝试使用该主机名从同一 LAN 上的笔记本电脑(也运行 Ubuntu)通过 SSH 连接到 Raspberry Pi 时,我得到了:

$ ssh ubuntu@rasp01
ssh: Could not resolve hostname rasp01: Name or service not known

$ ssh [email protected]
ssh: Could not resolve hostname rasp01.local: Name or service not known

$ ssh [email protected].
ssh: Could not resolve hostname rasp01.local.: Name or service not known

我错过了什么?

如果我必须为其添加后缀,那就没问题了,*.local但这似乎不起作用。相关主题在这里:

https://www.reddit.com/r/archlinux/comments/7q6mih/why_can_i_ping_with_ip_but_not_with_hostname/dso1cc4/

用户显然*.local最终让它能够工作。

此外,Raspberry Pi 4 将成为 Raspberry Picluster 的一部分,我将在其中安装 docker/kubernetes(实验室乐趣)。我的经验是,当仅将 Docker 添加到组合中时,网络已经变得相当复杂,这篇文章也证实了这一点:

https://gnanesh.me/avahi-docker-non-root.html

从这个角度来看,安装我自己的内部 DNS 是否会“更简单”:

https://medium.com/nuculabs/setting-up-a-simple-dns-server-859de750f6fe

服务器而不是按照以下答案中的建议在节点上安装 Avahi

答案1

只需安装avahi-daemon在 Raspberry Pi 上。

avahi-daemon基本上在 Raspberry Pi 上设置一个多播主机名,应该通过 LAN 进行广播:

“Avahi mDNS/DNS-SD 守护进程实现了 Apple 的 Zeroconf 架构(也称为“Rendezvous”或“Bonjour”)。该守护进程使用 mDNS/DNS-SD 注册本地 IP 地址和静态服务,并为本地程序提供两个 IPC API,以利用 avahi-daemon 维护的 mDNS 记录缓存。”

安装非常简单:

sudo apt-get install avahi-daemon avahi-utils;

就是这样!然后,无论该设备的主机名是什么,都可以在网络上访问[hostname].local。只需从网络上的另一台设备 ping 它,如下所示:

ping rasp01.local

您应该会看到它解析到该设备的 IP 地址。如果您没有看到它立即出现,请等待一分钟左右,然后再次 ping。也许可以像这样重新启动 Avahi 服务:

sudo service avahi-daemon restart

你应该表现得很好。

一般来说,编辑 Hosts 文件 ( /etc/hosts/) 是一种非常笨拙的方法。它需要手动干预,如果 IP 地址发生变化,猜猜会发生什么?更多的手动干预。Avahi 才是最佳选择。

答案2

我错过了什么?

IP LAN 没有通用的本地主机名查找方法——有几种协议,但它们更像是附加组件。通常需要手动启用它们,尤其是在 Linux 上。

通常您的家用路由器将提供内部 DNS。如果 Pi 使用 DHCP,它将在发送 DHCP 租约请求时通告其主机名 - 大多数家庭路由器随后会在本地 DNS 域(例如.home.lan或类似的东西)中发布它。

企业网络和自定义 DHCP 服务器通常不会有这样的自动注册。

请注意,此方法不适用于静态 IP 地址(如果需要,请使用 DHCP 预留),并且不会自动检测主机名更改。因此,如果您现在重命名 Pi,你必须重新启动 DHCP 客户端并获得一份新的租约。

它还要求其他计算机知道路由器 DNS 使用的 DNS 搜索后缀。这也可以通过 DHCP 从路由器自动检索,但如果主机使用静态地址,则必须手动配置。

另一个选择是多播 DNS (mDNS)。这是使用 的那个.local。要使其在 Linux 上运行,您需要安装avahi 守护进程libnss-mdns在所有参与的设备上。

mDNS 也是 macOS 的标准部分,可通过注册表更改在 Windows 10 中使用。

顾名思义,mDNS 使用多播数据包 - 这些数据包在 WiFi 上并不总是可靠的,并且一些无线网络会直接阻止它们。确保您的路由器不会阻止它们。

LLMNR 与 mDNS 非常相似,但不使用任何域后缀。它主要由 Windows 使用,但也受 Linux 上的 systemd-resolved 支持。您可以根据需要同时运行两者。

(还有 NetBIOS,这是 Windows 过去曾经使用过的。曾经非常常见(尽管不可靠),但随着 SMBv1 的删除现在很少见。Samba 支持它,但不要介意。)

但是如果 IP 发生变化怎么办

大多数路由器都能够将 DHCP 租约永久分配给特定设备。(这可能被称为“静态租约”或“预留”,但它并不总是有特定的名称。)如果您希望 Pi 始终为 192.168.3.14 或其他任何地址,则可以这样做。

相关内容