PDA

View Full Version : Socket su Solaris


DavideBerra
26-04-2004, 16:06
Ho un problema con una macchina solaris...

La situazione e' la seguente

# netstat -nr

Routing Table: IPv4
Destination Gateway Flags Ref Use Interface
-------------------- -------------------- ----- ----- ------ ---------
172.24.12.32 172.24.12.41 U 1 89 eri0
138.132.65.0 138.132.65.141 U 1 477 eri1
224.0.0.0 138.132.65.141 U 1 0 eri1
default 138.132.65.1 UG 1 2
127.0.0.1 127.0.0.1 UH 3 579285 lo0

# ifconfig -a
lo0: flags=1000849<UP,LOOPBACK,RUNNING,MULTICAST,IPv4> mtu 8232 index 1
inet 127.0.0.1 netmask ff000000
eri0: flags=1000843<UP,BROADCAST,RUNNING,MULTICAST,IPv4> mtu 1500 index 2
inet 172.24.12.41 netmask ffffffe0 broadcast 172.24.12.63
ether 0:3:ba:2d:61:14
eri1: flags=1000843<UP,BROADCAST,RUNNING,MULTICAST,IPv4> mtu 1500 index 3
inet 138.132.65.141 netmask ffffff00 broadcast 138.132.65.255
ether 0:3:ba:2d:61:15

Quando vado ad aprire un socket sulla macchina e mando un messaggio verso l'indirizzo
172.24.12.36 (quindi dovrebbe passare dall'interfaccia eri0) mi ritrovo un pacchetto
UDP che contiene nella testata SOURCE ADDRESS 138.132.65.141

Ovviamente chi riceve il pacchetto non risponde in quanto ritiene quel pacchetto CORROTTO
per via dell'indirizzo di rete sbagliato

Cosa sbaglio??????????? Perche' prende l'interfaccia eri1 come default???????

ilsensine
26-04-2004, 21:52
Il pacchetto non è affatto corrotto, semplicemente segue un altro instradamento. Se chi lo riceve non ha regole di routing su come smistare i pacchetti di risposta verso 138.132.65.141, semplicemente scarta le risposte.

Il tuo problema potrebbe essere dovuto all'impossibilità di instradare pacchetti su eri0 (cavo difettoso?); in questo caso, è corretto che venga tentata la successiva regola di routing ammissibile (nel tuo caso la default route). A parte questo, mi sembra tutto in ordine ed è strano che non ti funzioni...

DavideBerra
26-04-2004, 22:26
Originariamente inviato da ilsensine
Il pacchetto non è affatto corrotto, semplicemente segue un altro instradamento. Se chi lo riceve non ha regole di routing su come smistare i pacchetti di risposta verso 138.132.65.141, semplicemente scarta le risposte.

Il tuo problema potrebbe essere dovuto all'impossibilità di instradare pacchetti su eri0 (cavo difettoso?); in questo caso, è corretto che venga tentata la successiva regola di routing ammissibile (nel tuo caso la default route). A parte questo, mi sembra tutto in ordine ed è strano che non ti funzioni...

Ciao e grazie per la risposta...

purtroppo il cavo non è difettoso in quanto questo messaggio "difettoso" sulla eri1 viene prodotto in seguito alla ricezione (scambio di messaggi) sull'interfaccia eri0 (quindi sulla rete 138.x.x.x).

Mi è stato detto addirittura che Solaris a volte sceglie A CASO l'interfaccia da utilizzare. Mi sembra assurdo. Così come mi sembra assurdo che un pacchetto verso la rete 172.x.x.x passi dall'interfaccia 138.x.x.x

sicuramente c'è qualcosa che non va a livello di configurazione, ma NESSUNO riesce a dirmi cosa.

ciao e grazie ancora

ilsensine
26-04-2004, 22:30
Originariamente inviato da DavideBerra
Mi è stato detto addirittura che Solaris a volte sceglie A CASO l'interfaccia da utilizzare. Mi sembra assurdo.
Ditto


Così come mi sembra assurdo che un pacchetto verso la rete 172.x.x.x passi dall'interfaccia 138.x.x.x
In teoria, no (se le precedenti regole falliscono).
Fai una cosa, elimia la default route (e solo quella) e guarda se il traffico su eri0 torna normale.

So che per i socket udp è possibile forzare l'allocazione di una specifica porta sorgente; non so se è possibile fare lo stesso per l'ip. Darò un'occhiata domani se trovo un pò di tempo.

DavideBerra
26-04-2004, 22:55
Originariamente inviato da ilsensine
Ditto


In teoria, no (se le precedenti regole falliscono).
Fai una cosa, elimia la default route (e solo quella) e guarda se il traffico su eri0 torna normale.

So che per i socket udp è possibile forzare l'allocazione di una specifica porta sorgente; non so se è possibile fare lo stesso per l'ip. Darò un'occhiata domani se trovo un pò di tempo.

Purtroppo togliere la default route (che è un gateway che collega la rete aziendale con la rete degli elaboratori) significa perdere il collegamento con la macchina, che non è accessibile da console ma solo via telnet (per me almeno).

O magari si può ma mi manca qualche conoscenza base per poterlo fare...
:cool:

Vorrei solo sapere SU CHE BASE selezione l'interfaccia "opposta" al posto di quella già collegata sulla rete giusta...

ilsensine
27-04-2004, 10:23
Come ti ho detto, lui consulta le regole dalla prima all'ultima; quando incontra una regola appropriata, tenta di utilizzare l'interfaccia indicata. Se non ci riesce, passa alla regola successiva.

Potrebbe anche succedere un'altra cosa: visto che per i pacchetti udp il kernel deve fare il possibile per tentare il recapito, ma senza particolari cure sulla duplicazione dei pacchetti, potrebbe decidere di mandare pacchetti udp identici sulle varie interfacce: in questo caso, se il pacchetto sulla eri0 va perso (può accadere con l'udp), arriva l'altro. Mi sembra assurdo sinceramente, ma non so se gli rfc lo consentono e se Solaris effettivamente fa così.

