PDA

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?

dierre
24-11-2005, 17:17
se usi un web server apache, credo tu possa usare i virtual hosts dal computer C

samu76
24-11-2005, 17:28
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?)

kingv
24-11-2005, 17:36
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.

_YTS_
24-11-2005, 17:39
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?

kingv
24-11-2005, 17:43
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

dierre
24-11-2005, 18:26
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

dierre
24-11-2005, 18:28
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

dierre
24-11-2005, 18:38
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

dierre
24-11-2005, 18:46
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();
}

_YTS_
25-11-2005, 07:03
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.

dierre
25-11-2005, 08:30
è programmazione concorrente vero? :)

_YTS_
25-11-2005, 08:50
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

dierre
25-11-2005, 11:09
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