LAN'daki Bütün Cihazların IP Adreslerini Bulma

Merhaba. LAN’ımızda bulunan bütün cihazların IP’sini nasıl elde edebilirim? Örneğin Windows’da CMD’ye arp -a yazdığımızda bu cihazların çoğunu gösteriyor, ama hepsini değil. Normalde bu adrese gittiğimizde modemden kendisine bağlanan cihazların bilgilerini alabiliyoruz ancak bu sayfa da internet sağlayıcısına göre değiştiği için genel bir çözüm sağlamıyor. Bunu yapmamızı sağlayacak (en azından windows’da) genel bir çözüm var mı acaba?

LAN’daki IP adresleri belirli bir ağ maskesine göre dağıtılır. Örneğin ağ maskesi 192.168.1.0/24 ise, ağdaki IP adresleri 192.168.1.1 ile 192.168.1.255 arasındadır(255.255.255.0) ve 254 tane IP var demektir. Ya da ağ maskesi 192.168.0.0/16 ise IP adresleri 192.168.1.1 ile 192.168.255.255 aralığındadır yani (255*255)-1 toplam 65024 tane IP var demektir. Bu durumda yapmanız gereken şey ağ maskesini elde ederek IP aralığını bulup bir listeye kaydetmek ve bu listedeki IP adreslerinin aktif olup olmadığını kontrol etmektir. Böylece sizinle aynı ağda bulunan cihazların IP’sini elde edebilirsiniz.

arp -a ile elde ettiğiniz IP adresleri, bilgisayarınızın daha önce iletişim kurduğu IP adresleridir. O yüzden ağdaki tüm IP’lere bu komutla erişemezsiniz, tabi bilgisayarınız ağdaki tüm bilgisayarlar ile iletişim kurmamışsa.

2 Beğeni

Cevabınız için teşekkür ederim. Ağ maskesi hakkında bilgi sahibiyim. Bütün mümkün IP adreslerinin tarayan kütüphaneler zaten mevcut, ancak bu biraz zaman alıyor. IP adreslerinin bilgileri zaten modemde mevcut. Ben de bunu kısa bir süre içerisinde elde etmenin bir yolu var mı diye düşünüyordum.

Modem arayüzleri sürekli değişiklik gösterir. Her IP listesi elde etmek istediğinizde modeme bağlanıp bilgileri almak uzun iş.

Hızlı tarama işlemini yapmak belli bir yerden sonra mümkün görünmüyor. Ne yaparsanız yapın bağlantı hızı ve bağlantı sayısı her zaman etkisini gösterecektir. İsterseniz yüzlerce thread oluşturup tek seferde taramaya çalışın. Bu sefer de bilgisayarda hız düşmesi olacaktır. Her ihtimalde bekleme süresi bir miktar uzun olacaktır. Belki timeout süresini ayarlayarak bekleme süresini sınırlandırabilirsiniz.

Herşeye rağmen hedefiniz hız ise, hızlı kütüphaneleri kullanın. Nasıl yaptıklarını merak ediyorsanız kaynak kodları internet üzerinde açık olanları inceleyip bu işi nasıl yaptıklarını inceleyebilirsiniz. Örneğin

1 Beğeni

Teşekkür ederim, verdiğiniz linki inceleyeceğim. Modemden bu verileri almak için belirli bir protokol bulunmuyor sanırım. Eğer tek yol taramak ise zaten yapacak pek bir şey yok.

1 Beğeni

üstadım, vakti zamanında c de hazırlamıstım, windows ve linux da calısıyordu, oldukca da hızlı, ilgini cekerse derleyip test edebilirsin.

#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 
#include <errno.h> 
#ifdef _WIN32
#define WIN32_LEAN_AND_MEAN 1
#include <winsock2.h>
#include <windows.h>
#else
#include <netdb.h> 
#include <sys/types.h> 
#include <sys/socket.h> 
#include <netinet/in.h> 
#include <arpa/inet.h> 
#endif


void checkHostName(int hostname)
{ 
	if (hostname == -1)
	{ 
		perror("gethostname");
		exit(1);
	} 
} 


void checkHostEntry(struct hostent * hostentry) 
{ 
	if (hostentry == NULL) 
	{ 
		perror("gethostbyname"); 
		exit(1); 
	} 
} 


void checkIPbuffer(char *IPbuffer) 
{ 
	if (NULL == IPbuffer) 
	{ 
		perror("inet_ntoa"); 
		exit(1); 
	} 
} 


int main() 
{ 
	char hostbuffer[256]; 
	char *IPbuffer; 
	struct hostent *host_entry; 
	int hostname; 

	hostname = gethostname(hostbuffer, sizeof(hostbuffer)); 
	checkHostName(hostname); 

	host_entry = gethostbyname(hostbuffer); 
	checkHostEntry(host_entry); 

	IPbuffer = inet_ntoa(*((struct in_addr*) 
						host_entry->h_addr_list[0])); 

	printf("Hostname: %s\n", hostbuffer); 
	printf("Host IP: %s", IPbuffer); 

	return 0; 
}
2 Beğeni

bazı router ve modemlerde o verileri alma sansınız var, mesela telnet protokolunu kullanarak dhcp tablosuna erisebilirsiniz, hepsinde bu tabloların oldugu dizin aynımıdır bilmiyorum fakat lancom router icin setup/dhcp/dhcp-table dizininden telnet vasıtasıyla bu tarz verileri cektim daha once.

1 Beğeni

Çok ilginç bir şekilde kimse nmap yazmamış. :slightly_smiling_face:
Neyse konuyla ilgili temel network kavramlarına aşina olduğunuzu varsayıyorum.

Benim bu konu için yaygın kullandığım yazılım

advanced ip scanner

Eğer ağ bilgisayarlarında ki açık portlarıda görmek isterseniz

advanced port scanner

Bu ikisi işinizi görecektir diye düşünüyorum. Sadece ip adreslerini değil netbios isimlerini, mac adreslerini verebilmenin yanı sıra birden çok network’ü tek seferde taramanızı da sağlar. Ancak linux alternatifi arıyorsanız veya bu işinize yeterli gelmediyse nmap bu iş için biçilmiş kaftandır. Her iki yazılım ile ilgili sorularınız olursa burdan yardımcı olabilirim, kolay gelsin.

Hangi amacla?
Cunku “SSH ile baglanabilecegim makineleri ariyorum” gibi bir sey soylemedigin surece bunu yapmak imkansiz.

Switch’lerin tamaminin ARP cache girdilerini toplarsan son birkac bin aletin IP adresini bulabilirsin, belki.

IP, ismi ustunde, internet protokolu oldugu icin bagli butun cihazlarin IP adreslerini bulma gibi bir sey yok. Internet’e bagli butun cihazlarin IP adreslerini bulabilir miyiz?

ARP cache entry’lerini gosteriyor. Ayni subnet’te olup yakin zamanda dogrudan haberlestigin IP adreslerinin bir kismini gosteriyor. Hepsi tek bir cihaza ait olabilir. Surekli konustugun bir cihazin IP adreslerinin %1’ini bile temsil etmiyor olabilir.

Pratikte en mumkun olani bu gibi.
Bu sayfanin internet saglayicisiyla alakasi yok, cogu konfigurasyonda dogrudan modemin uzerindeki bir web sunucusundan sunuluyor.
Tipik ev konfigurasyonlarinda bu aletin IP adresini routing tablosu default entry’sinden bulabilirsin (0.0.0.0’a giden).

3 Beğeni

Genel bilgi dogru olmakla beraber hesaplarda hata var:

13:58:02 0 aib@vivaldi:~% subnetcalc 192.168.1.0/24
Address       = 192.168.1.0
                   11000000 . 10101000 . 00000001 . 00000000
Network       = 192.168.1.0 / 24
Netmask       = 255.255.255.0
Broadcast     = 192.168.1.255
Wildcard Mask = 0.0.0.255
Hosts Bits    = 8
Max. Hosts    = 254   (2^8 - 2)
Host Range    = { 192.168.1.1 - 192.168.1.254 }

13:58:10 0 aib@vivaldi:~% subnetcalc 192.168.0.0/16
Address       = 192.168.0.0
                   11000000 . 10101000 . 00000000 . 00000000
Network       = 192.168.0.0 / 16
Netmask       = 255.255.0.0
Broadcast     = 192.168.255.255
Wildcard Mask = 0.0.255.255
Hosts Bits    = 16
Max. Hosts    = 65534   (2^16 - 2)
Host Range    = { 192.168.0.1 - 192.168.255.254 }

Aralardaki .0 ve .255 IP adreslerini atlamissin :slight_smile:

3 Beğeni

Aslında bunu araştırmaya başladığımda ilk amacım LAN’da çalışacak multiplayer bir oyunda bağlanılması mümkün cihazları bulmakdı. Bunun daha kolay yöntemleri varsa onu da bilmek isterim.

Tabii doğrudan internet sağlayıcısı ile alakalı değil. Ama hepsi aynı HTTP içeriğini yollamıyor. Biraz yanlış ifade etmişim sanırım.

Aynen. 65024 demiştim. .0 ve .255 IP adreslerini de eklersek 65024 + 510 = 65534 oluyor :slight_smile:

Aslında daha çok işin programlama kısmıyla ilgilendiğini düşünerek çözüm önerisinde bulundum. Diğer türlü, kendisinin de dediği gibi bu işi yapan onlarca kütüphane ve program var.

3 Beğeni

UDP broadcast. 255.255.255.255 veya (IP | ~netmask)

2 Beğeni

Doğru ya, UDP niye aklıma gelmedi bilmiyorum. Çözümünüz ihtiyacımı karşıladı, teşekkür ederim.

Şöyle bir kod yazdım, eksiği varsa düzeltirsiniz diye ekliyorum:

import socket
import select

class Getter:
    def __init__(self):
        self.socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        self.socket.bind(('',64321))
        self.ips = []

    def update(self):
        while select.select((self.socket,),(),(),0)[0]:
            m=self.socket.recvfrom(1024)
            ip = m[1][0]
            if m[0][0]:
                if ip not in self.ips:
                    self.ips.append(ip)
            else:
                try:
                    self.ips.remove(ip)
                except ValueError: pass
        return self.ips
    
class Broadcaster:
    def __init__(self):
        self.socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)

    def broadcast(self, bool_: bool):
        """Cihazın bağlanmaya müsait olup olmadığını duyur."""
        if bool_:
            self.socket.sendto(b'\x01',('255.255.255.255',64321))
        else:
            self.socket.sendto(b'\x00',('255.255.255.255',64321))

4 Beğeni

Sanırım tek eksik broadcast adresi. Onu da @aib nin dediği gibi ( IP | netmask ) ile yapabilirsin.

1 Beğeni

Ekrem hocam merhaba,

bende sizin arayışınızda olan bir kod oluşturmaya çalışıyorum, size danışmam gereken bir konu var sizin ile nasıl iletişie geçebilirim ?

Merhaba.

Bana özel olarak yazmanıza gerek yok, forumda yeni bir konu açabilirsiniz.

Hangi shell bu?