Topic: rete: Individuazione schede "fisiche" nel sistema  (Letto 168 volte)

0 Utenti e 1 Visitatore stanno visualizzando questo topic.

Offline nuzzopippo

  • python habilis
  • **
  • Post: 92
  • Punti reputazione: 0
    • Mostra profilo
rete: Individuazione schede "fisiche" nel sistema
« il: Agosto 06, 2019, 13:10 »
I miei saluti.

Per una "trasformazione" della lan locale, da IP statici definiti localmente a DHCP non controllabile localmente, mi sto ponendo domande su come individuare alcuni server in lan locale (database, ftp, ssh etc.) in un ambiente ad IP variabili.

La soluzione più immediata che mi è venuta in mente è individuare gli indirizzi tcp-ip locali alla macchina e poi fare una scansione del range 1 - 254 della sotto-rete locale per vedere su quali indirizzi le porte dei server sono aperte ed in ascolto.

Individuare gli indirizzi IP locali alla macchina mi è riuscito utilizzando il modulo "netifaces", in questo modo :
>>> import netifaces as ni
>>> nif = ni.interfaces()
>>> for scheda in nif:
print('Interfaccia :', scheda)
diz_ind = ni.ifaddresses(scheda)
for chiave in diz_ind.keys():
if chiave == 2:
print('%3s' % chiave, diz_ind[chiave])
print()


Interfaccia : lo
  2 [{'addr': '127.0.0.1', 'netmask': '255.0.0.0', 'peer': '127.0.0.1'}]

Interfaccia : enp2s0
  2 [{'addr': '192.168.60.28', 'netmask': '255.255.255.0', 'broadcast': '192.168.60.255'}]

>>>


Ma vorrei limitare le scansioni alle sole schede "fisiche" presenti nel sistema, evitando interfacce di loobpack e virtuali, è un po' che cerco nella documentazione ma non mi riesce di individuare niente di utile in merito a come effettuare una tale distinzione, avreste delle indicazioni da darmi in proposito?

Grazie dell'attenzione :)

Offline nuzzopippo

  • python habilis
  • **
  • Post: 92
  • Punti reputazione: 0
    • Mostra profilo
Re:rete: Individuazione schede "fisiche" nel sistema
« Risposta #1 il: Agosto 09, 2019, 13:14 »
... beh, lo so che quanto sopra non è un argomento che interessi molto. Comunque, nel caso a qualcuno possa interessare, mi sono accorto di un particolare che non si evince dalla documentazione da me trovata e che dovrò testare su sistemi e s.o. diversi dal mio, per verificarne l'utilità.

Il particolare è questo : tutte le interfacce di rete rilevate tramite netifaces.interfaces() hanno una chiave "17" presente nel dizionario restituito da "netifaces.ifaddresses(scheda)", tale chiave corrisponde alla costante "netifaces.AF_PACKET", della quale non ho trovato uno straccio di documentazione che mi indichi cosa sia ma nella cui lista di dizionari, alla chiave 'addr', contiene il MAC della scheda di rete fisica corrispondente, mentre i valori sono nulli per l'interfaccia di loopback.
Ciò permetterebbe di limitare le ricognizioni da effettuare nella LAN locale agli indirizzi IPv4 che presentino dei mac valorizzati e connessioni IP del tipo voluto, estraendole con un codice del genere :

>>> import netifaces as ni
>>> nif = ni.interfaces()
>>> for scheda in nif:
diz_ind = ni.ifaddresses(scheda)
passed = False
if ni.AF_PACKET in diz_ind.keys():
mac_addr = diz_ind[ni.AF_PACKET][0]['addr']
for elem in mac_addr.split(':'):
if elem != '00':
passed = True
break
if passed:
print('Scheda', scheda,
      '- MAC addr. :', diz_ind[ni.AF_PACKET][0]['addr'])
