Question

En fait, je veux écrire un module de noyau qui ajoute un filtre possible ebtables. Ensuite, je dois dire ebtables utiliser mon filtre sur un pont, je l'ai mis en place.

La raison pour laquelle je dois écrire mon propre module est que je veux présenter délai entre les paquets consécutifs (pour une raison quelconque test). Pour démontrer, mon réseau a l'origine un trafic comme celui-ci:

+++-----------------+++-----------------+++-----------------+++-----------------

où le trafic des émissions de + d'un paquet et - signifie pas de paquet sur la ligne. Je veux mettre un pont entre sorte que le motif des paquets changerait à ceci:

+----+----+---------+----+----+---------+----+----+---------+----+----+---------

Cela signifie que je voudrais vous assurer qu'il y aurait un certain retard entre l'arrivée de chaque paquet.

Maintenant, j'ai écrit le code simple suivant que je essentiellement pris de linux-source / net / pont / netfilter / ebt_ip.c:

static bool match(const struct sk_buff *skb, const struct xt_match_param *par)
{
    printk(KERN_INFO"match called\n");
    return true;  // match everything!
}

static bool check(const struct xt_mtchk_param *par)
{
    printk(KERN_INFO"check called\n");
    return true;  // pass everything!
}

static struct xt_match reg __read_mostly = {
    .name = "any",   // I made this up, but I tried also putting ip for example which didn't change anything.
    .revision = 0,
    .family = NFPROTO_BRIDGE,
    .match = match,
    .checkentry = check,
    .matchsize = XT_ALIGN(4),  // don't know what this is, so I just gave it an `int`
    .me = THIS_MODULE
};

int init_module(void)
{
    return xt_register_match(&reg);
}

void cleanup_module(void)
{
    xt_unregister_match(&reg);
}

Je charge avec succès le module. Mais il est comme si ce n'est pas là. Je ne reçois pas les journaux à l'intérieur des fonctions de match et check de sorte que le pont est évidemment pas compte tenu de mon filtre. Qu'est-ce que je fais mal?

J'ai essayé beaucoup de combinaisons de chargement mon premier filtre, la mise en place du premier pont ou la définition des règles de ebtables en premier lieu, mais aucun d'entre eux rien changer.

P.S. Le pont lui-même fonctionne. Je suis certain que ebtables est également en vigueur parce que si j'ajouter une politique de laisser tomber des paquets, je ne les reçois pas sur l'ordinateur final. Ce que je ne peux pas comprendre est comment dire ebtables de considérer mon filtre aussi.

Était-ce utile?

La solution

Pour utiliser un module de noyau, vous devez également écrire un plugin approprié pour le programme de l'espace utilisateur, et ensuite, insérer une règle invoquant.

Si vous ne disposez pas des options, ne spécifiez aucun paramètre .matchsize dans struct xt_match (égale à préciser 0).

Autres conseils

Je suis arrivé ce travail, pas de la manière la plus élégante, mais de toute façon, je vous écris ici pour un avenir wanderer:

Disons que votre nom de filtre est: "any"

plug-in espace utilisateur

Vous avez besoin d'en-têtes qui ne sont pas disponibles en dehors de la source de ebtables. Donc, obtenir le code source, et allez dans le dossier extensions. Dans le Makefile, ajoutez any à EXT_FUNC (qui est des objectifs à construire) et d'écrire le fichier source ebt_any.c comme suit:

#include <stdio.h>
#include <getopt.h>
#include "../include/ebtables_u.h"

/*struct whatever
{
        int a;
};*/

static struct option _any_opts[] =
{
        {"use-any", required_argument, 0, 0},
        {'\0'}
};

static void _any_help(void)
{
        printf("any match options: nothing!\n");
}

static void _any_init(struct ebt_entry_match *match)
{
        printf("any_init\n");
}

