Bagaimana menemukan Alamat IP yang tidak digunakan di jaringan?

25

Saya hanya ingin mengetahui Alamat IP yang tidak digunakan pada jaringan. Saya pikir itu mungkin dengan nmap. Adakah yang bisa mengatakan padaku jalan pls?

catatan:

Saya hanya perlu daftar IP gratis saja.

karthick87
sumber
Apakah ada persyaratan tambahan?
Sergey
Tidak ada lagi persyaratan tambahan. Sampai sekarang saya telah menemukan banyak konflik alamat IP, saya hanya ingin mengetahui alamat ip gratis di jaringan dan menetapkannya.
karthick87

Jawaban:

26

Pemindai cepat adalah arp-scan yang menggunakan ARP untuk "melihat" mesin lain di jaringan. Ini juga mengembalikan alamat MAC dan mencoba menentukan pembuat adaptor jaringan.

Contoh penggunaan (ganti wlan0dengan eth0jika perlu):

$ 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

Perhatikan bahwa utilitas ini hanya melaporkan mesin yang dinyalakan. pingdapat diblokir, tetapi arp-scantidak dapat diblokir karena itu diperlukan untuk mesin untuk berinteraksi dengan mesin lain di jaringan. Untuk memastikan bahwa IP tidak digunakan, Anda sebaiknya melihat router Anda (untuk alamat statis / dinamis) dan server DHCP (untuk alamat dinamis).

Lekensteyn
sumber
Saya ingin seperti ini tetapi melewatkan beberapa host ketika saya mengujinya?!? :(
kikuk bodoh
@umbumbfool: apakah Anda yakin bahwa host lain berada di subnet yang sama? Misalnya 192.168.1.x dan bukan 192.168.2.x?
Lekensteyn
Ya, semua host berada di subnet yang sama. Saya menjalankannya selusin kali lebih banyak dan 2/3 dari waktu semua host muncul. Menariknya (?), Selalu host yang sama yang tidak muncul (jika ada) ... Ini ada di jaringan wifi tetapi sinyalnya solid. Juga, metode nmap yang disebutkan di atas secara konsisten tidak melewatkan host apa pun.
kikuk bodoh
Berapa banyak host yang kita bicarakan? Coba tingkatkan penundaan antara mengirim paket menggunakan -iparameter, mis. -i 5Selama 5 ms.
Lekensteyn
2/5. Meningkatkan keterlambatan memang berhasil. Terima kasih!
kikuk bodoh
15

sudo nmap -sP -PR 192.168.0.* (atau apa pun jaringan Anda) akan melakukan trik.

Untuk menginstalnya gunakan sudo apt-get install nmap.

Sumber: serverfault.com .

Baru saja diuji ini, berfungsi seperti mantra termasuk host yang dikaburkan, Anda perlu menambahkan sudo untuk dapat menggunakan -PRopsi.

Bruno Pereira
sumber
1
Saya baru saja mengujinya dan Anda perlu menjalankannya sebagai root (yaitu menggunakan sudo). Selain itu, mungkin diblokir oleh firewall karena juga memindai port host yang juga memperlambat pencarian.
Lekensteyn
Baca post asli plz, komentar ke-3 menjelaskan cara untuk tidak menggunakan pemindaian port (yang tidak perlu);)
Bruno Pereira
Anda harus memasukkan itu dalam jawaban Anda kemudian, tidak semua orang ingin mengikuti sumber. Juga akan membantu untuk menggambarkan apa yang sebenarnya dilakukan perintah.
Lekensteyn
selesai;) bekerja sangat bagus.
Bruno Pereira
Havent diuji (atau pernah digunakan) arp-scan, terima kasih sugestion!
Bruno Pereira
4

Saya merasa fping bermanfaat; antara lain, itu akan melakukan ping ke berbagai alamat dan daftar yang 'hidup' dan yang 'tidak terjangkau'. fping tidak diinstal secara default.

sudo apt-get install fping

Pendekatan sederhananya adalah dengan menjalankannya pada rentang alamat.

fping -g 192.168.0.2 192.168.0.254 2>/dev/null

Sedikit lebih rumit, untuk menghasilkan daftar IP yang tidak digunakan.

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
bgvaughan
sumber
1
Jangan lupa bahwa ini mengasumsikan host merespons permintaan ICMP Echo (alias ping). Tidak setiap host melakukan itu, terutama beberapa mesin MS Windows tidak. Juga firewall biasanya menonaktifkan ini, meskipun mereka sedang online dan memiliki alamat MAC di jaringan Anda. Ini adalah solusi cepat, tetapi tidak harus diandalkan dalam setiap situasi.
eaydin
Kamu benar; solusi yang melibatkan nmap, atau beberapa alternatif untuk ping yang dapat menggunakan protokol selain ICMP, akan lebih andal.
bgvaughan
3

Saya percaya itu bukan solusi terbaik tetapi melakukan apa yang Anda inginkan. Script ini berjalan pingmelalui 192.168.0.0/24jaringan dan mengembalikan daftar IP yang tidak aktif jika tidak ada dalam cache ARP.

Keuntungan dibandingkan solusi sebelumnya:

  • menggunakan kedua metode: ping dan cek ARP
  • tidak perlu dijalankan sebagai rootpengguna
  • berjalan sekitar 1,5 menit pada Core i3-2100 saya

Untuk memindai jaringan Anda jalankan dengan <first IP> <last IP>parameter.

#!/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

Perbarui setelah downvote

Saya menulisnya karena nmap -PR 192.168.0.*tidak bekerja untuk saya:

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

Perbarui 2

Memperbaiki semua masalah dengan ARP-cache.

Sergey
sumber
2
Bagaimana jika mesin tidak merespons ping? Apakah itu berarti IP tidak digunakan?
Bruno Pereira
@ brunopereira81 Saya tidak tahu cara membedakan IP gratis dari mematikan host.
Sergey
Tidak dimatikan, firewall komputer dapat dikonfigurasi untuk tidak menanggapi ping normal. Dengan begitu Anda tidak mendapat balasan tetapi itu tidak berarti bahwa komputer dalam keadaan mati atau tidak memiliki layanan yang berjalan, itu hanya mengabaikan ping normal. (Saya tidak tahu skenario relatif terhadap pertanyaan tetapi) Bayangkan dia ping firewall / gateway yang mengabaikan ping-nya karena tidak dikonfigurasi untuk merespons, dia berasumsi bahwa IP gratis sehingga dia menggunakannya, di balik itu firewall / gateway dapat Jumlah komputer X yang baru saja turun karena konflik IP!
Bruno Pereira
@ brunopereira81 Saya tahu itu tidak ideal. Itulah mengapa saya menyebutnya "cepat dan kotor" :)
Sergey
Jawaban yang bagus, saya tidak mengerti bagaimana downvoting jawaban seperti itu membantu.
nikhil
1

Ini harus dilakukan dengan benar di bash:

#!/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
Videonauth
sumber
0

Saya pikir ini lebih sederhana

# 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
pengguna3607303
sumber
Anda mungkin ingin melihat kode Anda. Di subnet saya itu menunjukkan semua IP bahkan yang diambil.
Videonauth
tidak, saya mengujinya dan berfungsi dengan baik untuk saya, pada kenyataannya Anda tidak dapat mengatur alamat ip yang masih hidup karena saya menambahkan grep "is unreachable" atau jika Anda tinggal mengubahnya agar grep -v timemungkin berfungsi dengan baik untuk Anda
user3607303