☰
Ubuntu局域网IP扫描全攻略:arp-scan与nmap实战
2026/10/15 4:56:23 网站建设 项目流程

不知道你有没有遇到过这种场景:网络明明连着好几台设备,但你坐在Ubuntu前,想看看局域网里到底都谁在线,却发现自己除了查自己IP之外毫无头绪。查“局域网所有的IP地址”这件事,看起来是个小需求,真做起来有几个讲究——用什么协议扫、怎么扫得又快又准、扫出来的结果怎么判断谁是谁。我在Ubuntu上做局域网设备盘点已经不是一次两次了,从家里七八台设备的小网络到几十台机器的办公网都折腾过,这里把三种主流方案和对应的坑从头到尾写一遍,给需要的人做个参考。

先说清楚一个概念。平时说的“查局域网所有IP”,通常指当前在线、能响应的设备的IP地址,而不是DHCP分配出去但已经关机下线的所有历史记录。这两种数据来源完全不同:前者靠的是主动探测,后者靠的是查服务端的分配记录。下面要讲的扫描方法,主要解决“现在在线的是哪些IP”这个问题。

1. 扫网前先看清自己的网段和工具

1.1 先确认本机IP和接口

不管用哪种扫描方式,第一步永远是搞明白自己这台机器在哪个网段、用的是哪个网卡。很多人直接用ifconfig或者ip addr看了半天,结果被一堆虚拟网卡搞晕,扫错接口,自然什么都扫不到。

Ubuntu上最直接的确认方式:

ip -4 addr show

你会看到类似这样的输出:

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 inet 127.0.0.1/8 scope host lo 2: enp3s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 inet 192.168.1.105/24 brd 192.168.1.255 scope global noprefixroute enp3s0

这里enp3s0就是有线网卡,IP是192.168.1.105,掩码/24说明网段是192.168.1.0/24,也就是192.168.1.1到192.168.1.254共254个可用地址。

如果你用的是无线,接口名一般是wlp2s0、wlan0这种。还有一个很容易忽略的问题:Ubuntu桌面版默认可能有docker0、virbr0这样的虚拟网卡,地址通常是172.17.0.1或者192.168.122.1。扫描的时候必须避开它们,因为那是虚拟网桥的内部网段,不是你的真实局域网。

还有一个更快的命令:

hostname -I

这个会直接列出本机所有IPv4地址,不包含回环接口,一眼就能看到哪个是局域网地址。

1.2 先用系统自带命令做个快速摸底

在装任何工具之前,你其实可以先试试系统自带的命令,看看能不能捞到一些信息。

ip neigh

这个命令会显示邻居(neighbor)缓存表,也就是本机最近通过ARP或NDP协议通信过的设备。比如:

192.168.1.1 dev enp3s0 lladdr xx:xx:xx:xx:xx:xx REACHABLE 192.168.1.115 dev enp3s0 lladdr xx:xx:xx:xx:xx:xx STALE

状态是REACHABLE的说明最近刚通信过,STALE表示曾经通信过但现在不确定是否在线。这个命令的好处是不用装任何东西,坏处是只能看到本机“近期接触过”的设备,不是全量清单。你想知道“局域网里所有IP”,单靠它肯定不够,但做个快速摸底、确认网关是谁,完全够用。

网关通常是整个局域网里最关键的地址。你可以用:

ip route | grep default

看到类似default via 192.168.1.1 dev enp3s0,那192.168.1.1就是网关,也就是路由器的LAN口地址。记住这个地址,后面扫描结果里把它标记出来,整张清单会清晰很多。

1.3 把必备工具一次性装齐

接下来就是装工具。我推荐两个:arp-scan和nmap,一个管快速发现,一个管深入分析。装它们不需要什么特殊理由,都是Ubuntu官方源里就有的开源软件。

sudo apt update sudo apt install -y arp-scan nmap

