如何使用主机名从 LAN 访问机器

tsh*_*ang 149 networking

以下是我想使用其主机名访问的机器的详细信息:

$ hostname
hostname
$ cat /etc/hosts
127.0.0.1   localhost
127.0.1.1   hostname.company.local  hostname
Run Code Online (Sandbox Code Playgroud)

这是默认的 Debian 6 (Squeeze) 安装,所以我还没有摆弄任何东西。

这是我从一台试图访问上述机器的机器(运行 Debian Unstable)获得的信息:

$ ping hostname
ping: unknown host hostname
$ ping hostname.company.local
ping: unknown host hostname.company.local
$ cat /etc/resolv.conf
nameserver 192.168.2.21
nameserver 192.168.2.51
search company.local
Run Code Online (Sandbox Code Playgroud)

Gil*_*il' 167

在 Internet 上,包括本地网络,机器通过IP 地址相互调用。为了使用机器 B 的名称从机器 A 访问机器 B,机器 A 必须通过某种方式将 B 的名称映射到其 IP 地址。可以通过三种方式在 A 上声明机器名称:

  • 一个主机文件。这是一个将名称映射到地址的简单文本文件。
  • 域名系统(DNS) 。这是全球互联网上使用的方法。例如,当您在浏览器中加载此页面时,您的计算机所做的第一件事就是发出 DNS 请求以了解unix.stackexchange.com.
  • 其他名称数据库,例如NISLDAPActive Directory。这些在一些公司网络中使用,但不经常使用(许多使用 NIS、LDAP 或 AD 作为用户数据库的网络使用 DNS 作为机器名称)。如果您的网络使用其中之一,则您有专业的网络管理员,应该询问他该怎么做。

有很多方法可以在实践中发挥作用;不可能涵盖所有这些。在这个答案中,我将描述一些常见的情况。

主机文件

主机文件方法的优点是不需要任何特殊方法。如果您有多台机器,这可能会很麻烦,因为当一台机器的名称更改时,您必须更新每台机器。如果 B 的 IP 地址是动态分配的(这样每次连接到网络时都会获得不同的 IP 地址),则不合适。

主机文件是将名称映射到 IP 地址的简单行列表。它看起来像这样:

127.0.0.1       localhost localhost.localdomain
198.51.100.42   darkstar darkstar.bands
Run Code Online (Sandbox Code Playgroud)

在 unix 系统上,hosts 文件是/etc/hosts. 在 Windows 上,它是c:\windows\system32\drivers\etc\hosts. 几乎每个可以连接到 Internet 的操作系统都有一个类似的文件;维基百科有一个列表

在 A 的 hosts 文件中添加 B 的条目:

  1. 确定 B 的 IP 地址。在 B 上运行命令ifconfig(如果没有找到命令,请尝试/sbin/ifconfig)。输出将包含这样的行:

    eth1      Link encap:Ethernet  HWaddr 01:23:45:67:89:ab
              inet addr:10.3.1.42  Bcast:10.3.1.255  Mask:255.255.255.0
    
    Run Code Online (Sandbox Code Playgroud)

    本例中B的IP地址为10.3.1.42。如果有多inet addr:条线路,请选择与您的网卡对应的线路,不要选择lo条目、隧道或虚拟条目。

  2. 编辑 A 上的 hosts 文件。如果 A 正在运行某个 unix 系统,您需要以/etc/hosts超级用户身份进行编辑;请参阅如何以系统管理员 (root) 身份运行命令

家庭或小型办公室网络上的 DHCP+DNS

如果您有必要的设备,这种方法是迄今为止最简单的。您只需配置一台设备,您的所有计算机都会知道彼此的名称。此方法假定您的计算机通过DHCP获取其 IP 地址,这是计算机在连接​​到网络时自动检索 IP 地址的一种方法。如果您不知道 DHCP 是什么,他们可能知道。

如果您的网络有一个家庭路由器,它是为连接到该路由器的机器配置名称的最佳位置。首先,你需要弄清楚B的MAC地址。每个网络设备都有一个唯一的MAC地址。在 B 上,运行命令ifconfig -a(如果找不到命令,请尝试/sbin/ifconfig -a)。输出将包含这样的行:

    eth1      Link encap:Ethernet  HWaddr 01:23:45:67:89:ab
