Newsgroup: it.comp.os.linux.development
Titolo: Socket raw

Salve a tutti,
ho un problema con le socket di tipo raw, precisamente, voglio gestire
manualmente, attraverso un mio programmino, il meccanismo del three way
handshake di una connessione TCP ma ho il problema che non riesco a
comunicare al kernel, sempre che sia possibile, di non rispondere a
ciò che arriva dall'altro capo della comunicazione.
La situazione è questa: dal lato client costruisco il mio pacchetto e
lo invio ad un server, il quale mi risponde in maniera corretta. A tale
messaggio però, prima della mia applicazione, risponde il kernel, il
quale non sa che quel pacchetto l'ho inviato io e così invia un RST
per terminare la connessione.
Come posso fare per evitare che il kernel si intrometta tra me (la mia
applicazione) e il server a cui intendo connettermi? C'è qualche altra
soluzione? Ho provato anche con la libreria libnet ma il problema è
sempre quello di far sapere al kernel che sto implementando una
connessione TCP in user space.
Qualsiasi suggerimento sarà molto apprezzato dato che sono due
settimane che sto impazzendo.
Grazie a tutti!
Marco.

 Marco.
Ciao Marco,
premetto che non sono molto esperto in materia, ma a suo tempo ho avuto 
lo stesso problema anche io.
Come soluzione ho adottato quella di utilizzare le librerie di ipchains 
per kernel vecchi (dalla 2.4 hanno lasciato il supporto alle ipchains, e 
da una versione della 2.6 hanno tolto pure quello).
Per kernel nuovi io ho usato una semplicissima chiamata a iptables 
tramite system(). Qualcosa del tipo:
snprintf(regola, sizeof(regola) - 1,  "%s -I INPUT -p tcp -s %s -d %s 
--dport %d --sport %d\n", IPTABLES_BIN, ip_mittente, ip_destinatario,	 
porta_destinatario, porta_mittente);
system(regola);
Non so quanto possa essere "pulita" questa soluzione, ma quando l'ho 
chiesto io su questo ng non avevo avuto risposta.
Spero ti possa essere utile...
Ciao

Ciao GeeRay,
voglio ringraziarti: il tuo suggerimento è stato veramente importante.
Non vorrei approfittarne ma dal momento che mi sembra che tu abbia gia
fatto quello che devo fare io vorrei chiederti come posso inviare una
richiesta http (una semplice GET .....)
utilizzando le socket raw. Mi spiego meglio: creo il mio pacchetto ip,
il mio pacchetto tcp nel cui payload inserisco la mia richiesta e poi
faccio una sendto verso il server. I pacchetti così come i vari
checksum sono costruiti bene soltanto che al server dall'altra parte
sembra non arrivare la richiesta inclusa nel payload del pacchetto tcp.
Questo è l'output di tcpdump
12:12:36.320646 IP (tos 0x0, ttl  60, id 7699, offset 0, flags [DF],
proto: TCP (6), length: 66) notebook.5001 > notebook.5194: P, cksum
0x7082 (correct), 102:128(26) ack 1951365578 win 4096
        0x0000:  4500 0042 1e13 4000 3c06 9f48 c0a8 0005
E..B..@.<..H....
        0x0010:  c0a8 0005 1389 144a 0000 0066 744f 79ca
.......J...ftOy.
        0x0020:  5018 1000 7082 1b1c 4745 5420 2f6e 6675
P...p...GET./ris
        0x0030:  726d 656e 6520 4854 5450 2f31 2e31 0a0d
orsa.HTTP/1.1..
        0x0040:  0a0d                                     ..
Ho notato qualcosa di diverso tra questo output è il seguente che è
l'output relativo ad una richiesta inoltrata con Mozilla:
11:58:53.476523 IP (tos 0x0, ttl  64, id 55774, offset 0, flags [DF],
proto: TCP (6), length: 464) localhost.34017 > localhost.5193: P
1080650622:1080651034(412) ack 1073305961 win 8192 <nop,nop,timestamp
4294947489 4294947489>
        0x0000:  4500 01d0 d9de 4000 4006 6147 7f00 0001
E.....@.@.aG....
        0x0010:  7f00 0001 84e1 1449 4069 6b7e 3ff9 5969
.......I@ik~?.Yi
        0x0020:  8018 2000 ffc4 0000 0101 080a ffff b2a1
................
        0x0030:  ffff b2a1 4745 5420 2f6e 6675 726d 656e
....GET./risors
        0x0040:  6520 4854 5450 2f31 2e31 0d0a 486f 7374
a.HTTP/1.1..Host
        0x0050:  3a20                                     :.
In particolare nella seconda riga il flag P è seguito immediatamente
dal sequence number mentre nella richiesta che faccio io no.
Può essere questo il mio problema?
A cosa può essere dovuto?
Spero che tu possa darmi qualche altro seuggerimento prezioso come il
precedente!!!!!!
Ciao e ancora grazie!!!!
Marco