static void _any_check(const struct ebt_u_entry *entry, const struct ebt_entry_match *match, const char *name,
        unsigned int hookmask, unsigned int time)
{
        printf("any_check\n");
}

static int _any_parse(int c, char **argv, int argc, const struct ebt_u_entry *entry, unsigned int *flags, struct ebt_entry_match **match)
{
        printf("any_parse: %d\n", c);
        if (c == 0)
                return 1;
        return 0;       // return true for anything
}

static int _any_compare(const struct ebt_entry_match *m1, const struct ebt_entry_match *m2)
{
/*      struct whatever *w1 = (struct whatever *)m1->data;
        struct whatever *w2 = (struct whatever *)m2->data;
        if (w1->a != w2->a)
                return 0;*/
        return 1;
}

static void _any_print(const struct ebt_u_entry *entry, const struct ebt_entry_match *match)
{       
        printf("any_print");
}

static struct ebt_u_match _reg = {
        .name           = "any",
//      .size           = sizeof(struct whatever),
        .help           = _any_help,
        .init           = _any_init,
        .parse          = _any_parse,
        .final_check    = _any_check,
        .print          = _any_print,
        .compare        = _any_compare,
        .extra_ops      = _any_opts,
};

void _init(void)
{
        ebt_register_match(&_reg);
}

Remarque: si vous avez des données allant de l'espace utilisateur à l'espace du noyau, écrire quelque chose au lieu de struct whatever. Je l'ai commenté ce parce que je ne suis pas en utilisant quoi que ce soit.

Remarque: , même si votre programme ne nécessite pas une option (comme le mien qui était censé correspondre à tout), vous devez donner une option de toute façon parce que ce comment ebtables sait utiliser votre filtre .

Remarque: certaines de ces fonctions semblent inutiles, mais si vous ne les écrivez pas, vous obtenez un « BUG: mauvaise fusion ». Erreur

Module noyau-espace

Le module espace noyau est plus simple:

#include <linux/netfilter/x_tables.h>
#include <linux/module.h>
#include <linux/kernel.h>

MODULE_LICENSE("GPL");
MODULE_AUTHOR("Shahbaz Youssefi");
MODULE_ALIAS("ebt_any");

/*struct whatever
{
        int a;
};*/

static bool match(const struct sk_buff *skb, const struct xt_match_param *par)
{
        printk(KERN_INFO"Matching\n");
        return true;
}

static bool check(const struct xt_mtchk_param *par)
{
        printk(KERN_INFO"Checking\n");
        return true;
}

static struct xt_match reg __read_mostly = {
        .name           = "any",
        .match          = match,
//      .matchsize      = sizeof(struct whatever),
        .checkentry     = check,
        .me             = THIS_MODULE
};

int init_module(void)
{       
        int ret = 0;
        printk("Bridge initializing...\n");
        ret = xt_register_match(&reg);
        printk("Bridge initializing...done!\n");
        return ret;
}

void cleanup_module(void)
{
        printk("Bridge exiting...\n");
        xt_unregister_match(&reg);
        printk("Bridge exiting...done!\n");
}

Remarque:. si vous utilisez struct whatever dans l'espace utilisateur, vous devez utiliser le même dans l'espace du noyau

Remarque: contrairement à l'espace utilisateur plug-in qui utilisent des en-têtes / fonctions ebtables, le module de noyau utilise xtables à la place !!

Compile le module (assez standard) et l'installer pour le chargement automatique. Vous pouvez insmod et vous rmmod le module avant d'ajouter / après la suppression des règles de ebtables.

Comment faire ebtables utiliser votre filtre

Il suffit d'ajouter une règle qui contient --use-any some_value et vous êtes bon. Par exemple:

ebtables -A FORWARD --use-any 1 -j ACCEPT

Note:. ce --use-any est le option qui a été donné en ebt_u_match reg.extra_ops (qui a été défini dans le tableau _any_opts) dans l'extension de l'espace utilisateur

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top