if ni.AF_INET in diz_ind.keys():
for ind in diz_ind[ni.AF_INET]:
print('Indirizzo IP :', ind['addr'])
else:
print('Scheda', scheda, 'non ha indirizzo fisico')
print()


Scheda lo non ha indirizzo fisico

Scheda enp2s0 - MAC addr. : a0:d3:c1:3d:7e:32
Indirizzo IP : 192.168.60.28

>>>


Certamente, potrei anche essere in errore, il mio capire poco e nulla dell'inglese è micidiale e spesso mi fa prendere cantonate.

Offline GlennHK

  • python sapiens sapiens
  • ******
  • Post: 1.655
  • Punti reputazione: 1
    • Mostra profilo
    • La Tana di GlennHK
Re:rete: Individuazione schede "fisiche" nel sistema
« Risposta #2 il: Agosto 12, 2019, 00:42 »
Ho dato un'occhiata al codice C del modulo.


https://github.com/al45tair/netifaces/blob/2d09bb1a31700a446454c84247c98bea3f3d72a2/netifaces.c


Sembrerebbe che lui recuperi gli indirizzi usando la funzione https://docs.microsoft.com/en-us/windows/win32/api/iphlpapi/nf-iphlpapi-getadaptersaddresses (almeno su Windows), e gli stati di uscita "ERROR_SUCCESS" e "ERROR_NO_DATA" (che presumo codifichino rispettivamente i casi interfaccia "reale" e "virtuale") sono gestiti allo stesso modo, che per te si traduce nell'avere l'indirizzo MAC nullo.

Su Linux invece viene usata la funzione getifaddrs, e i casi senza indirizzi fisici vengono gestiti analogamente.

Tieni conto che comunque è un'indagine di massima.

Offline nuzzopippo

  • python habilis
  • **
  • Post: 92
  • Punti reputazione: 0
    • Mostra profilo
Re:rete: Individuazione schede "fisiche" nel sistema
« Risposta #3 il: Agosto 14, 2019, 08:37 »
Ho dato un'occhiata al codice C del modulo.
...
Tieni conto che comunque è un'indagine di massima.

Grazie della risposta @GlennHK, ho dato una rapida occhiata da quanto da Te segnalato e ve ne è di roba da vedere, in effetti, le complessità stessa dell'argomento (Layer OSI e protocollo TCP-IP) è proibitiva circa approfondimenti puntuali in una sede quale un post.
Mi consola che "bene o male" la Tua indagine all'incirca confermi quanto intuito ed esposto nel mio precedente post.

Per altro, nelle descrizioni di varia documentazione reperita, si trova :
Citazione
AF_PACKET — low-level packet receiving interface.
che è una ulteriore conferma si stia sulla giusta strada.

Va da se che ulteriori approfondimenti occorrano prima di utilizzare "operativamente" quanto esposto ma le Tue indicazioni sono utili in proposito, grazie ancora :)

Offline nuzzopippo

  • python habilis
  • **
  • Post: 92
  • Punti reputazione: 0
    • Mostra profilo
Re:rete: Individuazione schede "fisiche" nel sistema
« Risposta #4 il: Ottobre 04, 2019, 10:57 »
Per eventuali interessati :

Ho, infine, trovato questa documentazione (che poi è la stessa indicata prima, letta meglio  :angry: )sul modulo netifaces ove indica (verso metà pagina) esplicitamente la modalità con la quale ottenere il mac di una scheda, utilizzando la costante netifaces.AF_LINK.

Applicando dette indicazioni, per ottenere l'indirizzo da trattarsi si potrebbe procedere così :
>>> for scheda in ni.interfaces():
indirizzi = ni.ifaddresses(scheda)
mac_addr = indirizzi[ni.AF_LINK][0]['addr']
print(scheda, 'mac :', mac_addr)


lo mac : 00:00:00:00:00:00
enp2s0 mac : a0:d3:c1:3d:7e:32
>>>
« Ultima modifica: Ottobre 04, 2019, 11:03 da nuzzopippo »