gpt4 book ai didi

c - 如何使用 net_dev_add() API 过滤和拦截 Linux 数据包?

转载 作者:太空狗 更新时间:2023-10-29 17:07:42 24 4
gpt4 key购买 nike

我正在为 Linux 编写以太网网络驱动程序。我想接收数据包,编辑并重新发送它们。我知道如何在 packet_interceptor 函数中编辑数据包,但如何在此函数中丢弃传入的数据包?

#include <linux/netdevice.h>
#include <linux/skbuff.h>
#include <linux/ip.h>
#include <net/sock.h>

struct packet_type my_proto;

int packet_interceptor(struct sk_buff *skb,
struct net_device *dev,
struct packet_type *pt,
struct net_device *orig_dev) {

// I dont want certain packets go to upper in net_devices for further processing.
// How can I drop sk_buff here?!

return 0;
}

static int hello_init( void ) {
printk(KERN_INFO "Hello, world!\n");

my_proto.type = htons(ETH_P_ALL);
my_proto.dev = NULL;
my_proto.func = packet_interceptor;

dev_add_pack(&my_proto);
return 0;
}

static void hello_exit(void) {
dev_remove_pack(&my_proto);
printk(KERN_INFO "Bye, world\n");
}

module_init(hello_init);
module_exit(hello_exit);

最佳答案

您正在让您的模块处理所有以太网数据包。 Linux 会将数据包发送到所有匹配的协议(protocol)处理程序。由于 IP 已经在您的内核中注册,您的模块和 ip_rcv 都将收到所有带有 IP header 的 SKB。

如果不更改内核代码,则无法更改此行为。一种可能性是创建一个 netfilter 模块。这样,您可以在 ip_rcv 函数之后拦截数据包,如果您愿意,可以将其丢弃(在 Netfilters PREROUTING Hook 中)。

这是我从我已经编写的一些代码中提取的一个小 Netfilter 模块。此模块未完成,但主要内容已到位。

#include <linux/netfilter.h>
#include <linux/netfilter_ipv4.h>

// Handler function
static unsigned int my_handler (
unsigned int hook,
struct sk_buff *skb,
const struct net_device *in,
const struct net_device *out,
int (*okfn)(struct sk_buff *))
{
return NF_ACCEPT;
// or
return NF_DROP;
}

// Handler registering struct
static struct nf_hook_ops my_hook __read_mostly = {
.hook = my_handler,
.pf = NFPROTO_IPV4,
.hooknum = (1 << NF_INET_PRE_ROUTING),
.priority = NF_IP_PRI_FIRST // My hook will be run before any other netfilter hook
};

int my_init() {
int err = nf_register_hook (&my_hook);
if (err) {
printk (KERN_ERR "Could not register hook\n");
}
return err;
}

关于c - 如何使用 net_dev_add() API 过滤和拦截 Linux 数据包?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19342252/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com