Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 14 sur 14

Discussion: iptables et nfqueue

  1. #1
    Membre du Club
    Inscrit en
    décembre 2006
    Messages
    213
    Détails du profil
    Informations forums :
    Inscription : décembre 2006
    Messages : 213
    Points : 54
    Points
    54

    Par défaut iptables et nfqueue

    bon j'ai trouver un peux de doc ,http://netfilter.org/projects/libnet...8c_source.html
    Mai petit souci :
    la doc l'ip source / destination /port n'est pas disponible ou c'est moi ??
    j'ai pas trouve de man sur ce type d'information.

    voici le code que j'ai trouver avec google:
    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
     
    /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
    /*
     * Copyright (c) 2007 Joe Kopena, Drexel University
     *
     * This program is free software; you can redistribute it and/or modify
     * it under the terms of the GNU General Public License version 2 as
     * published by the Free Software Foundation;
     *
     * This program is distributed in the hope that it will be useful,
     * but WITHOUT ANY WARRANTY; without even the implied warranty of
     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     * GNU General Public License for more details.
     *
     * You should have received a copy of the GNU General Public License
     * along with this program; if not, write to the Free Software
     * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
     *
     * Authors: Joe Kopena <tjkopena@cs.drexel.edu>
     */
     
    #include <iostream>
    #include <iomanip>
     
    #include <time.h>
     
    #include <netinet/in.h>
    extern "C" {
    //#include <libipq.h>
      #include <linux/netfilter.h>  /* Defines verdicts (NF_ACCEPT, etc) */
      #include <libnetfilter_queue/libnetfilter_queue.h>
    }
     
    using namespace std;
     
    //----------------------------------------------------------------------
    //------------------------------------------------------
    static int Callback(nfq_q_handle *myQueue, struct nfgenmsg *msg,
                        nfq_data *pkt, void *cbData) {
      uint32_t id = 0;
      nfqnl_msg_packet_hdr *header;
     
      cout << "pkt recvd: ";
      if ((header = nfq_get_msg_packet_hdr(pkt))) {
        id = ntohl(header->packet_id);
        cout << "id " << id << "; hw_protocol " << setfill('0') << setw(4) <<
          hex << ntohs(header->hw_protocol) << "; hook " << ('0'+header->hook)
             << " ; ";
      }
     
      // The HW address is only fetchable at certain hook points
      nfqnl_msg_packet_hw *macAddr = nfq_get_packet_hw(pkt);
      if (macAddr) {
        cout << "mac len " << ntohs(macAddr->hw_addrlen) << " addr ";
        for (int i = 0; i < 8; i++) {
          cout << setfill('0') << setw(2) << hex << macAddr->hw_addr;
        }
        // end if macAddr
      } else {
        cout << "no MAC addr";
      }
     
      timeval tv;
      if (!nfq_get_timestamp(pkt, &tv)) {
        cout << "; tstamp " << tv.tv_sec << "." << tv.tv_usec;
      } else {
        cout << "; no tstamp";
      }
     
      cout << "; mark " << nfq_get_nfmark(pkt);
     
      // Note that you can also get the physical devices
      cout << "; indev " << nfq_get_indev(pkt);
      cout << "; outdev " << nfq_get_outdev(pkt);
     
      cout << endl;
     
      // Print the payload; in copy meta mode, only headers will be included;
      // in copy packet mode, whole packet will be returned.
      char *pktData;
      int len = nfq_get_payload(pkt, &pktData);
      if (len) {
        cout << "data[" << len << "]: '";
        for (int i = 0; i < len; i++) {
          if (isprint(pktData[i]))
            cout << pktData[i];
          else cout << " ";
        }
        cout << "'" << endl;
        // end data found
      }
    cout << "Debug" << endl;
      // For this program we'll always accept the packet...
      return nfq_set_verdict(myQueue, id, NF_ACCEPT, 0, NULL);
     
      // end Callback
    }
     
    //----------------------------------------------------------------------
    //------------------------------------------------------
    int main(int argc, char **argv) {
      struct nfq_handle *nfqHandle;
     
      struct nfq_q_handle *myQueue;
      struct nfnl_handle *netlinkHandle;
     
      int fd, res;
      char buf[4096];
     
      // Get a queue connection handle from the module
      if (!(nfqHandle = nfq_open())) {
        cerr << "Error in nfq_open()" << endl;
        //exit(-1);
      }
     
      // Unbind the handler from processing any IP packets
      // Not totally sure why this is done, or if it's necessary...
      if (nfq_unbind_pf(nfqHandle, AF_INET) < 0) {
        cerr << "Error in nfq_unbind_pf()" << endl;
        //exit(1);
      }
     
      // Bind this handler to process IP packets...
      if (nfq_bind_pf(nfqHandle, AF_INET) < 0) {
        cerr << "Error in nfq_bind_pf()" << endl;
        //exit(1);
      }
     
      // Install a callback on queue 0
      if (!(myQueue = nfq_create_queue(nfqHandle,  0, &Callback, NULL))) {
        cerr << "Error in nfq_create_queue()" << endl;
        //exit(1);
      }
     
      // Turn on packet copy mode
      if (nfq_set_mode(myQueue, NFQNL_COPY_PACKET, 0xffff) < 0) {
        cerr << "Could not set packet copy mode" << endl;
        //exit(1);
      }
     
      netlinkHandle = nfq_nfnlh(nfqHandle);
      fd = nfnl_fd(netlinkHandle);
      nfnl_fd;
      while ((res = recv(fd, buf, sizeof(buf), 0)) && res >= 0) {
        // I am not totally sure why a callback mechanism is used
        // rather than just handling it directly here, but that
        // seems to be the convention...
        nfq_handle_packet(nfqHandle, buf, res);
        // end while receiving traffic
      }
     
      nfq_destroy_queue(myQueue);
     
      nfq_close(nfqHandle);
    std::cout << "terminer ?" << std::endl;
      return 0;
     
      // end main
    }
    le makefile
    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
     
    SRC=$(wildcard *.cpp)
    #SRC=main.cpp
    OBJ=${SRC:.cpp=.o}
    OUT=main
     
    CXX=c++
    CXXFLAGS=-Wall -Wextra -pedantic -lnfnetlink -lnetfilter_queue
    #CXXFLAGS=-lsqlite3 -Wall -Wextra -pedantic -static
     
     
    all: $(OUT)
     
    $(OUT): $(OBJ)
       $(CXX) $^ -o $@ $(CXXFLAGS)
     
    .cpp.o:
     
    exe: all
       ./$(OUT) "sqlite3.sql"
     
    clean:
       @rm -v *.o
       true
     
    mrproper: clean
       @rm $(OUT)
    il faut que les paquet soit installer (sur une debian)

    Code:
    Code :
    1
    2
    3
    libnetfilter-queue-dev
    //peut etre :
    libpq-dev

    voila
    pour utilise ce code (attention root mode...)
    Code:
    Code :
    iptables -A OUTPUT -p icmp -j NFQUEUE --queue-num 0
    ensuite un simple ./main
    puis un ping quelque part donne des resulta (pas terrible pour le moment)

    la question:
    je ne trouve pas comment avoir l'ip et le port dans la doc citée plus haut ???
    merci d'avance et merci a l'auteur de l'exemple

  2. #2
    Membre expérimenté
    Inscrit en
    octobre 2004
    Messages
    329
    Détails du profil
    Informations forums :
    Inscription : octobre 2004
    Messages : 329
    Points : 568
    Points
    568

    Par défaut

    Est-ce que ce n'est pas dans le payload ?

  3. #3
    Membre du Club
    Inscrit en
    décembre 2006
    Messages
    213
    Détails du profil
    Informations forums :
    Inscription : décembre 2006
    Messages : 213
    Points : 54
    Points
    54

    Par défaut

    Citation Envoyé par Joker-eph Voir le message
    Est-ce que ce n'est pas dans le payload ?


    voici un sortie :
    Code :
    1
    2
    3
    4
    5
    6
     
    /main                                                                                                                                                             
    pkt recvd: id 1; hw_protocol 0000; hook 33 ; no MAC addr; no tstamp; mark 0; indev 0; outdev 2                                                                                                                                                                                 
    data len:[54]: 'contien[E  T  @ @         #1  #; :  Q%*Q    ~@                       !"#$%&'()*+,-./01234567']                                                                                                                                                                 
    Debug                                                                                                                                                                                                                                                                          
    pkt recvd: id 2; hw_protocol 0000; hook 33 ; no MAC addr; no tstamp; mark 0; indev 0; outdev 2
    je ne voit pas d'ip : et le mode de copie du contenu est bien
    Code :
    NFQNL_COPY_PACKET - copy entire packet
    Selon la doc

    Merci pour ta réponse, c'est quand même curieux qu'il n'y a rien de mentionner dans la doc, ou je passe tout droit dessus

  4. #4
    Membre expérimenté
    Inscrit en
    octobre 2004
    Messages
    329
    Détails du profil
    Informations forums :
    Inscription : octobre 2004
    Messages : 329
    Points : 568
    Points
    568

    Par défaut

    Encore faut-il interpréter le payload pour dire qu'il n'y a pas d'IP...
    Ce qui semble plus "inquiétant" c'est "hw_protocol 0000;" "no MAC addr;" "no tstamp;"...

    Ce que tu mentionnes comme doc c'est : http://netfilter.org/projects/libnet...8c_source.html ou t'as autre chose ? Parce que là c'est juste du source peu commenté...

  5. #5
    Membre du Club
    Inscrit en
    décembre 2006
    Messages
    213
    Détails du profil
    Informations forums :
    Inscription : décembre 2006
    Messages : 213
    Points : 54
    Points
    54

    Par défaut

    Citation Envoyé par Joker-eph Voir le message
    Encore faut-il interpréter le payload pour dire qu'il n'y a pas d'IP...
    Ce qui semble plus "inquiétant" c'est "hw_protocol 0000;" "no MAC addr;" "no tstamp;"...

    Ce que tu mentionnes comme doc c'est : http://netfilter.org/projects/libnet...8c_source.html ou t'as autre chose ? Parce que là c'est juste du source peu commenté...
    Tu a coller le même lien que j'ai mis plus haut
    Donc oui l'utilise cette doc. mai que veux tu dire par interpréter ?
    je copie toute la valeur et je affiche le data de payload que veux tu que je fasse d'autre ??
    c'est le protocole icmp , je croit pas que l'adresse mac est transmise par contre pour le reste j'avoue que je comprend rien. (d'ou l'intérêt d'avoir un exemple...)

  6. #6
    Membre expérimenté
    Inscrit en
    octobre 2004
    Messages
    329
    Détails du profil
    Informations forums :
    Inscription : octobre 2004
    Messages : 329
    Points : 568
    Points
    568

    Par défaut

    Oui j'ai remis le même lien pour préciser ma question, comme je disais ce n'est pas "une doc".

    Pour ton problème, il me semble que tu affiches le payload comme une chaîne de caractère, alors que ce sont des données binaires, une structure de donnée quoi.
    En gros il faut caster le pointeur dans la structure appropriée en fonction du protocole.
    (au passage: en fait tout ce qui passe sur une connexion ethernet ça inclue une adresse MAC, y compris ICMP)

    Essaye de jeter un oeil à ça, ça devrait aider : http://stackoverflow.com/questions/6...linux-ip-stack

  7. #7
    Membre du Club
    Inscrit en
    décembre 2006
    Messages
    213
    Détails du profil
    Informations forums :
    Inscription : décembre 2006
    Messages : 213
    Points : 54
    Points
    54

    Par défaut

    j'ai bien tenter un static cast :

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
     char *pktData;
      int len = nfq_get_payload(pkt, &pktData);
      if (len) {
        cout << "data len:[" << len << "]: 'Start[";
        for (int i = 0; i < len; i++) {
          if (isprint(pktData[i]))
          cout << "FLOAT:" << static_cast<float> (pktData[i]) << endl;;
         // else cout << " ";
        }
        cout << "] fin de boucle" << endl;
        // end data found
      }
    bon j'ai mis float car je ne sait pas à quoi j'ai affaire comme valeur ...
    D'après les lien trouver sur le net cela semble être du char** ... donc du binaire dans du char** je trouve cela étrange.
    voici le lien dont je parle:
    http://libnetfilter-queue.sourcearch...cfdc1e4f2.html

    c'est peut être l'hexadécimal ,c'est quand même bizzard que je trouve pas d'exemple quelque par pour extraire l'ip / port / valeur ?
    de ce fait je me demande si cela est encore maintenu ... ??

    merci pour ton lien : ce que j'en retien c'est que c'est une structure , mai ici c'est des donnée brut ,donc je ne voit pas le rapport

  8. #8
    Membre Expert
    Homme Profil pro
    Étudiant
    Inscrit en
    juin 2012
    Messages
    852
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : juin 2012
    Messages : 852
    Points : 1 740
    Points
    1 740

    Par défaut

    Citation Envoyé par panthere noire Voir le message
    merci pour ton lien : ce que j'en retien c'est que c'est une structure , mai ici c'est des donnée brut ,donc je ne voit pas le rapport
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    struct Data {
    	unsigned int ip;
    	...
    };
     
    char *charData = /* ... */;
    Data* d = reinterpret_cast<Data*>(charData);
     
    std::cout << d->ip << std::endl;
    Tu obtiens des données brutes, à toi de les interpréter correctement (en remplissant correctement cette structure Data, qui doit d'ailleurs probablement exister dans la lib, au moins pour les protocoles les plus connus).

    Reste à la trouver cette structure ...

    edit : ici, il semble y avoir des fonctions pour retrouver certains éléments dans le packet à partir de la ligne ~760.

  9. #9
    Membre du Club
    Inscrit en
    décembre 2006
    Messages
    213
    Détails du profil
    Informations forums :
    Inscription : décembre 2006
    Messages : 213
    Points : 54
    Points
    54

    Par défaut

    Citation Envoyé par Iradrille Voir le message
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    struct Data {
    	unsigned int ip;
    	...
    };
     
    char *charData = /* ... */;
    Data* d = reinterpret_cast<Data*>(charData);
     
    std::cout << d->ip << std::endl;
    Tu obtiens des données brutes, à toi de les interpréter correctement (en remplissant correctement cette structure Data, qui doit d'ailleurs probablement exister dans la lib, au moins pour les protocoles les plus connus).

    Reste à la trouver cette structure ...

    edit : ici, il semble y avoir des fonctions pour retrouver certains éléments dans le packet à partir de la ligne ~760.
    oui j'ai vu , mai rien d'un paramètre sur qui concerne l'ip/port. par contre il y a tout le reste mac ,time etc.

    j'ai vu en python que une fonction était disponible, donc j'imagine que l'ip /fonction en C si trouve. bon si je trouve je vous tien aux courant. mai j'ai pas mal chercher et j'ai rien trouver en C/C++ comme code concluant pour le moment

    Merci pour ton aide

  10. #10
    Membre expérimenté
    Inscrit en
    octobre 2004
    Messages
    329
    Détails du profil
    Informations forums :
    Inscription : octobre 2004
    Messages : 329
    Points : 568
    Points
    568

    Par défaut

    Tu as regardé le lien que j'ai posté sur stack overflow ? La structure ipheader ?

  11. #11
    Membre du Club
    Inscrit en
    décembre 2006
    Messages
    213
    Détails du profil
    Informations forums :
    Inscription : décembre 2006
    Messages : 213
    Points : 54
    Points
    54

    Par défaut

    Citation Envoyé par Joker-eph Voir le message
    Tu as regardé le lien que j'ai posté sur stack overflow ? La structure ipheader ?
    oui , mai j'ai rien vu (ou je doit être myope ?) de concret, c'est une structure declaré, ensuite un tableaux hexadécimal, trier par le printif , j'ai pas compris le rapport avec mon souci ?

    dans les commentaire on y voit libpcap. utilisée par tcpdump, un sniffer. seulement je ne croit pas que cette lib puisse servir dans mon cas.
    Cela reste dédier à un sniffer qui ne sais rien faire d'autre.

    Je cherche a gérer les connections donc un drop,accept et aux besoin d'afficher un message etc (c'est pas possible avec iptables seulement)

  12. #12
    Membre expérimenté
    Inscrit en
    octobre 2004
    Messages
    329
    Détails du profil
    Informations forums :
    Inscription : octobre 2004
    Messages : 329
    Points : 568
    Points
    568

    Par défaut

    La structure est la représentation "binaire" d'une en-tête IP.

    Si tu as une en-tête IP :

    Code :
    1
    2
    3
    4
    5
     
    void print_source_ip( void *raw_data ) {
      struct ipheader *iph = (struct ipheader *) raw_data;
      printf("%d\n", iph->ip_src);
    }
    Note bien qu'il ne faut pas espérer avoir ton ip au format "xxx.xxx.xxx.xxx" comme ça...

    Je n'avais pas donné d'exemple car la deuxième réponse de stackoverflow me semblait explicite:

    Code :
    1
    2
    3
     
    struct ipheader *iph = (struct ipheader *)blk;
    printf ("TTL = %d\n", iph->ip_ttl);

  13. #13
    Membre du Club
    Inscrit en
    décembre 2006
    Messages
    213
    Détails du profil
    Informations forums :
    Inscription : décembre 2006
    Messages : 213
    Points : 54
    Points
    54

    Par défaut

    Merci pour ta réponse et ton exemple


    J'ai tenter d'utiliser (et de comprendre hum...) , et voici le code:
    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
     
     
    #include <iostream>
    #include <iomanip>
     
    #include <time.h>
     
    #include <netinet/in.h>
    #include <stdio.h>
    extern "C" {
    //#include <libipq.h>
      #include <linux/netfilter.h>  /* Defines verdicts (NF_ACCEPT, etc) */
      #include <libnetfilter_queue/libnetfilter_queue.h>
    }
     
    using namespace std;
     
     
    //==================
    struct ipheader {
     
         unsigned char ip_hl:4, ip_v:4; /* this means that each member is 4 bits */
         unsigned char ip_tos;
         unsigned short int ip_len;
         unsigned short int ip_id;
         unsigned short int ip_off;
         unsigned char ip_ttl;
         unsigned char ip_p;
         unsigned short int ip_sum;
         unsigned int ip_src;
         unsigned int ip_dst;
        }; 
     
    //----------------------------------------------------------------------
    //------------------------------------------------------
    static int Callback(nfq_q_handle *myQueue, struct nfgenmsg *msg,
                        nfq_data *pkt, void *cbData) {
      uint32_t id = 0;
      nfqnl_msg_packet_hdr *header;
     
      cout << "pkt recvd: ";
      if ((header = nfq_get_msg_packet_hdr(pkt))) {
        id = ntohl(header->packet_id);
        cout << "id " << id << "; hw_protocol " << setfill('0') << setw(4) <<
          hex << ntohs(header->hw_protocol) << "; hook " << ('0'+header->hook)
             << " ; ";
      }
     
      // The HW address is only fetchable at certain hook points
      nfqnl_msg_packet_hw *macAddr = nfq_get_packet_hw(pkt);
      if (macAddr) {
        cout << "mac len " << ntohs(macAddr->hw_addrlen) << " addr ";
        for (int i = 0; i < 8; i++) {
          cout << setfill('0') << setw(2) << hex << macAddr->hw_addr;
        }
        // end if macAddr
      } else {
        cout << "no MAC addr";
      }
     
      timeval tv;
      if (!nfq_get_timestamp(pkt, &tv)) {
        cout << "; tstamp " << tv.tv_sec << "." << tv.tv_usec;
      } else {
        cout << "; no tstamp";
      }
     
      cout << "; mark " << nfq_get_nfmark(pkt);
     
      // Note that you can also get the physical devices
      cout << "; indev " << nfq_get_indev(pkt);
      cout << "; outdev " << nfq_get_outdev(pkt);
     
      cout << endl;
     
      // Print the payload; in copy meta mode, only headers will be included;
      // in copy packet mode, whole packet will be returned.
      char *pktData;
      int len = nfq_get_payload(pkt, &pktData);
      struct ipheader *iph = (struct ipheader *)pktData;
      printf ("TTL = %d\n", iph->ip_ttl);
     
      if (len) {
        cout << "data len:[" << len << "]: 'Start boucle[";
        for (int i = 0; i < len; i++) {
          if (isprint(pktData[i]))
    		{
     
          //cout << "FLOAT:" << static_cast<float> (pktData[i]) << endl;;
         // else cout << " ";
     
        // printf ("TTL = %x\n", pktData[i]);
     
     
      //printf("%d\n", iph->ip_src);
    		}
     
        }
        cout << "] fin de boucle" << endl;
        // end data found
      }
    cout << "Debug" << endl;
      // For this program we'll always accept the packet...
      return nfq_set_verdict(myQueue, id, NF_ACCEPT, 0, NULL);
     
      // end Callback
    }
     
    //----------------------------------------------------------------------
    //------------------------------------------------------
    int main(int argc, char **argv) {
      struct nfq_handle *nfqHandle;
     
      struct nfq_q_handle *myQueue;
      struct nfnl_handle *netlinkHandle;
     
      int fd, res;
      char buf[4096];
     
      // Get a queue connection handle from the module
      if (!(nfqHandle = nfq_open())) {
        cerr << "Error in nfq_open()" << endl;
        //exit(-1);
      }
     
      // Unbind the handler from processing any IP packets
      // Not totally sure why this is done, or if it's necessary...
      if (nfq_unbind_pf(nfqHandle, AF_INET) < 0) {
        cerr << "Error in nfq_unbind_pf()" << endl;
        //exit(1);
      }
     
      // Bind this handler to process IP packets...
      if (nfq_bind_pf(nfqHandle, AF_INET) < 0) {
        cerr << "Error in nfq_bind_pf()" << endl;
        //exit(1);
      }
     
      // Install a callback on queue 0
      if (!(myQueue = nfq_create_queue(nfqHandle,  0, &Callback, NULL))) {
        cerr << "Error in nfq_create_queue()" << endl;
        //exit(1);
      }
     
      // Turn on packet copy mode
      if (nfq_set_mode(myQueue, NFQNL_COPY_PACKET, 0xffff) < 0) {
        cerr << "Could not set packet copy mode" << endl;
        //exit(1);
      }
     
      netlinkHandle = nfq_nfnlh(nfqHandle);
      fd = nfnl_fd(netlinkHandle);
      nfnl_fd;
      while ((res = recv(fd, buf, sizeof(buf), 0)) && res >= 0) {
        // I am not totally sure why a callback mechanism is used
        // rather than just handling it directly here, but that
        // seems to be the convention...
        nfq_handle_packet(nfqHandle, buf, res);
        // end while receiving traffic
      }
     
      nfq_destroy_queue(myQueue);
     
      nfq_close(nfqHandle);
    std::cout << "terminer ?" << std::endl;
      return 0;
     
      // end main
    }
    voici un ping:
    Code :
    1
    2
    3
    4
    5
     
    ping www.google.com                                                                                                                                                                                                                                                
    PING www.google.com (74.125.232.145) 56(84) bytes of data.                                                                                                                                                                                                                     
    64 bytes from mil02s05-in-f17.1e100.net (74.125.232.145): icmp_req=1 ttl=57 time=16.7 ms                                                                                                                                                                                       
    64 bytes from mil02s05-in-f17.1e100.net (74.125.232.145): icmp_req=2 ttl=57 time=16.9 ms
    donc un ttl=57

    et le code une fois compiler:
    Code :
    1
    2
    3
    4
    5
    6
     
    # ./main
    pkt recvd: id 1; hw_protocol 0000; hook 33 ; no MAC addr; no tstamp; mark 0; indev 0; outdev 2
    TTL = 64
    data len:[54]: 'Start boucle[] fin de boucle
    Debug
    ttl = 64

    On m'aurait menti
    j'ai commis une erreur quelque part ?
    merci pour ton aide ,c'est pas évident pour moi qui code pas du C

    bon je précise donc que j'ai adpter aux pifometre

  14. #14
    Membre du Club
    Inscrit en
    décembre 2006
    Messages
    213
    Détails du profil
    Informations forums :
    Inscription : décembre 2006
    Messages : 213
    Points : 54
    Points
    54

    Par défaut

    Bon c'est visiblement pas possible de faire ce que je veux de manière assez simple, 4 jours chercher ....
    nfqueue a ces avantages mai vraiment l'api est comment dire ....... disons pas assez documentée et l(es) exemple(es) fonctionne mal ou plus, c'est donc mal mintenu.


    je vais regarder du coter de libcap mai bon c'est uniquement pour sniffer je doute que sa fasse l'affaire.

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •