Précédent   Forum des professionnels en informatique > Systèmes > Linux > Réseau
Réseau Vos questions autour des réseaux et télécoms sous Linux
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 27/02/2007, 18h51   #1
Invité(e)
Invité(e)
 
Messages : n/a
Détails du profil
Informations forums :
Messages : n/a
Points : 0
Par défaut Sniffer Réseau - choisir son interface

Bonjour,

j'essaie d'écrire un sniffer réseau, en me basant sur la très bonne documentation disponible ici :

http://www.cgsecurity.org/Articles/sniffer/index.html

Cependant, cela fonctionne très bien sur mon interface réseau eth0. Je voudrais faire la meme chose, mais sur eth1.

D'après le man packet, je vois cela :

Citation:
Par défaut, tous les paquets du type de protocole indiqué sont passés à la socket packet. Pour ne recevoir que les paquets d’une interface donnée utilisez bind(2) en indiquant une adresse dans une struct sockaddr_ll pour attacher la socket à une interface. Seuls les champs d’adresse sll_protocol et sll_ifindex sont utilisés pour l’attachement.
Comment utiliser correctement bind() dans ce cas la pour sniffer les paquets venant sur mon interface eth1 ? comment connaitre l'index de mon interface ??

Merci,

doobs

PS : voici le code associé

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
int main(int argc, char *argv[])
{
 
  int sock;
 
  /* Ouverture Socket */
  sock = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL));
  if (sock < 0) {
    perror("socket()");
    exit(errno);
  }
 
  for(;;) {
    int n_read;
    char buffer[BUFFER_MAX];
    struct sockaddr_ll      from;
    socklen_t               fromlen = sizeof(from);
    n_read = recvfrom(sock, buffer, BUFFER_MAX, 0, (struct sockaddr*)&from, &fromlen);
 
    /* Traitement de paquets */
  }
  close(sock);
  return 0;
}
  Envoyer un message privé Réponse avec citation 00
Vieux 28/02/2007, 11h05   #2
Invité(e)
Invité(e)
 
Messages : n/a
Détails du profil
Informations forums :
Messages : n/a
Points : 0
Résolu !

Pour ceux que cela interesse, voici le bout de code qui va bien :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
struct sockaddr_ll ll;
 
    struct ifreq ifr;
....
....
....
    /* Retrieve Network Card identifier */
    memset(&ll, 0, sizeof(struct sockaddr_ll));
    memset(&ifr, 0, sizeof(struct ifreq));
 
    strncpy(ifr.ifr_name, argv[1], sizeof(ifr.ifr_name));
 
    sockdum = socket(AF_INET, SOCK_DGRAM, 0);
    if (sockdum < 0) {
        perror("sockdum()");
		exit(errno);
    }
 
    ret = ioctl(sockdum, SIOCGIFINDEX, &ifr);
    printf("index %d <--> %s\n", ifr.ifr_ifindex, ifr.ifr_name);
    ll.sll_family = AF_PACKET;
    ll.sll_ifindex = ifr.ifr_ifindex;
    ll.sll_protocol = htons(ETH_P_ALL);
 
    if (bind(sock, (struct sockaddr *) &ll, sizeof(struct sockaddr_ll)) < 0) {
        perror("bind");
        exit(errno);
    }
    printf("binding pf_packet to %s interface.\n", ifr.ifr_name);
  Envoyer un message privé Réponse avec citation 00
Vieux 28/02/2007, 15h31   #3
Rédacteur
 
Avatar de Biglo
 
Inscription : juillet 2002
Messages : 537
Détails du profil
Informations personnelles :
Localisation : France, Moselle (Lorraine)

Informations forums :
Inscription : juillet 2002
Messages : 537
Points : 561
Points : 561
Ca m'intéressait justement car je m'étais posé une question très proche, sans avoir vraiment cherché la réponse.

Merci d'avoir posté la solution
Biglo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/03/2007, 23h27   #4
Invité(e)
Invité(e)
 
Messages : n/a
Détails du profil
Informations forums :
Messages : n/a
Points : 0
salut,

pas de quoi pour la solution, c'est fait pour ça les forums d'entraide ! :p

++
  Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Enlever Résolu
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 18h31.


 
 
 
 
Partenaires

Hébergement Web