View Full Version : [java] NAT e indirizzi privati
ciao a tutti
ho un problema da proporvi
come posso fare per conoscere gli indirizzi interni di una lan che esce all'esterno attraverso nat?
sto realizzando un sistema di tipo brokered peer-to-peer in cui ci sono dei client che fanno da relay. il mio problema è che se ci sono più client che si trovano dietro lo stesso firewall-nat allora per questi client ci sarà un unico relay che si trova sempre nella subnet
ora come posso individuare client di questo tipo?
avevo pensato a protocolli p2p tipo gnutella...qcuno sa darmi qualche indicazione?
ah!il tutto codato in java...ma se mi date spunti di partenza è già tanto ;)
andrea
Mi sa che puoi fare poco... Se N host con indirizzo IP privato escono con un unico IP pubblico non puoi connetterti ad un determinato host se non tramite modifiche alla configurazione del firewall/router...
In pratica gli host della rete interna non potranno essere raggiunti su eventuali porte in listen...al massimo puoi creati sul server una porta in ascolto apposita per quell'host... Un po' l'inverso di quello che avviene per il passive mode nei server FTP...
ma il nat non assegna indirizzi diversi ad ogni singolo indirizzo interno?
mi semrba che sia il napt che faccia tutto con un unico indirizzo...o sbaglio?
Dipende...NAT può voler dire sia una che l'altra cosa...poi i produttori lo chiamano PAT o NAPT...
capisco...quindi tu dici che non si possa fare molto...
nemmeno capire in un certo modo quale sia il client "più vicino" per fare da relay?
Solitamente se sono dietro ad un firewall sono tutti "vicini" allo stesso modo... Tanto vale sceglierne uno qualunque...
Comunque se c'è un NAT 1-1, cioè una corrispondenza biunivoca fra indirzzo pubblico ed indirizzo privato la cosa cambia...infatti in tal caso il PC è a tutti gli effetti come se fosse connesso direttamente in internet (a parte alcune probabili regole di filtraggio del firewall)... Ma solitamente sono solamente le macchine che fanno da server a godere di questa possibilità...
quindi se io sul server implemento un meccanismo che, una volta accettata la richiesta di un client C con ip X, controlla se esiste già un relay R con indirizzo X e a quel punto assegna ad A il relay R altrimenti fa diventare A un relay per tutte le successive macchine che hanno lo stesso indirizzo X, secondo te può funzionare?
Può funzionare, ma ricordati che non puoi dire ad A chi è il relay R all'interno della rete...al limite, se informi il client A che c'è già un relay con l'indirizzo uguale al suo dovrà essere A a valutare l'indirizzo ip privato del relay (scansione della classe o pacchetto in broadcast)...
grande!
è proprio quello che avevo pensato
quindi supponiamo che A sia il primo client dietro nat che si colleghi al mio server, a quel punto io memorizzo l'indirizzo di A e lo faccio diventare un relay per la sua subnet aprendo un socket datagram su una porta stabilita X
ora se si collega un altro client B con lo stesso indirizzo di A, mi basterà fargli segnalare dal server che esiste già un relay per lui e far mandare ad A un messaggio broadcast sulla porta X.
Ti sembra corretto?
Sì, ma tu non conosci l'indirzzo privato di A... Al limite potresti farti comunicare l'indirizzo IP privato da A stesso...e memorizzarlo sul server...
Altrimenti B deve trovarsi da solo l'indirizzo privato di A... La cosa ideale sarebbe con un messaggio in broadcast...ma non so se si possa gestire con Java...
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.