วิธีค้นหาที่อยู่ IP ที่ไม่ได้ใช้ในเครือข่าย


25

ฉันแค่ต้องการทราบที่อยู่ IP ที่ไม่ได้ใช้ในเครือข่าย ฉันคิดว่าเป็นไปได้ด้วย nmap ใครช่วยบอกฉันหน่อยได้ไหม?

บันทึก:

ฉันแค่ต้องการรายการ IP ฟรีเพียงอย่างเดียว


มีข้อกำหนดเพิ่มเติมหรือไม่?
Sergey

ไม่มีข้อกำหนดเพิ่มเติม ณ ตอนนี้ฉันพบที่อยู่ IP หลายแห่งฉันต้องการหาที่อยู่ IP ฟรีบนเครือข่ายและกำหนด
karthick87

คำตอบ:


26

สแกนเนอร์ที่รวดเร็วคือarp-scanซึ่งใช้ARPเพื่อ "ดู" เครื่องอื่น ๆ บนเครือข่าย นอกจากนี้ยังส่งคืนที่อยู่ MAC และพยายามระบุผู้ผลิตอะแดปเตอร์เครือข่าย

ตัวอย่างการใช้งาน (แทนที่wlan0ด้วยeth0หากจำเป็น):

$ sudo arp-scan -I wlan0 192.168.1.0/24
Interface: wlan0, datalink type: EN10MB (Ethernet)
Starting arp-scan 1.6 with 256 hosts (http://www.nta-monitor.com/tools/arp-scan/)
192.168.1.10    00:90:f5:33:e2:f2       CLEVO CO.
192.168.1.254   00:14:7f:72:cd:05       Thomson Telecom Belgium

2 packets received by filter, 0 packets dropped by kernel
Ending arp-scan 1.6: 256 hosts scanned in 1.406 seconds (182.08 hosts/sec).  2 responded

โปรดทราบว่ายูทิลิตี้นี้จะรายงานเฉพาะเครื่องที่เปิดอยู่เท่านั้น pingสามารถถูกบล็อกได้ แต่arp-scanไม่สามารถถูกปิดกั้นได้เนื่องจากเป็นสิ่งจำเป็นสำหรับเครื่องที่จะโต้ตอบกับเครื่องอื่น ๆ บนเครือข่าย เพื่อให้แน่ใจว่าไม่ได้ใช้ IP คุณควรดูเราเตอร์ของคุณ (สำหรับที่อยู่คงที่ / ไดนามิก) และเซิร์ฟเวอร์ DHCP (สำหรับที่อยู่ไดนามิก)


ฉันอยากจะเป็นแบบนี้ แต่มันก็พลาดคู่โฮสต์เมื่อฉันทดสอบมัน!? :(
โง่เขลา

@bumblingfool: คุณแน่ใจหรือไม่ว่าโฮสต์อื่นอยู่ในซับเน็ตเดียวกัน เช่น 192.168.1.x และไม่ใช่ 192.168.2.x?
Lekensteyn

ใช่โฮสต์ทั้งหมดอยู่ในซับเน็ตเดียวกัน ฉันวิ่งไปมากกว่าหนึ่งครั้งและ 2 / 3rds ของเวลาที่โฮสต์ทั้งหมดปรากฏตัว ที่น่าสนใจ (?) มันมักจะเป็นโฮสต์เดียวกันกับที่ไม่ปรากฏขึ้น (ถ้ามี) ... นี่คือในเครือข่าย wifi แต่สัญญาณเป็นของแข็ง นอกจากนี้วิธี nmap ที่กล่าวถึงข้างต้นอย่างสม่ำเสมอไม่พลาดทุกโฮสต์
คนโง่ที่โง่เขลา

เราพูดถึงโฮสต์กี่แห่ง ลองเพิ่มความล่าช้าระหว่างการส่งแพ็กเก็ตโดยใช้-iพารามิเตอร์เช่น-i 55 ms
Lekensteyn

2/5 การเพิ่มความล่าช้าทำให้เกิดกลอุบาย ขอบคุณ!
คนโง่ที่โง่เขลา

15

sudo nmap -sP -PR 192.168.0.* (หรือเครือข่ายของคุณคืออะไร) จะทำเคล็ดลับ

sudo apt-get install nmapในการติดตั้งใช้งาน

ที่มา: serverfault.com

เพิ่งผ่านการทดสอบนี้ใช้งานได้อย่างมีเสน่ห์รวมถึงโฮสต์ที่ไม่ชัดเจนคุณต้องเพิ่ม sudo เพื่อให้สามารถใช้-PRตัวเลือกได้


1
ฉันเพิ่งทดสอบว่าคุณจำเป็นต้องเรียกใช้เป็นราก (เช่นใช้sudo) นอกจากนี้ยังอาจถูกบล็อกโดยไฟร์วอลล์เนื่องจากสแกนพอร์ตของโฮสต์ซึ่งทำให้การค้นหาช้าลง
Lekensteyn

อ่านบทความต้นฉบับ plz, ความคิดเห็นที่ 3 อธิบายถึงวิธีการได้ใช้ (ที่ไม่จำเป็น) พอร์ตการสแกน;)
บรูโน่เปเรร่า

คุณควรรวมไว้ในคำตอบของคุณแล้วทุกคนไม่ต้องการติดตามแหล่งที่มา นอกจากนี้มันจะมีประโยชน์ในการอธิบายสิ่งที่คำสั่งทำจริง
Lekensteyn

เสร็จแล้ว;) ทำงานได้ดีจริงๆ
Bruno Pereira

