PDA

View Full Version : [socket programming] conversione indirizzi di rete


gurutech
21-11-2007, 15:42
Ciao,
sto scrivendo un programma che ha a che fare con la rete.
ad un certo punto mi trovo a dover visualizzare gli indirizzi IP sorgente e destinazione di un pacchetto che ho acquisito. faccio così:

[...]
struct iphdr {
unsigned char version;
unsigned char hdrlen;
unsigned char tos;
unsigned short int totlen;
unsigned char protocol;
unsigned long int srcip;
unsigned long int dstip;
} packet;
struct in_addr srcaddr;
struct in_addr dstaddr;
char saddr[16],daddr[16];
[...]
packet.srcip=0;
for (k=12;k<16;k++) {
packet.srcip <<= 8;
packet.srcip+=payload[k];
}
packet.dstip=0;
for (k=16;k<20;k++) {
packet.dstip <<= 8;
packet.dstip+=payload[k];
}
srcaddr.s_addr=htonl(packet.srcip);
memset(saddr,0,16);
snprintf(saddr,16,"%s",inet_ntoa(srcaddr));
dstaddr.s_addr=htonl(packet.dstip);
memset(daddr,0,16);
snprintf(daddr,16,"%s",inet_ntoa(dstaddr));
printf("SRC %s DST %s\n",saddr,daddr);

risultato:
SRC 191.168.0.9 DST 212.66.99.56

la destinazione e' corretta, ma la sorgente e' sbagliata (e' 192.168.0.9)
dove sbaglio?
grazie

ilsensine
21-11-2007, 16:25
payload deve essere un array di unsigned char.

gurutech
21-11-2007, 16:42
payload deve essere un array di unsigned char.

grazie!
in effetti era una cavolata.
io mi ero attenuto alle specifiche della funzione nfq_get_payload

int nfq_get_payload(struct nfq_data *nfad, char **data)


ma utilizzando unsigned char funziona tutto!

ilsensine
21-11-2007, 16:45
Che stai facendo, un plugin per netfilter?

ilsensine
21-11-2007, 16:50
A proposito, la struct in_addr è già in network order, te la cavi più velocemente così:
memcpy(&srcaddr.s_addr, payload+12, sizeof(srcaddr.s_addr));
memcpy(&dstaddr.s_addr, payload+16, sizeof(srcaddr.s_addr));

gurutech
21-11-2007, 16:51
Che stai facendo, un plugin per netfilter?

un URL filter trasparente utilizzando il target NFQUEUE

due schede di rete senza indirizzo ip in bridge tra loro, regola di iptables su br0 con target NFQUEUE. il firewall va attaccato in serie al cavo di rete che va sul computer (o sul router).
sto smontando i pacchetti che passano sino a riconoscere l'url (ormai ci sono ...)

ilsensine
21-11-2007, 16:56
un URL filter trasparente utilizzando il target NFQUEUE
Ovvero? Sniffi le richieste dns e le filtri in base al contenuto?

gurutech
21-11-2007, 17:01
Ovvero? Sniffi le richieste dns e le filtri in base al contenuto?

be le schede di rete non sono neanche in modalità promiscua, per cui non è sniffing in quel senso. comunque si tratta di un firewall layer 7
mettendolo in mezzo al cavo di rete tutto quello che viene trasmesso può essere acquisito.Devo interpretare la URL richiesta ed emettere un verdetto con nfq_set_verdict a seconda di cosa e' stato richiesto. per il momento e' più un esperimento che altro. poi vedremo.