我是一位网络开发人员,正在尝试更好地处理安全性。我试图找出一种方法(在基于Linux / Debian的发行版上)列出我的上网本所在的同一LAN上的所有计算机。我尝试使用“ arp -n”,但我不认为它是完整的列表,因为我的iPhone与上网本在同一个Wi-Fi路由器上,而且没有出现。有没有更好的方法来获取所有共享同一网关的计算机的完整列表?
我是一位网络开发人员,正在尝试更好地处理安全性。我试图找出一种方法(在基于Linux / Debian的发行版上)列出我的上网本所在的同一LAN上的所有计算机。我尝试使用“ arp -n”,但我不认为它是完整的列表,因为我的iPhone与上网本在同一个Wi-Fi路由器上,而且没有出现。有没有更好的方法来获取所有共享同一网关的计算机的完整列表?
Answers:
sudo apt-get install nmap
这是我使用的nmap,以及使用要扫描的网络的CIDR块表示法的地址。首先,您需要安装nmap,因为发行版可能未预安装它。在Ubuntu上:
sudo apt-get install nmap
接下来,使用ifconfig找出您的网络地址:
ifconfig
我要扫描的接口的ifconfig输出:
wlan1 Link encap:Ethernet HWaddr 00:1f:3b:03:d2:bf
inet addr:192.168.1.104 Bcast:192.168.0.255 Mask:255.255.255.0
inet6 addr: fe80::21f:3bff:fe03:d2bf/64 Scope:Link
...
使用inet addr和Mask可以CIDR格式找出网络地址,更多有关CIDR的信息,请参见。地址是:
192.168.1.0/24
使用-sP参数运行nmap,它将仅检查主机是否在线来进行扫描:
sudo nmap -sP 192.168.1.0/24
nmap输出将如下所示:
Starting Nmap 5.21 ( http://nmap.org ) at 2014-12-09 10:52 EST
Nmap scan report for 192.168.1.1
Host is up (0.013s latency).
MAC Address: -MAC ADDRESS- (Cameo Communications)
...
Nmap done: 256 IP addresses (5 hosts up) scanned in 3.26 seconds
就是这样,如果您需要有关nmap的更多帮助,请参阅nmap官方文档,或运行:
nmap --help
nmap -sA 192.168.1.0/24
nmap选项-sA
显示了相似的描述性结果,具有更好的可读性,其中包括与选项-sP
.. 一起使用的设备名称,IP,mac等。出于可读性考虑,我个人更喜欢-sA而不是-sP。
arp -n
仅向您显示您的计算机已经与之通信的LAN上的计算机。通过ping广播和所有主机的多播地址,可以使该列表更好地填充:
“所有”(二进制)广播地址。请注意,大多数IP堆栈会将其转换为您所连接的所有子网的子网广播地址:
ping 255.255.255.255
当前子网的子网广播地址。因此,假设您使用的是192.168.1.0/24:
ping 192.168.1.255
“所有主机”多播地址。我非常喜欢这一点,因为它更有可能找到为其他IP子网配置的主机,这些主机恰好与您连接到同一以太网LAN:
ping 224.0.0.1
请注意,此方法以及到目前为止在其他“答案”中提到的其他方法仅在当前网络上查找可访问IP的主机。那可能就是您所需要关心的,但是攻击者可能会窥探网络或对网络造成不良影响而无法通过IP看到。
ip neigh
和hosts
。不需要nmap /不需要sudo。
在此基础上,您可以构建一个Python脚本:
#!/usr/bin/env python
"""List all hosts with their IP adress of the current network."""
import os
out = os.popen('ip neigh').read().splitlines()
for i, line in enumerate(out, start=1):
ip = line.split(' ')[0]
h = os.popen('host {}'.format(ip)).read()
hostname = h.split(' ')[-1]
print("{:>3}: {} ({})".format(i, hostname.strip(), ip))
通过下载
wget https://gist.githubusercontent.com/MartinThoma/699ae445b8a08b5afd16f7d6f5e5d0f8/raw/577fc32b57a7f9e66fdc9be60e7e498bbec7951a/neighbors.py
(或者干脆arp
……以前我没看到过)
ip neigh | awk '{ print $1 }' | xargs -n1 host
ip n
简而言之。也许更好ip n | grep REACHABLE
。
我没有找到足够令人满意的现有答案,因此我想尝试一下。毕竟,FAQ建议为链接提供上下文。
nmap
太好了,如果使用起来有点混乱。这是我发现一些本地网络设备的基本方法,这些设备大多可复制粘贴。nmap -sP
(或nmap -sn
)通过ping扫描。“主机发现”还有其他选项,例如nmap -sL
或nmap -Pn
。
ehtesh@x200arch:~$ # my wireless interface is listed as wlp3s0. Yours could be wlan0 or eth1.
ehtesh@x200arch:~$ ip addr show wlp3s0 | grep "inet "
inet 172.18.72.53/22 brd 172.18.75.255 scope global wlp3s0
ehtesh@x200arch:~$ arp -a
? (172.18.72.1) at c8:4c:75:76:bd:74 [ether] on wlp3s0
ehtesh@x200arch:~$ nmap -sP 172.18.72.0/24
Starting Nmap 6.41SVN ( http://nmap.org ) at 2013-12-17 20:08 EST
Nmap scan report for 172.18.72.2
Host is up (0.017s latency).
<... 15 IP addresses snipped ...>
Nmap scan report for 172.18.72.253
Host is up (0.13s latency).
Nmap done: 256 IP addresses (17 hosts up) scanned in 5.74 seconds
ehtesh@x200arch:~$ arp -a | sort -n -k 1,1
? (172.18.72.126) at ec:35:86:4a:37:d2 [ether] on wlp3s0
? (172.18.72.148) at 10:9a:dd:b8:79:71 [ether] on wlp3s0
? (172.18.72.178) at 9c:20:7b:7b:08:ba [ether] on wlp3s0
? (172.18.72.1) at c8:4c:75:76:bd:74 [ether] on wlp3s0
? (172.18.72.253) at b8:78:2e:19:05:0b [ether] on wlp3s0
? (172.18.72.2) at 00:14:1c:da:e1:c2 [ether] on wlp3s0
? (172.18.72.40) at d8:c7:c8:ca:f9:88 [ether] on wlp3s0
? (172.18.72.43) at d8:c7:c8:ce:0f:60 [ether] on wlp3s0
? (172.18.72.44) at d8:c7:c8:ce:0f:68 [ether] on wlp3s0
? (172.18.72.45) at 6c:f3:7f:c6:71:16 [ether] on wlp3s0
? (172.18.72.46) at 6c:f3:7f:c4:4c:b3 [ether] on wlp3s0
? (172.18.72.47) at d8:c7:c8:ca:f9:88 [ether] on wlp3s0
? (172.18.72.48) at 24:de:c6:c6:b6:78 [ether] on wlp3s0
? (172.18.72.49) at 24:de:c6:c6:b6:e6 [ether] on wlp3s0
? (172.18.72.51) at 00:9c:02:d0:4c:4e [ether] on wlp3s0
? (172.18.72.54) at 00:23:76:99:99:bf [ether] on wlp3s0
? (172.18.72.62) at 8c:70:5a:0d:06:18 [ether] on wlp3s0
? (172.18.72.63) at 7c:e9:d3:51:86:55 [ether] on wlp3s0
? (172.18.72.64) at a0:88:b4:47:eb:c8 [ether] on wlp3s0
ehtesh@x200arch:~$ #ifconfig | grep broadcast
ehtesh@x200arch:~$ ip address show wlp3s0 | grep brd
link/ether 00:1e:65:bf:1b:42 brd ff:ff:ff:ff:ff:ff
inet 172.18.72.53/22 brd 172.18.75.255 scope global wlp3s0
ehtesh@x200arch:~$ ping -b -c 3 -i 20 172.18.75.255
<... similar output to above ...>
我很高兴知道是否还有更有效的方法。在那之前,我一直坚持下去。
Hunt是一种命令行工具,能够在机器通过网络广播以获取信息时构建机器列表。它使用TCP,UDP,ICMP和ARP数据来构建网络上活动MAC地址的列表。它是一种被动工具,可以通过监听电线来工作。
有关连接设备的更紧凑列表:
nmap -sL 192.168.0.* | grep \(1
说明。
nmap -sL 192.168.0.*
将列出子网中的所有IP并标记名称为:
Nmap scan report for 192.168.0.0
Nmap scan report for Dlink-Router.Dlink (192.168.0.1)
Nmap scan report for 192.168.0.2
...
Nmap scan report for android-473e80f183648322.Dlink (192.168.0.53)
...
Nmap scan report for 192.168.0.255
由于所有有趣的记录都以括号(
和digit开头1
,因此我们用过滤| grep \(1
(需要使用反斜杠来避免括号)
怪癖
要注意,如果两个设备具有相同的名称,则nmap
只会显示最后连接到路由器的一个
要扫描一系列IP地址的状态,这很简单:
sudo nmap -sn 192.168.1.2-20
哪里:
-sn: Ping Scan - disable port scan
注意:
-sn
被称为-sP
我是在Mac OS X(基于BSD)上完成的。我不确定Linux版本是否有任何差异。
您可以使用fping sudo apt-get install fping
(在类似debian的操作系统中)。
fping与ping类似,但在ping多个主机时性能要好得多。该-r 1标志告诉fping只进行一轮。的2> 1 部分允许grep来过滤输出。
$ fping -g -r 1 192.168.1.0/24 2>1 | grep "alive"
将显示如下内容:
192.168.1.1 is alive
192.168.1.10 is alive
192.168.1.15 is alive
192.168.1.27 is alive
对于nmap,还有一个有趣的标志,可以让您看到MAC供应商-如果知道的话。与sudo一起使用以查看MAC地址。
$ sudo nmap -sP 192.168.1.0/24
您将得到例如:
Starting Nmap 7.40 ( https://nmap.org ) at 2019-05-23 18:49 CEST
Nmap scan report for 192.168.1.14
Host is up (-0.036s latency).
MAC Address: 20:F4:1B:E5:8F:7B (Shenzhen Bilian electronic)
Nmap scan report for 192.168.1.15
Host is up (-0.084s latency).
MAC Address: A4:31:35:E8:58:9E (Apple)
Nmap scan report for 192.168.1.27
Host is up (-0.15s latency).
MAC Address: 34:8A:7B:38:E3:14 (Samsung Electronics)
Nmap scan report for 192.168.1.29
Host is up (0.010s latency).
MAC Address: 80:2B:F9:75:F8:FF (Unknown)
Nmap scan report for 192.168.1.10
Host is up.
Nmap done: 256 IP addresses (5 hosts up) scanned in 25.52 seconds
1.如果广播nmap
不可用的替代解决方案:
seq 254 | xargs -iIP -P255 ping -c1 192.168.2.IP |grep time=
arp -a
2a。或只是询问您的域名服务器:
seq 254| awk '{print "192.168.2."$1}' |nslookup | grep name
2b。没有awk
echo -e 192.168.2.{1..10}"\n" |nslookup |grep name
并行ping 192.168.2.0/24子网中的所有可 ping 通的网络设备(以减少运行时间)。之后arp
应显示所有已回答的设备。
不检查活动连接或当前连接,而是列出本地域服务保留的所有连接,甚至是真正的旧连接。
更详细的解释:
seq 254
创建所有号码从1到254(对于从100到150的所有数字:seq 100 150
)xargs
调用ping
并将“ IP”(-iIP
)替换seq
为stdin中的唯一编号,因此192.168.2.IP将第一个seq
数字更改为192.168.2.1 ,-P
指定应开始的并发ping
进程数xargs
,我选择与地址相同的数量+1( = 254)我有兴趣。ping
使用xargs(192.168.2.IP
)修改ip地址,并且仅ping一次(-c1
); -i
在这种情况下,必须在参数上使用与xargs指定的标识符相同的标识符IP
grep time=
要删除每条包含多余信息的行,我们只对提供往返时间的答案感兴趣(=得到响应)arp -a
显示有效的名称(ip)对我将其称为pingall命令,并通过以下别名提供了该命令~/.bashrc
:
alias pingall='seq 254 | xargs -iIP -P255 ping -c1 192.168.2.IP |grep time='