ไม่ได้ทดสอบ arp-scan (หรือเคยใช้), ขอบคุณสำหรับความแออัด!
Bruno Pereira

4

ฉันพบว่า fping มีประโยชน์ เหนือสิ่งอื่นใดมันจะ ping ช่วงของที่อยู่และรายการที่ 'มีชีวิตอยู่' และ 'ไม่สามารถเข้าถึงได้' โดยค่าเริ่มต้น fping จะไม่ถูกติดตั้ง

sudo apt-get install fping

วิธีการง่าย ๆ คือเรียกใช้ผ่านช่วงของที่อยู่

fping -g 192.168.0.2 192.168.0.254 2>/dev/null

ค่อนข้างละเอียดเพื่อสร้างรายการ IP ที่ไม่ได้ใช้

fping -g 192.168.0.2 192.168.0.254 2>/dev/null | grep 'is unreachable' | cut -d ' ' -f 1 | sort -t '.' -k 4 -n

1
อย่าลืมว่าสิ่งนี้ถือว่าโฮสต์ตอบสนองต่อคำขอ ICMP Echo (aka pings) ไม่ใช่ทุก ๆ โฮสต์ที่ทำเช่นนั้นโดยเฉพาะอย่างยิ่งเครื่อง MS Windows บางเครื่องก็ไม่ทำเช่นนั้น ไฟร์วอลล์มักจะปิดใช้งานสิ่งนี้แม้ว่าจะออนไลน์และมีที่อยู่ MAC ในเครือข่ายของคุณ นี่เป็นวิธีแก้ปัญหาที่รวดเร็ว แต่ไม่ควรเชื่อถือในทุกสถานการณ์
eaydin

คุณถูก; วิธีแก้ปัญหาที่เกี่ยวข้องกับ nmap หรือทางเลือกอื่นในการ ping ที่สามารถใช้โปรโตคอลอื่นนอกเหนือจาก ICMP จะเชื่อถือได้มากกว่า
bgvaughan

3

ฉันเชื่อว่ามันไม่ใช่ทางออกที่ดีที่สุด แต่ทำในสิ่งที่คุณต้องการ สคริปต์นี้ทำงานpingบน192.168.0.0/24เครือข่ายและส่งคืนรายการ IP ที่ไม่ใช้งานหากไม่มีในแคช ARP

ข้อดีเหนือโซลูชันก่อนหน้า:

  • ใช้ทั้งสองวิธี: การ ping และการตรวจสอบ ARP
  • ไม่จำเป็นต้องเรียกใช้ในฐานะrootผู้ใช้
  • วิ่งประมาณ 1.5 นาทีบน Core i3-2100 ของฉัน

ในการสแกนเครือข่ายของคุณให้รันด้วย<first IP> <last IP>พารามิเตอร์

#!/usr/bin/env python
from threading import Thread
import subprocess
from Queue import Queue

verbose = False

num_threads = 8
queue = Queue()
inactive_ips = [0 for i in range(256)]

lines = open("/proc/net/arp", "r").readlines()
arp_cache = [l.split()[0] for l in lines[1:] if l.split()[2] == "0x2"]

def ip_str_to_int(ip):
    ip = ip.rstrip().split('.')
    ipn = 0
    while ip:
        ipn = (ipn << 8) + int(ip.pop(0))
    return ipn

def ip_int_to_str(ip):
    ips = ''
    for i in range(4):
        ip, n = divmod(ip, 256)
        ips = str(n) + '.' + ips
    return ips[:-1] ## take out extra point


#wraps system ping command
def pinger(i, q):
    while True:
        ip_num = q.get()
        ip = ip_int_to_str(ip_num)
        if ip not in arp_cache:
            ret = subprocess.call("ping -c 1 %s" % ip,
                  shell=True,
                  stdout=open('/dev/null', 'w'),
                  stderr=subprocess.STDOUT)
            if ret != 0:
                  inactive_ips[ip_num % 256] = ip
        q.task_done()


if __name__ == '__main__':
    from optparse import OptionParser
    usage = "usage: %prog [options] [first IP] [last IP]"
    parser = OptionParser(usage=usage)
    parser.add_option("-v", "--verbose", action="store_true", dest="verbose", help="make lots of noise")
    parser.add_option("-q", action="store_false", dest="verbose", help="print only IP adresses")
    (options, args) = parser.parse_args()
    verbose = options.verbose

    first = ip_str_to_int(args[0] if len(args) > 0 else "192.168.0.1")
    last = ip_str_to_int(args[1] if len(args) > 1 else "192.168.0.254")

    if verbose:
        print "Scanning inactive network addresses from %s to %s" % (
            ip_int_to_str(first),
            ip_int_to_str(last))

    for i in range(num_threads):
        worker = Thread(target=pinger, args=(i, queue))
        worker.setDaemon(True)
        worker.start()

    for ip in range(first, last + 1):
        queue.put(ip)

    queue.join()
    for ip in inactive_ips:
        if ip:
            print ip

อัปเดตหลังจาก downvote

ฉันเขียนเพราะnmap -PR 192.168.0.*ไม่ได้ผลสำหรับฉัน:

Starting Nmap 5.21 ( http://nmap.org ) at 2011-10-06 15:34 EEST
Nmap done: 256 IP addresses (0 hosts up) scanned in 0.03 seconds

อัปเดต 2

แก้ไขปัญหาทั้งหมดด้วย ARP-cache


2
จะทำอย่างไรถ้าเครื่องไม่ตอบสนองต่อการ ping หมายความว่า IP ไม่ได้ใช้งานหรือไม่
Bruno Pereira

@ brunopereira81 ฉันไม่ทราบวิธีการแยก IP ฟรีจากโฮสต์ที่ปิด
Sergey

ไม่ได้ปิดเครื่องไฟร์วอลล์ของคอมพิวเตอร์สามารถกำหนดค่าให้ไม่ตอบสนองต่อการปิงปกติ ด้วยวิธีนี้คุณจะไม่ได้รับการตอบกลับ แต่นั่นไม่ได้หมายความว่าคอมพิวเตอร์ปิดอยู่หรือไม่มีบริการที่ใช้งานอยู่ (ฉันไม่ทราบสถานการณ์ที่เกี่ยวข้องกับคำถาม แต่) ลองจินตนาการว่าเขา ping ไฟร์วอลล์ / เกตเวย์ที่ไม่สนใจ ping ของเขาเนื่องจากการกำหนดค่าไม่ตอบสนองเขาคิดว่า IP นั้นว่างดังนั้นเขาใช้มันหลังไฟร์วอลล์ / เกตเวย์นั้นสามารถ จำนวนคอมพิวเตอร์ X ที่ลดลงเนื่องจากความขัดแย้งของ IP!
Bruno Pereira

@ brunopereira81 ฉันรู้ว่ามันไม่เหมาะ นั่นคือเหตุผลที่ฉันเรียกมันว่า "รวดเร็วและสกปรก" :)
Sergey

คำตอบที่ดีฉันไม่เข้าใจว่า downvoting คำตอบนั้นช่วย
nikhil

1

สิ่งนี้ควรทำอย่างถูกต้องในการทุบตี:

#!/bin/bash

#setting language variables for subshell making sure we grep for the right word
LC_ALL=C
LANG=C

# retrieve IP from user input
read -p "Input your network (example: 192.168.0): " my_net

for i in $(seq 1 254);
do 
  ip="$my_net.$i"
  check="$(ping -c1 "$ip")"
  if [ "$(grep "Unreachable" <<<"$check")" != "" ]
  then
    echo "$ip is unreachable"
  fi
done

0

ฉันคิดว่ามันง่ายกว่า

# my_net define my Net_ID
my_net=192.168.1.
for i in `seq 1 254`;
do 
  ip="$my_net$i"
  ping -c2  $ip | grep "is unreachable" | cut -d" " -f1 &
done

คุณอาจต้องการดูรหัสของคุณ ในซับเน็ตของฉันมันแสดง IP ทั้งหมดให้ฉันแม้กระทั่งที่ถูกจับ
Videonauth

ไม่ฉันทดสอบและใช้งานได้ดีสำหรับฉันในความเป็นจริงคุณไม่สามารถตั้งค่าที่อยู่ IP เหล่านั้นยังมีชีวิตอยู่เพราะฉันเพิ่ม grep "is unreachable" หรือถ้าคุณใช้ชีวิตเปลี่ยนมันgrep -v timeอาจจะทำงานได้ดีสำหรับคุณ
user3607303
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.