Linux

ARP主機名問題

  • August 7, 2018

我在查看位於我的 LAN 中的設備的主機名時遇到問題。在我的第一台筆記型電腦(Ubuntu 18.04 LTS 桌面版)上,以下命令的結果:

arp -a

正是我想要的:

X (192.168.56.243) at 40:a3:cc:99:2d:66 [ether] on wlan0
test-test-test (192.168.56.146) at 48:bf:6b:e3:bf:5a [ether] on wlan0
TP-Link_Archer_ (192.168.56.1) at 10:7b:44:40:61:70 [ether] on wlan0

使用nmap,我可以使用以下命令掃描我的 LAN:

nmap -sn 192.168.56.0/24

我用主機名得到了完美的結果:

Starting Nmap 7.60 ( https://nmap.org ) at 2018-08-07 09:07 EDT
Nmap scan report for TP-Link_Archer_ (192.168.56.1)
Host is up (0.0054s latency).
Nmap scan report for ZZ (192.168.56.156)
Host is up (0.00045s latency).

但是,在另一台安裝了 Debian 9 x64 Minimal 的筆記型電腦上,整個主機名部分都失去了。每當我發出arp -a時,我都會得到以下資訊:

? (192.168.56.243) at 40:a3:cc:99:2d:66 [ether] on wlan0
? (192.168.56.146) at 48:bf:6b:e3:bf:5a [ether] on wlan0
? (192.168.56.1) at 10:7b:44:40:61:70 [ether] on wlan0

此外,使用nmap -sn 192.168.56.0/24掃描會產生以下輸出:

Starting Nmap 7.60 ( https://nmap.org ) at 2018-08-07 09:17 EDT
Nmap scan report for 192.168.56.1
Host is up (0.0054s latency).
Nmap scan report for 192.168.56.156
Host is up (0.00045s latency).

老實說,我不知道發生了什麼,很可能我在安裝在 Ubuntu 中的Debian Minimal安裝中遺漏了一些東西。但我不知道在哪裡可以找到失去的部分,以便 Debian 機器可以開始顯示主機名。

有任何想法嗎?

編輯: 我的 /etc/nsswitch.conf 就是這樣:

root@zxcv:/home/test# cat /etc/nsswitch.conf
# /etc/nsswitch.conf
#
# Example configuration of GNU Name Service Switch functionality.
# If you have the `glibc-doc-reference' and `info' packages installed, try:
# `info libc "Name Service Switch"' for information about this file.

passwd:         compat
group:          compat
shadow:         compat
gshadow:        files

hosts:          files dns
networks:       files

protocols:      db files
services:       db files
ethers:         db files
rpc:            db files

netgroup:       nis

但是,我已經設置了一個帶有橋接網路適配器的 VM,安裝了相同版本的 Debian Minimal,並且我能夠獲取所有 IP 的主機名。現在的問題是,失敗的 Debian 缺少哪些數據包/模組/服務,這會阻止獲取主機名?

您無權訪問可以將 IP 地址轉換為名稱的 DNS 伺服器。

還有其他方法可以關聯主機名和 IP 地址,但如果您有不止一台電腦,DNS 是您的最佳選擇。

在回复您的評論時,是的,/etc/resolv.conf 應該包含 DNS 伺服器的地址。在小型網路中,這通常與路由器相同。

arp正在詢問您的系統以確定它如何將 IP 轉換為主機名。如果您使用-n開關,它會放棄這一點,並簡單地顯示 IP,而不需要對主機名進行任何轉換。

像 Linux 中的大多數工具一樣,arp使用 NS(名稱服務切換)進行查找。如果你是strace你的arp命令,你可以看到它正在查找這些東西:

$ strace -s 2000 arp -a
...
open("/etc/nsswitch.conf", O_RDONLY|O_CLOEXEC) = 5

查看此文件後,arp您會發現它是如何查找主機名的。

$ grep hosts: /etc/nsswitch.conf
#hosts:     db files nisplus nis dns
hosts:      files dns myhostname

這就是說首先查看文件,然後查詢DNS 2…files這裡的詞是指使用系統的/etc/hosts文件。getent hosts您可以使用該命令了解 NS 如何執行此操作。

例子

例如在我的 CentOS 7 虛擬機上:

$ arp -a
? (10.0.2.3) at 52:54:00:12:35:03 [ether] on eth0
gateway (10.0.2.2) at 52:54:00:12:35:02 [ether] on eth0
$ arp -an
? (10.0.2.3) at 52:54:00:12:35:03 [ether] on eth0
? (10.0.2.2) at 52:54:00:12:35:02 [ether] on eth0

如果我們查詢getent尋找 10.0.2.2 IP:

$ getent hosts 10.0.2.2
10.0.2.2        gateway

IP,如果本地不存在於任何文件中,接下來將在 DNS 中查找。由於我的 IP 都是此 VM 的私有 IP,並且它們沒有明確地在我的 VM 定義的 DNS 中,這裡順便定義了:

$ more /etc/resolv.conf
# Generated by NetworkManager
nameserver 10.0.2.3

注意: arp除了向您顯示問號外別無選擇,因為它無法找到要使用的名稱。

引用自:https://unix.stackexchange.com/questions/461070