ARP主機名問題
我在查看位於我的 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
除了向您顯示問號外別無選擇,因為它無法找到要使用的名稱。