Run Code Online (Sandbox Code Playgroud)

在本例中,MAC 地址是01:23:45:67:89:ab。您必须选择与通过电缆连接到路由器的网络端口相对应的 HWaddr 线(如果您通过 wifi 连接,则选择 wifi 卡)。如果您有多个条目但不知道哪个是哪个,请插入电缆并查看哪个网络设备接收 IP 地址(inet addr下面的行)。

现在,在路由器的 Web 界面上,查找“DHCP”等设置。设置的名称和位置完全取决于路由器型号,但大多数都有一组类似的基本设置。这是番茄固件上的样子:

番茄截图

输入 MAC 地址、IP 地址和所需的名称。您可以选择本地网络地址范围内的任何 IP 地址。大多数家用路由器都针对 192.168 形式的地址范围进行了预配置。×y或 10. xyž。例如,在上面显示的 Tomato 路由器上,在“网络”选项卡中,有一个值为 10.3.0.1 的“路由器 IP 地址”设置和值为 255.255.255.0 的“子网掩码”设置,这意味着计算机上的本地网络必须具有格式为 10.3.0 的地址。ž。还有一系列自动分配的 DHCP 地址 (10.3.0.129–10.3.0.254);对于您手动分配的 DHCP 地址,请选择不在此范围内的地址。

现在将 B 连接到网络,它应该获得您指定的 IP 地址,并且可以从网络中的任何机器通过指定的名称访问它。

使用 Dnsmasq 制作您自己的 DNS 服务器

如果您没有功能强大的家用路由器,您可以在任何 Linux 机器上设置相同的功能。我将解释如何使用Dnsmasq设置DNS。还有许多其他类似的程序;我选择 Dnsmasq 是因为它易于配置且重量轻(例如,上面展示的 Tomato 路由器就使用了它)。Dnsmasq 可用于大多数 Linux 和 BSD 发行版,用于 PC、服务器和网络设备。

