แสดงรายการคอมพิวเตอร์บน LAN ใน Linux


62

ฉันเป็นนักพัฒนาเว็บที่พยายามรักษาความปลอดภัยให้ดียิ่งขึ้น ฉันกำลังพยายามหาวิธี (ใน Linux / Debian based distros) เพื่อแสดงรายการคอมพิวเตอร์ทั้งหมดใน LAN เดียวกันเน็ตบุ๊คของฉันเปิดอยู่ ฉันลอง "arp -n" แต่ฉันไม่รู้สึกว่ามันเป็นรายการที่สมบูรณ์เพราะ iPhone ของฉันอยู่ในเราเตอร์ wi-fi เดียวกับเน็ตบุ๊กของฉันและนั่นก็ไม่ได้เกิดขึ้น มีวิธีที่ดีกว่าในการรับรายชื่อเครื่องทั้งหมดที่ใช้เกตเวย์เดียวกันทั้งหมดหรือไม่


คำตอบ:


58

รับnmap เป็นโปรแกรม Trinity ที่ใช้ใน The Matrix และคุณสามารถสแกนเพื่อค้นหาอุปกรณ์ทั้งหมดที่เชื่อมต่อกับ LAN ที่คุณใช้งานอยู่และอีกมากมาย

นี่คือคู่มืออ้างอิง


16
ตกลง. ดูเหมือนว่า "sudo nmap -sL 123.123.123. *" คือสิ่งที่ฉันกำลังมองหาหรืออาจ -sP แทน -sL ขอบคุณ!
CaptSaltyJack

2
ติดตั้ง nmap ด้วยsudo apt-get install nmap
saintali

1
ฉันคิดว่านี่เป็นเว็บไซต์ที่จริงจังจริงๆฮ่า ๆ +1
user10089632

38

นี่คือสิ่งที่ฉันใช้ nmap และที่อยู่โดยใช้สัญกรณ์บล็อก CIDR ของเครือข่ายที่คุณต้องการสแกน ก่อนอื่นคุณต้องติดตั้ง nmap เนื่องจากอาจไม่ได้ติดตั้งมาพร้อมกับเครื่อง distro บน 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
          ...

ใช้ addr inet และหน้ากากที่จะคิดออกอยู่เครือข่ายในรูปแบบ CIDR เพิ่มเติมเกี่ยวกับ CIDR ที่นี่ ที่อยู่คือ:

192.168.1.0/24

เรียกใช้ nmap โดยใช้พารามิเตอร์ -sP ซึ่งจะสแกนไม่เกินกว่าการตรวจสอบว่าโฮสต์ออนไลน์:

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 

2
nmap -sA 192.168.1.0/24 ตัวเลือก nmap -sAแสดงผลลัพธ์ที่คล้ายกันพร้อมการอ่านที่ดีขึ้นซึ่งรวมถึงชื่ออุปกรณ์, IP, mac และอื่น ๆ เช่นเดียวกับตัวเลือก-sP.. โดยส่วนตัวแล้วผมชอบ -sA over-sP เพื่อประโยชน์ในการอ่าน
Jayzcode

@ Jayzcode บนเครื่องของฉัน -sA จะไม่กลับมาในขณะที่ -sP ใช้เวลาเพียง 3.73 วินาที (ตรวจพบเราเตอร์, พีซีของฉันและพีซีเครื่องอื่น) มีความคิดอะไรไหม
Rodrigo

17

arp -nแสดงเฉพาะเครื่องใน LAN ของคุณที่เครื่องของคุณได้พูดคุยแล้ว คุณสามารถรับรายการนั้นเพื่อเติมให้ดีขึ้นโดยการส่ง Ping ไปยังที่อยู่และโฮสต์มัลติคาสต์ทั้งหมด:

ที่อยู่การออกอากาศ "ทุกคน" (เป็นเลขฐานสอง) โปรดทราบว่าสแต็ค IP ส่วนใหญ่จะแปลสิ่งนี้เป็นที่อยู่ subnet broadcast สำหรับซับเน็ตทั้งหมดที่คุณแนบ:

ping 255.255.255.255

ที่อยู่ subnet broadcast สำหรับ subnet ปัจจุบันของคุณ ดังนั้นสมมติว่าคุณอยู่ใน 192.168.1.0/24:

ping 192.168.1.255

ที่อยู่แบบหลายผู้รับ "all hosts" ฉันชอบอันนี้มากเพราะมีแนวโน้มที่จะพบโฮสต์ที่กำหนดค่าไว้สำหรับเครือข่ายย่อย IP อื่น ๆ ที่เกิดขึ้นกับ Ethernet LAN เดียวกับคุณ:

ping 224.0.0.1

โปรดทราบว่าวิธีการนี้และวิธีการอื่น ๆ ที่ฉันเคยเห็นในคำตอบอื่น ๆ จนถึงตอนนี้มองหาโฮสต์ที่เข้าถึง IP ได้ในเครือข่ายปัจจุบันเท่านั้น นั่นอาจเป็นสิ่งที่คุณต้องใส่ใจ แต่เป็นไปได้ที่ผู้โจมตีสามารถสอดแนมหรือทำสิ่งที่ไม่ดีให้กับเครือข่ายที่ไม่สามารถมองเห็นผ่าน IP


8

ip neighhostsและ ไม่จำเป็นต้องใช้ nmap / NO sudo requied

เมื่อสร้างสิ่งนี้คุณสามารถสร้างสคริปต์ 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
blockloop

ip nสั้น ๆ. ip n | grep REACHABLEอาจจะดีกว่า
Pablo A

4

ฉันไม่พบคำตอบที่น่าพอใจพอฉันคิดว่าฉันจะลอง หลังจากที่ทุกคำถามที่พบบ่อยแนะนำเพื่อให้บริบทสำหรับการเชื่อมโยง

nmapเป็นสิ่งที่ดีถ้าสับสนเล็กน้อยในการใช้ นี่คือสิ่งที่ฉันเรียกใช้เพื่อค้นหาอุปกรณ์เครือข่ายท้องถิ่นที่ส่วนใหญ่สามารถคัดลอกวางได้ nmap -sP(หรือnmap -sn) สแกนโดยกระตุก มีตัวเลือกอื่น ๆ สำหรับการค้นพบโฮสต์ 'เช่นเดียวกับการมีหรือnmap -sLnmap -Pn

วิธี # 1

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

วิธี # 2 ฉันรู้ว่างานนี้ แต่ฉันไม่สามารถพูดได้ว่านี่เป็นวิธีที่ถูกต้องหรือไม่

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 ...>

ฉันยินดีที่จะทราบว่ามีวิธีที่มีประสิทธิภาพมากขึ้น จนกว่าจะถึงตอนนั้น


4

คุณสามารถลอง ping subnet ที่กำหนดทั้งหมดด้วย shell shell ขนาดเล็กได้เช่นกัน

$ for ip in $(seq 1 254); do ping -c 1 192.168.1.$ip>/dev/null; [ $? -eq 0 ] && echo "192.168.1.$ip UP" || : ; done

ในกรณีของฉันพูดขึ้นสำหรับทุกคนแล้วip nพูดล้มเหลวกับทุกคน
Pablo A

3

Huntเป็นเครื่องมือบรรทัดคำสั่งที่สามารถสร้างรายการของเครื่องจักรตามที่พวกเขาออกอากาศผ่านเครือข่ายสำหรับข้อมูล มันใช้ข้อมูล TCP, UDP, ICMP และ ARP เพื่อสร้างรายการที่อยู่ MAC ที่ใช้งานบนเครือข่าย มันเป็นเครื่องมือแบบพาสซีฟที่ทำงานโดยการฟังลวด


4
ฉันรู้ว่ามีหน้าคน แต่มันจะมีประโยชน์ที่จะเห็นตัวอย่างในคำตอบ
Ehtesh Choudhury

2