arp-scan体积很小,专门做二层ARP扫描,速度极快,适合五分钟内拉出“谁在线”的清单。nmap则是网络扫描领域的瑞士军刀,除了发现主机,还能识别端口、服务、操作系统类型,适合对某个陌生设备做进一步判断。两者的定位不太一样,配合着用体验最好。

如果你不想装任何工具,后面也有纯系统自带命令的方案,但效率和信息量确实差一截。平时工作环境允许的话,先把这两个装上不亏。

2. 一条命令搞定局域网IP扫描:arp-scan

2.1 arp-scan为什么这么准

先理解一个底层原理:真正在“二层”直接询问“这个IP是谁的”的协议是ARP(Address Resolution Protocol)。当你的机器发出一个ARP请求,广播问“192.168.1.x 的MAC地址是什么”,只要那台设备在线并且网卡工作正常,就必须回应。它不像ICMP(ping)那样可以被防火墙轻松拦截,也不依赖对方开启什么服务,这是ARP扫描在局域网里非常好用的根本原因。

arp-scan做的事情就是向目标网段的所有IP逐个发送ARP请求,然后把回应的设备列出来,顺便通过MAC地址的前24位匹配已知厂商数据库,告诉你这个设备可能是哪个制造商生产的。这个“回应的必须回应”的特性,让它在发现“存活主机”这个任务上比ping可靠得多。

2.2 完整扫描命令与输出解读

最简单的用法是:

sudo arp-scan --localnet

--localnet会让它自动读取本机IP和掩码,算出当前所处的网段。如果你有多块网卡,最好手动指定接口,避免扫错地方:

sudo arp-scan --interface enp3s0 --localnet

或者直接给网段:

sudo arp-scan 192.168.1.0/24

第一次跑的时候它会输出硬件接口信息,然后给出一张类似这样的表:

Interface: enp3s0, type: EN10MB, MAC: xx:xx:xx:xx:xx:xx, IPv4: 192.168.1.105 Starting arp-scan 1.9.7 with 256 hosts (https://github.com/royhills/arp-scan) 192.168.1.1 xx:xx:xx:xx:xx:xx ASUSTek COMPUTER INC. 192.168.1.106 xx:xx:xx:xx:xx:xx (Unknown) 192.168.1.118 xx:xx:xx:xx:xx:xx (Unknown) 192.168.1.129 xx:xx:xx:xx:xx:xx Intel Corporate

三列分别是IP地址、MAC地址、厂商信息。第三列的厂商是靠MAC前缀查出来的,不一定精确到具体型号,但足够帮你判断“这是台电脑还是手机还是路由器”。MAC地址本身是设备网卡的物理地址,理论上是全网唯一的,所以看到同一个MAC在不同时间出现,基本可以断定是同一台设备。

如果你只需要IP列表,可以过滤一下:

sudo arp-scan --localnet | grep -E '([0-9a-f]{2}:){5}[0-9a-f]{2}' | awk '{print $1}'

这样输出就是干干净净的一列IP,方便你批量丢给脚本继续处理。

2.3 一眼识别谁是谁

扫描出来几十条记录之后,怎么快速把它们分类?我的习惯是:

第一,把网关地址(比如192.168.1.1)找出来,这是所有流量的出口,MAC地址通常对应路由器厂商。第二,看自己的设备。你手边就有电脑、手机、平板,可以直接在各自的系统设置里查一下MAC地址,和扫描结果对应上。第三,看厂商字段。如果全是同一家网络设备厂商的,多半是路由器或者交换机。如果某个厂商字段比较陌生,那就要多留个心眼,可能是新接入的智能家居盒子、电视盒子,也可能是你自己忘掉的某个设备。

arp-scan还支持--fast模式,会减少请求之间的延迟,扫描完254个地址也就几秒钟。你甚至可以连续扫两三次,因为有些设备可能正在休眠,第一次没回,第二次或者第三次才回。这样对比几次结果,基本就能确认哪些是稳定在线的设备。

3. 进阶玩法:nmap多维度识别局域网设备

3.1 主机发现和端口扫描的区别

nmap最常被提到的参数是-sn,它表示“只做主机发现,不扫描端口”。这个方式会组合使用ICMP echo请求、TCP ACK请求、ARP请求等多种手段来判断目标是否存活,所以即使某些设备禁ping,也可能通过TCP探测被发现。

旧版本很多人写-sP,新版本里它是-sn的别名,推荐直接写-sn,语义更清楚。这个参数不需要扫描端口,速度比完整扫描快很多,适合先拉存活清单。

如果你拿到的是一台完全陌生的设备,光知道它在线还不够,你还会想知道它到底是什么。这时候就需要做端口扫描和服务识别。比如:

sudo nmap -sS -sV -O --top-ports 100 192.168.1.0/24

参数的含义:

  • -sS:TCP SYN半开扫描,速度快,不容易在目标系统日志里留下完整连接记录。
  • -sV:探测开放端口上运行的服务版本。
  • -O:尝试识别操作系统类型。
  • --top-ports 100:只扫最常见的100个端口,减少扫描时间。

不过完整扫描254台机器会比较慢,而且可能触发目标设备的安全告警。我一般只在“已经确定某个IP可疑或陌生”的时候,针对单台机器跑这种深扫,而不是对全网跑。

3.2 常用扫描组合和输出解读

先用一条不带 sudo 也能跑的命令做快速主机发现:

nmap -sn 192.168.1.0/24

输出大概是:

Starting Nmap 7.80 ( https://nmap.org ) Nmap scan report for 192.168.1.1 Host is up (0.0018s latency). MAC Address: xx:xx:xx:xx:xx:xx (ASUSTek COMPUTER INC.) Nmap scan report for 192.168.1.106 Host is up (0.0035s latency). MAC Address: xx:xx:xx:xx:xx:xx (Apple) Nmap done: 256 IP addresses (6 hosts up) scanned in 2.18 seconds

注意,nmap -sn在输出里同样会显示MAC地址和厂商,但在跨网段扫描时看不到MAC,因为二层ARP请求无法跨越路由器。

如果想进一步判断一台设备开放的端口和服务,针对单个IP执行:

sudo nmap -sS -sV -O -T4 192.168.1.106

-T4是时序模板,表示“激进速度”,适合本地网络这种低延迟环境。输出的结果里可以看到Device type: general purpose、Running: Linux 3.x这样的系统猜测,以及开放端口对应的服务,比如22/tcp ssh、80/tcp http。

用一个表格看几种方式的特点:

方案原理速度设备识别能力是否需要root
arp-scanARP二层广播极快只有MAC和厂商需要
nmap -snICMP/ARP/TCP组合探测快MAC、厂商,可配脚本通常需要
nmap -sS -sV -O端口扫描+服务/OS识别较慢可识别系统和开放服务需要
纯ping脚本ICMP探测慢只有IP不需要

3.3 哪些情况下用nmap更划算

家里的小局域网用arp-scan就足够了,因为它简单、快、结果干净。但是遇到这些情况,nmap的价值就体现出来了:

  • 你想知道某个设备开放了哪些端口,判断它是不是被拿去跑了什么可疑服务。
  • 你怀疑网络里有设备ARP欺骗,想通过比对MAC和IP确定它们的变化。
  • 你想把局域网里的设备做一次资产梳理,不光要“有哪些IP”,还要“这些IP上跑着什么东西”。

nmap的脚本引擎还能做一些更进阶的检查,比如-sC配合默认脚本集,可以顺带探测常见漏洞和服务信息。不过这些功能属于“主动扫描”,比较容易被安全软件感知,在别人网络上这样做不太合适。在自己管理的局域网里做资产排查没问题,但你要清楚这些操作会在设备侧留下记录。

4. 不装任何工具,纯命令行也能扫出IP

4.1 单点探测与批量循环

有些环境下你不方便装东西,比如你在一个刚启动的云主机或者精简版系统里,只有最基础的ping、arp命令。这时也能扫,就是效率低一点。

先看单个IP怎么探测:

ping -c 1 -W 1 192.168.1.123

-c 1表示只发一个包,-W 1表示最多等1秒。如果目标在线,会返回64 bytes from ...;不在线则超时。但要注意,很多设备可能禁ICMP,这时候ping不到不代表设备不在线。

批量扫描就是套一个循环:

for i in $(seq 1 254); do ping -c 1 -W 1 192.168.1.$i >/dev/null 2>&1 && echo "192.168.1.$i is alive" done

这样串行跑完254个地址,每个最多等1秒,最坏情况要等4分多钟。想提速就改成并发:

for i in $(seq 1 254); do ( ping -c 1 -W 1 192.168.1.$i >/dev/null 2>&1 && echo "192.168.1.$i is alive" ) & done wait

并发版能在十几秒内跑完。不过我提醒一下,这种高并发ping在部分老旧路由器上可能会被当成洪水攻击,扫的时候稍微克制一点,分几批跑也行。

4.2 从ARP缓存里捞活设备

ping完之后,系统会在ARP缓存里留下这些设备的记录。这时候你再去看ip neigh或者:

arp -a

就能看到刚刚通信过的所有设备。配合批量ping脚本,这个方案的链路是:先发包唤醒缓存记录,再从缓存里捞出IP和MAC对应关系。比起只看ping回显,多了MAC地址信息,便于判断设备类型。

但它的实时性比较差。如果某台设备在你ping完之后下线了,缓存里还可能保留它的记录,状态会变成STALE。所以看到STALE状态的条目,只能说明“之前出现过”,不能直接当成“现在就在线”。

4.3 DHCP租约记录是另一条线索

如果你想找的“所有IP”不局限于在线设备,而是想知道“这个局域网里分配过哪些IP”,那就要查DHCP服务端的租约记录了。

如果Ubuntu本身就是DHCP服务器,租约文件通常在:

cat /var/lib/dhcp/dhcpd.leases

里面能看到每个租约对应的MAC、IP和过期时间。不过家用场景这个文件不在你电脑上,而是在路由器里,你得登录路由器后台看“已连接设备”或“DHCP客户端列表”。

我觉得这条线索经常被忽略,但排查“为什么某个设备IP总变”的时候特别有用。举个例子,你给设备A手动指定了一个静态IP192.168.1.50,但DHCP服务不知道这个地址被占用了,又把它分给了另一台设备B,结果就是IP冲突,两台设备轮流掉线。这时候查DHCP租约和查在线IP扫描结果,一对比就能定位问题。

5. 扫描局域网IP时最容易踩的五个坑

5.1 权限不够,命令直接报错

arp-scan如果不加sudo,很可能会报错:

Cannot open device enp3s0: Operation not permitted

原因很简单:发送原始ARP帧需要root权限。nmap的部分扫描类型也一样,不加sudo只能用有限方式探测。虽然nmap -sn在某些配置下可以不带sudo直接跑,但为了结果完整和避免系统限制,我建议还是统一用sudo执行扫描类命令。

5.2 网卡选错,扫了半天全白忙

这是个很隐蔽的问题。笔记本上如果同时连着有线和无线,系统里会有两个真实网卡的地址。加上VMware、VirtualBox、Docker创建的虚拟网卡,ip addr输出可能好几屏。

有一次我帮人排查,他用arp-scan --localnet扫了半天,一个设备都扫不到。后来才发现默认走的接口是docker0,它把ARP广播发到了虚拟网桥里面,跟外面物理网络完全没有关系。解决办法就是指定接口:

sudo arp-scan --interface enp3s0 192.168.1.0/24

怎么知道该用哪个接口?一条命令解决:

ip route | grep default

看默认路由走的是哪个网卡,就用哪个接口扫。

5.3 设备明明在线,就是扫不到

排查过几次之后,我总结了一下“设备在线但扫不到”的常见原因,至少有四种可能。

客户端打开了隐私MAC地址功能。现在的手机系统普遍默认连接Wi-Fi时使用随机MAC,而且定期更换。这样你在扫描结果里看到的MAC和它在路由器后台登记的MAC对不上,甚至两次扫描之间同一个IP对应的MAC都变了。

设备进入了休眠或省电模式。很多智能家居设备、Wi-Fi插座、摄像头在待机时会进入深度休眠,网卡没有完全回复ARP请求。解决办法是多扫几次,或者等设备被触发唤醒后再扫。

无线AP开了“AP隔离”功能。这个功能把同一Wi-Fi下的客户端互相隔开,防止它们直接通信。你的电脑和手机看似在同一个局域网,实际上二层报文根本到不了对端。这种情况下扫描只能看到网关,看不到其他无线设备。

设备禁用了ICMP协议。ping不到不代表不存活,用arp-scan或者nmap -sn判断存活更可靠,因为它们不只是依赖ICMP。

5.4 扫出来一大堆地址,分不清谁是谁

初级用户看到一张几十行的扫描结果,很容易懵。我建议分三步走。

第一步标出网关和已知设备,把192.168.1.1这类地址和你的手机、打印机对应的MAC识别出来,剩下的就是需要排查的陌生设备。第二步查陌生MAC的厂商前缀,如果厂商字段是未知或冷门牌子,就要去路由器后台看看它是什么时候接入的。第三步,对于你觉得可疑的IP,用nmap单独扫它的端口和服务,一台设备如果开着SSH、HTTP或者远程桌面端口,基本能判断它是台电脑或者开发板。

还有一类地址需要忽略:多播和广播地址。比如224.0.0.251是mDNS多播地址,255.255.255.255是广播地址,它们不是真实的设备IP。arp-scan的默认输出通常不会包含这些,但如果你自己跑脚本,最好过滤掉以224.开头的多播地址。

5.5 IP地址老变,隔天就换了

局域网默认是动态DHCP分配,设备重启后拿到的IP可能和之前不一样。你今天扫描记下某个设备的IP,明天就变了,这在动态分配的网络里是正常现象。

要解决“地址总变”的问题,有两个思路。一是去路由器后台,把常用设备改成静态IP或做DHCP静态绑定,让路由器根据MAC地址固定分配同一个IP。二是接受动态分配的现实,每次需要连设备时重新扫描一次,或者通过设备的主机名访问。Ubuntu上查局域网主机名可以用:

avahi-browse -a

或者:

nmcli dev show

有些设备支持mDNS/DNS-SD,在Ubuntu上直接用主机名.local也能访问,这样就不用关心IP分到哪了。

6. 经验之谈:工具只是第一步,会看协议才不迷路

扫描局域网这个需求,工具层面的差别其实不大,真正拉开差距的是对协议的理解和对结果的分析能力。从刚接触这几条命令到现在,我自己最深的体会有两个。

一,先有清单,再下结论。每次扫描完,我会先把网关、自己电脑、自己手机的MAC地址标出来,确认这些都对应上了,再去判断剩下的陌生设备。扫描结果里出现“未知设备”不一定是坏事,它可能只是路由器本体、打印机、电视盒子这些不起眼但一直在线的设备。

二,多用离线数据做辅助。扫描只能告诉你“此刻谁在线”,但DHCP租约、路由器后台历史记录、你手边设备的MAC清单,能帮你把时间线串起来。有一次我排查一个“每隔一段时间网络就卡一下”的问题,就是用arp-scan连续记录了一周,发现某个陌生IP总是在相同时间段出现,顺着MAC查到是一台被配置了固定轮询任务的开发板,不断占带宽。这个如果没有历史记录,单次扫描根本发现不了。

最后分享一个我现在的固定流程:先sudo arp-scan --localnet拉全量在线清单,再用ip neigh验证最近通信过的邻居,如果发现可疑新设备,就拿sudo nmap -sV 目标IP看它开了什么服务。整套流程五分钟以内搞定,能应对大多数局域网设备盘点和排查需求。网络排查这件事,扎实掌握几条命令然后用得顺手,远比背一大堆参数列表有意义。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询