选择一台始终处于开机状态、具有静态 IP 地址并且运行某种 Linux 或 BSD 的计算机;我们称它为 S(用于服务器)。在 S 上,安装dnsmasq软件包(如果它还没有)。下面我假设配置文件是/etc/dnsmasq.conf; 位置可能因某些分布而异。现在你需要做几件事。

  • 告诉 Dnsmasq 除了从 Internet 获取的主机名之外,还提供您的主机名。最简单的方法是输入名称和 IP 地址/etc/hosts(请参阅上面的“主机文件”部分),并确保/etc/dnsmasq.conf没有no-hosts取消注释指令。(以 a 开头的行#被注释掉。)您可以将名称放在不同的文件中;如果这样做,请addn-hosts=/path/to/hosts/file/etc/dnsmasq.conf.
  • 告诉 Dnsmasq 如何获取 Internet 上机器名称的 IP 地址。

    • 如果您运行的是 Debian、Ubuntu 或衍生版本,请安装该resolvconf软件包。在最常见的情况下,一切都会开箱即用。
    • 如果您的网络管理员或您的 ISP 为您提供了 DNS 服务器的地址,请在 中输入它们/etc/dnsmasq.conf,例如:

      server=8.8.8.8
      server=8.8.4.4
      
      Run Code Online (Sandbox Code Playgroud)
    • 如果您不知道当前的 DNS 设置是什么,请查看文件/etc/resolv.conf. 如果您看到类似nameserver 8.8.8.8的行,请server=8.8.8.8/etc/dnsmasq.conf. 更改后/etc/dnsmasq.conf,重新启动 Dnsmasq。执行此操作的命令取决于发行版;典型的可能性包括restart dnsmasq/etc/init.d/dnsmasq restart

  • 告诉 S 对所有主机名请求使用 Dnsmasq 服务。编辑文件/etc/resolv.conf(以 root 身份),删除每一nameserver行,然后放入nameserver 127.0.0.1
    • 如果您在 Debian 或 Ubuntu 上使用 resolvconf,/etc/resolv.conf如果您resolvconf在网络启动并运行的情况下安装软件包,则可能不是最佳选择。确保文件baseheadtail在该/etc/resolvconf/resolv.conf.d/目录中不包含任何nameserver条目,然后运行resolvconf -u(作为root)。
  • 告诉其他机器使用 S 作为 DNS 服务器。编辑/etc/resolv.conf并替换所有nameserver行,nameserver 10.3.0.2其中 10.3.0.2 是 S 的 IP 地址(有关如何找出 S 的 IP 地址,请参见上文)。

您也可以使用 Dnsmasq 作为DHCP服务器,以便机器自动获取与其名称对应的地址。这超出了本答案的范围;查阅 Dnsmasq 文档(这并不难)。请注意,给定的本地网络上只能有一个 DHCP 服务器(本地网络的确切定义超出了本答案的范围)。

全球互联网上的名字

到目前为止,我假设了一个本地网络。如果您想为位于世界不同角落的机器命名怎么办?您仍然可以使用上述任何一种技术,只是涉及 DHCP 的部分仅适用于本地网络。或者,如果您的机器有公共 IP 地址,您可以为它们注册您自己的公共名称。(您也可以将私有 IP 地址分配给公共名称;它不太常见且不太有用,但没有技术难度。)

获取自己的域名

您可以获取自己的域名并将 IP 地址分配给该域内的主机名。您需要在域名提供商处注册域名;这通常花费 10 到 15 美元/年(对于最便宜的域)。使用您的域名提供商的 Web 界面为主机名分配地址。

动态域名解析

如果您的机器有动态 IP 地址,您可以使用动态 DNS协议在地址更改时更新与机器名称关联的 IP 地址。并非所有域名提供商都支持动态 DNS,因此请先购买再购买。对于个人使用,No-IP提供免费的动态 DNS 服务,如果您使用自己的域(例如example.ddns.net)。

  • 尽管这个答案很详细且内容丰富,但它并没有为这个问题提供实际的解决方案。设置 DNS 服务器不仅需要配置始终在线的中央 DNS 服务器,还需要配置网络上的每个客户端。如果设备移动到新网络,则需要为新网络和网络上的每个设备配置新的中央 DNS 服务器。另一方面,“avahi-daemon”多播 DNS 解决方案不需要中央 DNS 服务器配置,也不需要客户端了解本地 DNS。 (4认同)

tne*_*tne 36

使用多播 DNS (mDNS)。这是一种适用于 LAN 子网的零配置协议。不需要服务器。使用.localTLD(这是您已经使用的)。

因为你在问,所以其他一切似乎都太过分了。如果不是,那么你可能不会问。

PS .localTLD 会自动附加/删除,因此您无需以任何方式更改主机名。例如,如果您的主机名是svr,则svr.local应该在您的 LAN 上解析。

  • @Zitrax 好点(尽管这是一个 *nix 站点)。可以在 [那里](http://superuser.com/q/491747) 中找到有关 Windows 设置的相关信息——相对简单。 (4认同)
  • 又名 Zeroconf 或 Bonjour。由`avahi` 包提供。例如,您可以通过 `avahi-browse -alr` 查询您的网络。 (4认同)
  • 如果不在每个 Windows 机器上安装一些东西,Windows 似乎不支持 mDNS。 (2认同)
  • 对于 systemd,mDNS 应默认启用。如果您有 systemd 但 mDNS 似乎未启用,请尝试“sudo systemctl start systemd-resolved”和(为了使更改永久)“sudo systemctl enable systemd-resolved”。 (2认同)

小智 13

正如建议的,只要您只想从同一本地网络访问计算机,多播 DNS (mDNS) 似乎是最简单的解决方案。

在 Linux 上,您可以使用avahi将主机名导出到带有 mDNS 的网络。要在 Ubuntu 服务器 20.04 上安装它,请使用apt install avahi-daemon.

之后您的服务器应该可以通过以下方式访问:hostname.local


Lan*_*nes 7

vi /etc/dhcp3/dhclient.conf

send host-name "ubuntu-laptop";
Run Code Online (Sandbox Code Playgroud)

/etc/init.d/networking restart
Run Code Online (Sandbox Code Playgroud)