สำหรับรายการอุปกรณ์ที่เชื่อมต่อขนาดกะทัดรัดยิ่งขึ้น:

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

เมื่อระเบียนที่น่าสนใจทั้งหมดเริ่มต้นด้วยวงเล็บ(และหลัก1เราจะทำการกรองด้วย| grep \(1(ต้องใช้เครื่องหมายทับขวาเพื่อหลีกเลี่ยงวงเล็บ)

Quirk
ระวังว่าหากอุปกรณ์สองเครื่องมีชื่อเหมือนกันnmapจะแสดงเฉพาะอุปกรณ์ที่เชื่อมต่อกับเราเตอร์ล่าสุดเท่านั้น


2

ในการสแกนสถานะของช่วงของที่อยู่ IP นี่เป็นสิ่งที่ดีและง่าย:

sudo nmap -sn 192.168.1.2-20

ที่ไหน:

         -sn: Ping Scan - disable port scan

บันทึก:

  • ในรุ่นก่อนหน้าของ Nmap -snเป็นที่รู้จักกัน-sP

ฉันทำสิ่งนี้ใน Mac OS X (ซึ่งเป็นไปตาม BSD) ฉันไม่แน่ใจว่าเวอร์ชั่น Linux มีความแตกต่างหรือไม่


1
ยอดเยี่ยมสิ่งที่ฉันต้องทำคือ: sudo nmap -sP 192.168.178.0-255 นี่เป็นการสแกนในเครือข่ายย่อยที่ฉันอยู่
Leo Gerber

2

คุณสามารถใช้fping sudo apt-get install fping (ในระบบปฏิบัติการที่เหมือนเดเบียน)

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

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
  1. ส่ง Ping เครือข่ายอุปกรณ์pingableทั้งหมดในเครือข่ายย่อย 192.168.2.0/24 แบบขนาน (เพื่อลดเวลาทำงาน) หลังจากนั้นarpควรแสดงทุกอุปกรณ์ที่ตอบ

  2. ไม่ได้ตรวจสอบการเชื่อมต่อที่ใช้งานอยู่หรือปัจจุบัน แต่จะแสดงรายการการเชื่อมต่อทั้งหมดที่บริการโดเมนในพื้นที่เก็บรายการแม้กระทั่งการเชื่อมต่อที่เก่ามาก

คำอธิบายโดยละเอียดเพิ่มเติม:

  • seq 254เพื่อสร้างตัวเลขทั้งหมด 1-254 (สำหรับตัวเลขทั้งหมด 100-150: seq 100 150)
  • xargsการโทรpingและแทนที่ "IP" ( -iIP) ด้วยseqหมายเลข uence จาก stdin ดังนั้น 192.168.2.IP เปลี่ยนเป็น 192.168.2.1 สำหรับseqหมายเลขแรก-Pระบุจำนวนของpingกระบวนการที่เกิดขึ้นพร้อมกันxargsฉันควรเริ่มต้นด้วยจำนวน +1 เท่ากับที่อยู่ ( = 254) ฉันสนใจ
  • pingกับที่อยู่ ip ที่แก้ไขโดย xargs ( 192.168.2.IP) และ ping เพียงครั้งเดียว ( -c1); คุณต้องใช้ตัวระบุเดียวกันตามที่ระบุไว้สำหรับ xargs เหนือ-iอาร์กิวเมนต์ในกรณีนี้IP
  • grep time= เพื่อลบทุกบรรทัดที่มีข้อมูลฟุ่มเฟือยเราเพียง แต่สนใจคำตอบเท่านั้นซึ่งให้เวลาไปกลับ (= ได้รับคำตอบ)
  • arp -a เพื่อแสดงคู่ชื่อ (ip) ที่ถูกต้อง

ฉันเรียกสิ่งนี้ว่าคำสั่งpingallของฉันและทำให้พร้อมใช้งานผ่าน alias ใน~/.bashrc:

alias pingall='seq 254 | xargs -iIP -P255 ping -c1 192.168.2.IP |grep time='
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.