Bir ağ üzerinde kullanılmayan IP Adresi nasıl bulunur?


25

Sadece bir ağ üzerinde kullanılmayan IP Adresini bulmak istiyorum. Nmap ile mümkün olduğunu düşünüyorum. Herhangi biri bana yol diyebilir mi?

Not:

Sadece ücretsiz IP listesine ihtiyacım var.


Başka gereksinim var mı?
Sergey

Daha fazla gereksinim yok. Şu an itibariyle birçok IP adresi çakışması buldum, sadece bir ağ üzerindeki ücretsiz ip adresini bulmak ve onu atamak istiyorum.
karthick87

Yanıtlar:


26

Hızlı bir tarayıcı, bir ağdaki diğer makineleri "görmek" için ARP kullanan bir taramadır . Ayrıca MAC adresini döndürür ve ağ bağdaştırıcısının üreticisini belirlemeye çalışır.

Örnek kullanım (yerine wlan0göre eth0gerekli ise):

$ 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

Bu yardımcı programın yalnızca açık olan makineleri bildirdiğini unutmayın. Bir makinenin ağdaki diğer makinelerle etkileşime girmesi pinggerektiğinden engellenebilir, ancak arp-scanengellenemez. Bir IP'nin kullanılmadığından emin olmak için yönlendiricinize (statik / dinamik adresler için) ve DHCP sunucusuna (dinamik adresler için) bakmalısınız.


Bu hoşuma gitti ama test ettiğimde birkaç ev sahibi kaçırdı. :(
bumbling aptalı

@bumblingfool: diğer ana bilgisayarların aynı alt ağda olduğundan emin misiniz? 192.168.1.x ve 192.168.2.x değil mi?
Lekensteyn

Evet, tüm ana bilgisayarlar aynı alt ağda. Bir düzine daha fazla koştum ve tüm ana bilgisayarların ortaya çıktığı zamanın 2 / 3'ü. İlginçtir ki? Ayrıca, yukarıda belirtilen nmap yöntemi tutarlı bir şekilde herhangi bir konağı kaçırmaz.
sersem aptal

Kaç tane ev sahibinden bahsediyoruz? -iParametreleri kullanarak paketleri gönderme arasındaki gecikmeyi arttırmayı deneyin , örneğin -i 55 ms.
Lekensteyn

2/5. Gecikmeyi artırmak hile yaptı. Teşekkürler!
aptal

15

sudo nmap -sP -PR 192.168.0.* (ya da ağınız her neyse) bu işi yapacak

Yüklemek için kullanın sudo apt-get install nmap.

Kaynak: serverfault.com .

Sadece bunu test ettim, gizlenmiş konaklar da dahil olmak üzere bir çekicilik gibi çalışır, -PRseçeneği kullanabilmek için sudo eklemeniz gerekir .


1
Daha yeni test ettim, çalıştırmak için ihtiyacınız olan bir root (örn. Kullanmak sudo). Ayrıca, büyük olasılıkla aramaları yavaşlatan ana bilgisayarın portlarını da tararken güvenlik duvarı tarafından engellenir.
Lekensteyn

Orijinal yazıyı okuyun plz, 3. yorum (gereksiz) port taramasının nasıl kullanılmayacağını açıklar;)
Bruno Pereira

Bunu cevabınıza eklemelisiniz, o zaman herkes kaynakları takip etmek istemez. Ayrıca komutun gerçekte ne yaptığını tarif etmek de faydalı olacaktır.
Lekensteyn

yapılan;) gerçekten güzel çalışıyor.
Bruno Pereira,

Havent test (veya hiç kullanılmış) arp tarama, öneri için teşekkürler!
Bruno Pereira,

4

Fping yararlı buluyorum; diğer şeylerin yanı sıra, 'canlı' olan ve 'erişilemez' olan bir dizi adres ve listeye ping atacak. fping varsayılan olarak yüklenmez.

sudo apt-get install fping

Basit yaklaşım, sadece bir dizi adres üzerinde çalıştırmaktır.

fping -g 192.168.0.2 192.168.0.254 2>/dev/null

Kullanılmayan IP'lerin bir listesini çıkarmak için biraz daha ayrıntılı.

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
Bunun, ev sahiplerinin bir ICMP Echo isteğine yanıt verdiğini varsaydığını unutmayın (diğer bir deyişle ping). Her ana bilgisayar bunu yapmaz, özellikle de bazı MS Windows makineleri yapmaz. Ayrıca güvenlik duvarları, çevrimiçi oldukları ve ağınızda bir MAC adresi olmasına rağmen, genellikle bunu devre dışı bırakır. Bu hızlı bir çözümdür, ancak her durumda güvenilmemelidir.
eaydin

Haklısın; nmap veya ICMP dışındaki protokolleri kullanabilen ping'e alternatif bir çözüm daha güvenilir olacaktır.
bgvaughan

3

En iyi çözüm olmadığına inanıyorum ama istediğini yapıyor. Bu komut dosyası ağ pingüzerinden çalışır 192.168.0.0/24ve ARP önbelleğinde yoksa etkin olmayan IP'lerin listesini döndürür.

Önceki çözümlere göre avantajları:

  • Her iki yöntemi de kullanır: ping ve ARP kontrolü
  • rootkullanıcı olarak çalıştırmaya gerek yok
  • Çekirdek i3-2100 üzerinde yaklaşık 1.5 dakika çalışır

Ağınızı taramak için <first IP> <last IP>parametrelerle çalıştırın .

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

Oy verdikten sonra güncelle

Yazdım çünkü nmap -PR 192.168.0.*benim için işe yaramadı:

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

Güncelleme 2

ARP önbelleği ile ilgili tüm sorunlar düzeltildi.


2
Bir makine ping'e cevap vermezse ne olur? IP'nin kullanımda olmadığı anlamına mı geliyor?
Bruno Pereira,

@ brunopereira81 Ücretsiz IP'yi kapalı ana bilgisayardan ayırt etmek için herhangi bir yol bilmiyorum.
Sergey,

Kapalı değil, bir bilgisayarın güvenlik duvarı normal ping'lere cevap vermeyecek şekilde yapılandırılabilir. Bu yolla cevap alamazsınız, ancak bu, bilgisayarın kapalı olduğu veya çalışan hizmetleri olmadığı anlamına gelmez, sadece normal pingleri yok sayar. (Soruya ilişkin senaryoyu bilmiyorum ama) Ping'i görmezden gelen bir güvenlik duvarına / ağ geçidine ping attığını hayal edin. Yanıt vermeyecek şekilde yapılandırılmış olduğundan, güvenlik duvarının / ağ geçidinin arkasında olabileceği için IP'nin serbest olduğunu varsayar. IP çakışması nedeniyle yeni indirilen bilgisayarların X sayısı!
Bruno Pereira,

@ brunopereira81 Bunun ideal olmadığını biliyorum. Bu yüzden "hızlı ve kirli" olarak adlandırıyorum :) :)
Sergey

İyi cevap, böyle bir cevabın aşağı indirilmesinin nasıl yardımcı olduğunu anlamıyorum.
nikhil

1

Bu doğru bash yapmalı:

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

daha basit olduğunu düşünüyorum

# 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

Kodunuza bakmak isteyebilirsiniz. Alt ağımda bana alınan tüm IP'leri bile gösteriyor.
Videonauth

hayır, test ediyorum ve benim için iyi çalışıyor, aslında bu ip adreslerini canlı ayarlayamıyorsunuz çünkü grep ekliyorum "is unreachable" veya yaşıyorsanız, grep -v timebelki sizin için iyi çalışacak şekilde değiştirin
user3607303
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.