通过sk_buff接收和过滤以太网帧

时间:2013-02-11 14:16:49

标签: network-programming linux-kernel filtering

我正在尝试编写能够捕获以太网帧并做出决定的内核模块:'accept'或'drop'包(简单过滤)。我将sk_buff和nf_hookfn用于此处描述的设置http://fcns.eu/2010/02/15/netfilter-hooks/
不幸的是,我的模块仅适用于IPv4 / 6包。当我收到原始以太网帧时,不会触发回调函数。

是否可以在内核空间中进行处理原始Eth的过滤器。帧?还有其他解决方案吗?我关心性能,我希望在将它们发送到用户空间之前尽快拒绝所有不需要的帧。

我的linux:带内核PREEMPT RT 3.6.6的Ubuntu。

1 个答案:

答案 0 :(得分:0)

Netfilters在L3上工作,L2替代方案称为ebtables,它位于以太网桥中。

看看ebt_arp如何注册其匹配规则:

static struct xt_match ebt_arp_mt_reg __read_mostly = {
        .name           = "arp",
        .revision       = 0,
        .family         = NFPROTO_BRIDGE,
        .match          = ebt_arp_mt,
        .checkentry     = ebt_arp_mt_check,
        .matchsize      = sizeof(struct ebt_arp_info),
        .me             = THIS_MODULE,
};

static int __init ebt_arp_init(void)
{
        return xt_register_match(&ebt_arp_mt_reg);
}

static void __exit ebt_arp_fini(void)
{
        xt_unregister_match(&ebt_arp_mt_reg);
}

module_init(ebt_arp_init);
module_exit(ebt_arp_fini);