View Full Version : [guru madness] Operazione trivella!
ilsensine
24-11-2005, 17:05
Ho dovuto risolvere un problema particolare. Ho trovato una soluzione che mi sembra buona, ma vorrei sapere se qualcuno se ne viene fuori con soluzioni alternative.
Problema:
Ho una serie di computer, A1, A2...An. Ogni computer "A" può comparire e scomparire dalla rete; ovvero non si può assumere a priori la presenza di quali elementi. I computer "A" tra loro non si possono contattare.
Mettiamo che i computer escano su internet tramite il gateway B. E' come in una rete aziendale, con la differenza che B non può essere contattato da internet e che i nodi interni A non sono in comunicazione tra loro.
Possiamo però mettere mano a piacimento sui singoli computer A, e su un computer C, un server pubblico su internet. Ogni computer A può ovviamente contattare C.
I vari computer A hanno un web server.
Il problema è far sì che, tramite C, si possa accedere tramite internet - con un url apposito - ai web server di A, quando questi server sono in esecuzione. Ad esempio l'url http://www.C.org/pc_A3 dovrebbe mettermi in comunicazione diretta con il web server di A3.
Come fareste voi?
se usi un web server apache, credo tu possa usare i virtual hosts dal computer C
non me ne intendo ma provo a buttarla li...
impostare iptables e le tabelle di route del pc C affinche, non appena gli giunga una richiesta per il webserv di un pc, questo, giri in automatico la richiesta a tale pc, previa verifica del suo stato on line...
sui vari pc, settare iptables affinche accetti solo richieste da parte di C e che da pc Ax possa uscire solo traffico verso C
altra soluzione,
virtual server su pc C, è nelle varie sezioni virtual, montare in NFS la partizione /var/www dei vari pc sparsi per la rete
spero di non aver detto una vagonata di stupidate :)
SilverXXX
24-11-2005, 17:29
Un programmino ad hoc? :stordita:
ilsensine
24-11-2005, 17:33
se usi un web server apache, credo tu possa usare i virtual hosts dal computer C
Questa è solo parte della soluzione. Rimane il problema di come Apache su C possa contattare gli altri Apache.
ilsensine
24-11-2005, 17:34
non me ne intendo ma provo a buttarla li...
impostare iptables e le tabelle di route del pc C affinche, non appena gli giunga una richiesta per il webserv di un pc, questo, giri in automatico la richiesta a tale pc, previa verifica del suo stato on line...
sui vari pc, settare iptables affinche accetti solo richieste da parte di C e che da pc Ax possa uscire solo traffico verso C
Non fattibile, C non può contattare gli A.
Stessa cosa sul nfs (soluzione interessante, ma - a parte il problema sulla connessione - troppo vulnerabile: che succede se un A scompare?)
potresti configurare su C apache come reverse proxy e da i vari A crearti dei tunnel ssh verso C. Su C i tunnel SSh dovrebbero essere protetti da firewall in modo da essere accessibili solo dalla macchina stessa (per non scavalcare apache).
sull'apache di C i mapping sarebbero del tipo:
/host1 -> http(s)://locahost:20081
/host2 -> http(s)://locahost:20082
ecc.ecc.
oppure si potrebbe pensare qualche trucco con netcat.
domani in ufficio provo se si puo' fare.
tunnel sul gateway?
porte diverse su web server dei pc An?
mm bel problema!
ilsensine
24-11-2005, 17:40
potresti configurare su C apache come reverse proxy e da i vari A crearti dei tunnel ssh verso C. Su C i tunnel SSh dovrebbero essere protetti da firewall in modo da essere accessibili solo dalla macchina stessa (per non scavalcare apache).
sull'apache di C i mapping sarebbero del tipo:
/host1 -> http(s)://locahost:20081
/host2 -> http(s)://locahost:20082
ecc.ecc.
Un tunnel ssh l'ho preso in considerazione, ed in effetti è una soluzione fattibile. L'ho scartata in quanto i computer A hanno veramente poca potenza, e non mi sembrava il caso di introdurre la crittografia o comunque il passaggio per un altro programma user space. Inoltre, non so quanto facilmente questo tunnel possa essere creato in automatico senza intervento dell'utente (ad es. tramite script o programmi appositi che si interfacciano con ssh).
oppure si potrebbe pensare qualche trucco con netcat.
Non conosco netcat; in effetti lavorare con i web server non è il mio forte, mi sono trovato in mezzo a questo pasticcio per caso.
Fortuna che avevo un sistemista che ha pensato subito al reverse proxy, mi ha tolto metà del problema.
ilsensine
24-11-2005, 17:43
tunnel sul gateway?
Il problema è proprio nei tunnel tra gli An e C. ssh è una soluzione, io ne ho implementata una più leggera (e discretamente "originale") -- altre idee?
Fortuna che avevo un sistemista che ha pensato subito al reverse proxy, mi ha tolto metà del problema.
ti ha tolto il problema di indirizzare la comunicazione da C ma non riesco a capire come hai fatto a trasportare poi la richiesta verso i web server di A[1-n]
non e' importante, ma per curiosità A sono palmari?
ilsensine
24-11-2005, 17:46
non e' importante, ma per curiosità A sono palmari?
no, qualcosa di meno potente :D
gromit60
24-11-2005, 17:52
Una niubbata: una vpn? es. con openvpn...
Creando una vpn dove C è il centro ed i vari A vi si connettono quando sono up. Poi mi pare che diventino nè più nè meno degli host della rete (virtuale).
edivad82
24-11-2005, 18:00
uhm...hai implementato il reverse proxy, ok, rimane il problema però per accedere ai contenuti, da C ad A[x]
gli A[x] richiedono tramite proxy le pagine di se stessi e vengono cacheate? :stordita:
no, cavolata, C non ci arriva :fagiano:
ilsensine
24-11-2005, 18:03
Possibile che non esiste qualche altra soluzione banale? Non si può fare in qualche modo un semplice tunnel ip-ip se entrambi i nodi non si vedono?
Guruteeeeech dove sei!!
ilsensine
24-11-2005, 18:05
Una niubbata: una vpn? es. con openvpn...
Creando una vpn dove C è il centro ed i vari A vi si connettono quando sono up. Poi mi pare che diventino nè più nè meno degli host della rete (virtuale).
Bè non volevo arrivare a tanto...la mia soluzione è molto più semplice (anzi se è l'unica ora vado e la brevetto :D )
edivad82
24-11-2005, 18:11
Possibile che non esiste qualche altra soluzione banale? Non si può fare in qualche modo un semplice tunnel ip-ip se entrambi i nodi non si vedono?
Guruteeeeech dove sei!!
beh, tunneling http si può fare anche da proxati/nattati (soluzione molto in voga nelle varie università con pc di appoggio esterno per navigare senza problemi :D)
edivad82
24-11-2005, 18:14
http://www.nocrew.org/software/httptunnel.html
http://www.htthost.com/quick_overview.boa
edivad82
24-11-2005, 18:26
cmq la più semplice la vedo con un tunnel ssh con la solita opzione -L
Questa è solo parte della soluzione. Rimane il problema di come Apache su C possa contattare gli altri Apache.
Beh con l'ip interno alla rete.
Cioè se C non può contattare gli A non c'è soluzione al tuo problema secondo me.
altrimenti apache degli "A" risponde di default alla porta 80 dell'ip interno. Tu non devi far altro che elencare i virtual hosts in C
cosa sarebbe il tunnelling di preciso?
edivad82
24-11-2005, 18:34
cosa sarebbe il tunnelling di preciso?
sostanzialmente è un canale virtuale tra due apparati, i pacchetti vengono incapsulati ed inviati tramite questo tunnel, ricevuti e spacchettati ed usati...
è sostanzialmente un port forwarding
perchè è comodo? se sei su una rete dove l'unica porta aperta è la 80, crei un tunnel http con una macchina esterna e da quella accedi poi a qualsiasi porta sull'esterno, per esempio pop3, smtp ecc ecc creandoti un tunnel verso quel sistema
cioè in pratica verso l'esterno tutti i servizi escono dalla stessa porta?
edivad82
24-11-2005, 18:39
cioè in pratica verso l'esterno tutti i servizi escono dalla stessa porta?
sostanzialmente si perchè vengono "incanalati" in questo tunnel che sfocia in un'altra macchina esterna che provvederà poi a usare e smistare quei dati
sostanzialmente si perchè vengono "incanalati" in questo tunnel che sfocia in un'altra macchina esterna che provvederà poi a usare e smistare quei dati
grazie per la lezione, molto interessante :D
ilsensine
24-11-2005, 19:56
http://www.nocrew.org/software/httptunnel.html
http://www.htthost.com/quick_overview.boa
Non conoscevo queste cose (vedrò bene di cosa si tratta); la soluzione che ho adottato è la seguente (in linea di principio):
lato A:
int fd = open_tcp_socket_to_C();
do_some_auth(fd);
if(!fork()) {
char *argv[] = {
"/usr/sbin/pppd",
"local",
"notty",
NULL
}
dup2(fd, 0);
dup2(fd, 1);
execvp(argv[0], argv);
}
lato C:
char *cl_ip = alloc_ip_for_client();
char *my_ip = get_my_ip();
int fd = accept_tcp_socket_from_A();
do_some_auth(fd);
if(!fork()) {
char set_ip[32];
char *argv[] = {
"/usr/sbin/pppd",
"local",
"notty",
set_ip,
NULL
}
sprintf(set_ip, "%s:%s", my_ip, cl_ip);
dup2(fd, 0);
dup2(fd, 1);
execvp(argv[0], argv);
} else {
update_apache();
}
emmm....
se potresti tradurre,please :sofico:
cmq sei andato ben oltre il networking!!
ciao
ilsensine
25-11-2005, 07:59
Semplicemente, ho aperto un socket tcp tra A e C (avevo già un programma in A che si connetteva a un'altro programma in C per altri motivi), e ci ho ficcato dentro il traffico ppp.
Alla fine ho creato una interfaccia "ppp over tcp".
Provate a connettere due computer con un cavo seriale "null modem"; su un computer eseguite:
pppd local 10.0.0.1:10.0.0.2 /dev/ttyS0
Sul secondo:
pppd local /dev/ttyS0
Così facendo avete creato un canale ppp tra i due computer, incanalato tramite il cavo seriale. La mia idea è stata quella di usare un socket al posto del dispositivo seriale.
è programmazione concorrente vero? :)
ilsensine, bella trovata, date le mie attuali conoscenze non ci sarei arrivato...
ne farò tesoro, tnx
ciao
#!/bin/sh
25-11-2005, 11:03
io la risolverei cosi':
configurare apache su c in modo che:
ulr-comp-c/a1 -> ip-b:81
url-comp-c/a2 -> ip-b:82
....
ulr-comp-c/an -> ip-b:8n
come gia' suggerito. su b farei un port forward in modo che il traffico proveniente da C venga rediretto sugli host giusti. l'unica cosa di cui c'e' bisogno e' che i pc A abbiano gli ip fissi.
edivad82
25-11-2005, 11:05
io la risolverei cosi':
configurare apache su c in modo che:
ulr-comp-c/a1 -> ip-b:81
url-comp-c/a2 -> ip-b:82
....
ulr-comp-c/an -> ip-b:8n
come gia' suggerito. su b farei un port forward in modo che il traffico proveniente da C venga rediretto sugli host giusti. l'unica cosa di cui c'e' bisogno e' che i pc A abbiano gli ip fissi.
da quanto ho capito b non si può toccare
io la risolverei cosi':
configurare apache su c in modo che:
ulr-comp-c/a1 -> ip-b:81
url-comp-c/a2 -> ip-b:82
....
ulr-comp-c/an -> ip-b:8n
come gia' suggerito. su b farei un port forward in modo che il traffico proveniente da C venga rediretto sugli host giusti. l'unica cosa di cui c'e' bisogno e' che i pc A abbiano gli ip fissi.
a quanto ho capito non possono comunicare...
#!/bin/sh
25-11-2005, 11:10
da quanto ho capito b non si può toccare
:muro: mi era sfuggito....
SilverXXX
25-11-2005, 11:11
Ma alla fine ci dici esattamente qual'era il problema? :D
ilsensine
25-11-2005, 11:37
Ma alla fine ci dici esattamente qual'era il problema? :D
http://www.hwupgrade.it/forum/showpost.php?p=10319204&postcount=1
:sofico:
gurutech
25-11-2005, 13:16
Possibile che non esiste qualche altra soluzione banale? Non si può fare in qualche modo un semplice tunnel ip-ip se entrambi i nodi non si vedono?
Guruteeeeech dove sei!!
son qui, ho avuto un po' da fare per studio!
A accede a C tramite NAT ? hai il controllo di B ?
edivad82
25-11-2005, 13:17
son qui, ho avuto un po' da fare per studio!
A accede a C tramite NAT ? hai il controllo di B ?
appena detto sopra :D no :D
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.