Non puoi usare una connessione tcp?

ilsensine
27-04-2004, 11:27
Allora, per forzare un particolare indirizzo sorgente per un socket udp devi fare così (a parte la gestione errori ecc.):


int fd;
struct sockaddr_in addr;
fd = socket(PF_INET, SOCK_DGRAM, 0);
addr.sin_family = AF_INET;
addr.sin_port = 0;
inet_aton("172.24.12.41", &addr.sin_addr);
bind(fd, (struct sockaddr *) &addr, sizeof(addr));

Quindi per trasmettere usi la normale sendto().
Non l'ho testato, ma dovrebbe funzionare.

DavideBerra
27-04-2004, 13:05
Originariamente inviato da ilsensine
Allora, per forzare un particolare indirizzo sorgente per un socket udp devi fare così (a parte la gestione errori ecc.):


int fd;
struct sockaddr_in addr;
fd = socket(PF_INET, SOCK_DGRAM, 0);
addr.sin_family = AF_INET;
addr.sin_port = 0;
inet_aton("172.24.12.41", &addr.sin_addr);
bind(fd, (struct sockaddr *) &addr, sizeof(addr));

Quindi per trasmettere usi la normale sendto().
Non l'ho testato, ma dovrebbe funzionare.


Grazie per l'aiuto, ma facendo cosi' mi pare si fissi l'IP del destinatario e non del sorgente.
Credo che l'interfaccia da utilizzare possa solo essere selezionata dal S.O. a questo punto...

:( :(

Se ho qualche news ti faccio sapere... ;)

ilsensine
27-04-2004, 13:06
Originariamente inviato da DavideBerra
Grazie per l'aiuto, ma facendo cosi' mi pare si fissi l'IP del destinatario e non del sorgente.

No. Con bind setti porta e IP sorgente.
In sendto() passi porta/IP del destinatario.