IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

sniffer un packet en python


Sujet :

Python

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 28
    Points : 15
    Points
    15
    Par défaut sniffer un packet en python
    Bonjour

    Je tente de faire un script pour surveiller le flux reseau.
    Quand j'execute le script ci dessous :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
    #!/usr/bin/python
    import pcapy
    import impacket.ImpactDecoder as Decoders
    import impacket.ImpactPacket as Packets
     
    print 'Opening eth0s'
    cap = pcapy.open_live('eth0', 5000, 1, 0)
    eth_decoder = Decoders.EthDecoder()
    ip_decoder = Decoders.IPDecoder()
    (header, payload) = cap.next()
     
    while (header):
       (header, payload) = cap.next()
     
       ethernet = eth_decoder.decode(payload)
       if ethernet.get_ether_type() == Packets.IP.ethertype:
          ip = ip_decoder.decode(payload[ethernet.get_header_size():])
          ip_src = ip.get_ip_src()
          ip_dst = ip.get_ip_dst()
          print 'ip dest : %s'%ip_dst
    sur un raspberry ca marche bien (J'ai des IP qui sortent)

    Par contre quand je l'execute sur une autre machine ubuntu j'ai le message d'erreur suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
        (header, payload) = cap.next()
    socket.timeout: timed out
    si je modifie le code avec un try/except autour de "(header, payload) = cap.next()" ca marche bien.
    Mais c'est moins propre...

    Comme si dans un cas la commande cap attend d'avoir quelque chose et dans l'autre comme il n'y a pas de trafic elle plante...

    Une idee sur ce pb ?

    Merci

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Salut,

    Citation Envoyé par ewok2 Voir le message
    Comme si dans un cas la commande cap attend d'avoir quelque chose et dans l'autre comme il n'y a pas de trafic elle plante...

    Une idee sur ce pb ?
    Ben çà devrait attendre jusqu'à une valeur donnée de timeout.
    En écrivant: "cap = pcapy.open_live('eth0', 5000, 1, 0)"
    Si mes souvenirs sont bons, le 4ième paramètre est timeout (en Ms): 0 c'est pas beaucoup...

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 28
    Points : 15
    Points
    15
    Par défaut
    Je pensais que c'est le 2ème paramètre le time out.. :-)
    Je fait le test ce soir
    Et pour l'explication pourquoi ca marche sur un pc et pas l'autre ca pourrait etre que le raspberry mouline moins vite et donc y à toujours un paquet entre 2 boucle ?

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Le deuxième paramètre, c'est la taille maximum des packets qui remontent.

    Et pour l'explication pourquoi ca marche sur un pc et pas l'autre ca pourrait etre que le raspberry mouline moins vite et donc y à toujours un paquet entre 2 boucle ?
    Avec un timeout=0, vous aurez toujours des timeout.
    Les causes pourront être multiples:
    • densité de traffic sur la carte réseau,
    • topologie du réseau (promiscuous mode = 1 ne remonte pas la même chose lorsque connecté à un Hub ou un Switch),
    • débit du réseau,
    • ....

    C'est plutôt par la qu'il faut chercher.

    Mais sans un timeout = 1000, ou plus, pas la peine de se faire des nœuds au cerveau.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 28
    Points : 15
    Points
    15
    Par défaut
    En effet ca marche mieux avec un timeout
    Mais comme mon but est de mettre des filtres pour détecter si un trafic bien particulier existe ou non, le timeout ne marche pas plus pour mon besoin.
    J'aurai préféré un cap.next() qui aurai attendu qu'il y ai du trafic pour faire un traitement...

    Je vais etre bon pour un :
    While (True):
    try:
    "cap.next()"
    do xxxxx
    except:
    continue

    Je sais pas pourquoi mais j'aime pas l'idee du try qui masque des erreurs...

    Merci en tout cas car au moins je comprend pourquoi je fait ca :-)

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Salut,

    Citation Envoyé par ewok2 Voir le message
    Je sais pas pourquoi mais j'aime pas l'idee du try qui masque des erreurs...
    Un réseau remonte toujours des erreurs.
    Votre code doit savoir les gérer.

    Si la seule interface proposée est la remontée d'une exception, try....except... est raisonnable pourvu qu'on n'écrive pas:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    while (True):
        try:
             "cap.next()"
              do xxxxx
        except:
               continue
    Mais plutôt:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    while (True):
        try:
             "cap.next()"
              do xxxxx
        except "timeout":
               continue
        except:
               raise
    Autrement dit masquer l'erreur attendue (que l'on gère) et vous laissez remonter les autres (que vous ne gérez pas ici)


    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 28
    Points : 15
    Points
    15
    Par défaut
    C'est vrai ca fait tout de suite mieux
    Merci du conseil :-)

Discussions similaires

  1. [Python 3.X] Sniffer un packet et la décortiquer (ethernet, IP, protocol, etc)
    Par ricki963 dans le forum Réseau/Web
    Réponses: 1
    Dernier message: 15/02/2015, 02h12
  2. Réponses: 0
    Dernier message: 08/06/2011, 22h57
  3. CORBA & PYTHON
    Par stan91stan dans le forum CORBA
    Réponses: 5
    Dernier message: 10/06/2004, 12h32
  4. sniffer les messages sortant
    Par ashram dans le forum Développement
    Réponses: 3
    Dernier message: 08/07/2003, 11h31
  5. Packet forwarder
    Par Gabuzomeu dans le forum Développement
    Réponses: 3
    Dernier message: 03/06/2003, 17h44

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo