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

Réseau C Discussion :

Placer des hook sur des requêtes ARP dans un module linux en utilisant netfilter.


Sujet :

Réseau C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Février 2014
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2014
    Messages : 35
    Par défaut Placer des hook sur des requêtes ARP dans un module linux en utilisant netfilter.
    Bonjour tout le monde,

    Je débute dans la programmation de module linux et avec l'utilisation de netfilter en C.

    J'aimerais pouvoir faire un programme/module linux permettant de mettre en place des fonctions hook afin de pouvoir DROP ou ACCEPT les paquets ARP.

    Pour le moment, j'ai tenté de faire ce code :

    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
     
    #include <linux/kernel.h>
    #include <linux/module.h>
    #include <linux/init.h>
    #include <linux/netfilter_arp/arp_tables.h>
     
    static struct nf_hook_ops netfilter_ops_in;
    static struct nf_hook_ops netfilter_ops_out;
     
    static unsigned int main_hook(unsigned int hooknum, struct sk_buff *skb, const struct net_device *in, const struct net_device *out, int (*okfn)(struct sk_buff*)) {
      printk(KERN_ALERT "ARP !\n");
      return NF_ACCEPT;
    }
     
    static int __init mon_module_init(void) {
      printk(KERN_ALERT "init. \n");
      netfilter_ops_in.hook = main_hook;
      netfilter_ops_in.pf = NF_ARP;
      netfilter_ops_in.hooknum = NF_ARP_IN;
     
     
      netfilter_ops_out.hook = main_hook;
      netfilter_ops_out.pf = NF_ARP;
      netfilter_ops_out.hooknum = NF_ARP_OUT;
      netfilter_ops_out.priority = NF_INET_LOCAL_OUT;
     
      nf_register_hook(&netfilter_ops_out);
     
      return 0;
    }
     
    static void __exit mon_module_cleanup(void) {
      printk(KERN_ALERT "exit.\n");
      nf_unregister_hook(&netfilter_ops_out);
    }
     
    module_init(mon_module_init);
    module_exit(mon_module_cleanup);
    Mais je n'ai jamais réussis a avoir mon message : "ARP !\n" dans mon log : /var/log/syslog

    Alors que j'ai bien les messages d'init et d'exit et que ma génération de paquets ARP fonctionne (Je l'ai vérifié avec wireshark).

    De plus, quand je compile, j'obtiens ce warning :
    warning: assignment from incompatible pointer type [enabled by default]
    netfilter_ops_out.hook = main_hook;
    Merci d'avance pour votre aide,

  2. #2
    Membre Expert
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Par défaut
    L'argument skb doit être de type struct sk_buff ** dans la déclaration de ton handler.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Février 2014
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2014
    Messages : 35
    Par défaut
    Citation Envoyé par Matt_Houston Voir le message
    L'argument skb doit être de type struct sk_buff ** dans la déclaration de ton handler.
    J'ai corrigé l'argument de ma fonction, mais ça ne corrige toujours pas mon problème.
    J'ai toujours le même warning, et ma fonction n'est jamais appelé malgré des ARP envoyés et reçus.

  4. #4
    Membre Expert
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Par défaut
    Oublie les tests pour le moment, il faut déjà faire taire le warning.

    Peux-tu poster :
    • la dernière version du .c qui le génère ;
    • la commande exacte de compilation ;
    • la sortie exacte et complète du compilateur ?

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Février 2014
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2014
    Messages : 35
    Par défaut
    Citation Envoyé par Matt_Houston Voir le message
    Oublie les tests pour le moment, il faut déjà faire taire le warning.

    Peux-tu poster :
    • la dernière version du .c qui le génère ;
    • la commande exacte de compilation ;
    • la sortie exacte et complète du compilateur ?
    Voici la dernière version de mon .c (j'ai juste modifié le paramètre)
    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
     
    #include <linux/kernel.h>
    #include <linux/module.h>
    #include <linux/init.h>
    #include <linux/netfilter_arp/arp_tables.h>
     
    static struct nf_hook_ops netfilter_ops_in;
    static struct nf_hook_ops netfilter_ops_out;
     
    static unsigned int main_hook(unsigned int hooknum, struct sk_buff **skb, const struct net_device *in, const struct net_device *out, int (*okfn)(struct sk_buff*)) {
      printk(KERN_ALERT "ARP !\n");
      return NF_ACCEPT;
    }
     
    static int __init mon_module_init(void) {
      printk(KERN_ALERT "init. \n");
      netfilter_ops_in.hook = main_hook;
      netfilter_ops_in.pf = NF_ARP;
      netfilter_ops_in.hooknum = NF_ARP_IN;
     
      netfilter_ops_out.hook = main_hook;
      netfilter_ops_out.pf = NF_ARP;
      netfilter_ops_out.hooknum = NF_ARP_OUT;
      netfilter_ops_out.priority = NF_INET_LOCAL_OUT;
      nf_register_hook(&netfilter_ops_out);
     
      return 0;
    }
     
    static void __exit mon_module_cleanup(void) {
      printk(KERN_ALERT "exit.\n");
      nf_unregister_hook(&netfilter_ops_out);
    }
     
    module_init(mon_module_init);
    module_exit(mon_module_cleanup);
    Le makefile :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    obj-m += arp_mod.o
     
    default:
      make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
     
    clean:
      make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
    La sortie exacte de la compilation :
    make -C /lib/modules/3.13.0-45-generic/build M=/home/jeremy/Documents/Projets/C/test modules
    make[1]: entrant dans le répertoire « /usr/src/linux-headers-3.13.0-45-generic »
    CC [M] /home/jeremy/Documents/Projets/C/test/arp_mod.o
    /home/jeremy/Documents/Projets/C/test/arp_mod.c: In function ‘mon_module_init’:
    /home/jeremy/Documents/Projets/C/test/arp_mod.c:16:25: warning: assignment from incompatible pointer type [enabled by default]
    netfilter_ops_in.hook = main_hook;
    ^
    /home/jeremy/Documents/Projets/C/test/arp_mod.c:20:26: warning: assignment from incompatible pointer type [enabled by default]
    netfilter_ops_out.hook = main_hook;
    ^
    Building modules, stage 2.
    MODPOST 1 modules
    CC /home/jeremy/Documents/Projets/C/test/arp_mod.mod.o
    LD [M] /home/jeremy/Documents/Projets/C/test/arp_mod.ko
    make[1]: quittant le répertoire « /usr/src/linux-headers-3.13.0-45-generic »

  6. #6
    Membre Expert
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Par défaut
    Tu as bien vérifié le type de hook de struct nf_hook_ops dans le header correspondant pour ta version de l'API ?

Discussions similaires

  1. Réponses: 5
    Dernier message: 21/12/2015, 18h20
  2. Réponses: 1
    Dernier message: 30/09/2014, 16h29
  3. Trigger pour mettre des droits sur des procedures et des vues
    Par briino dans le forum Développement
    Réponses: 3
    Dernier message: 23/09/2009, 09h44
  4. des requetes sur des champs basés dans l'ecran forms
    Par moezsokrati dans le forum Forms
    Réponses: 6
    Dernier message: 15/01/2009, 13h23
  5. [Hook] utilisation des hook sur SVN
    Par billone007 dans le forum Subversion
    Réponses: 1
    Dernier message: 22/11/2006, 16h19

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