Я пытаюсь создать ловушку сетевого фильтра, которая просто перехватывает ICMP-пакеты.Я не могу понять, что я делаю неправильно (я новичок в написании модулей ядра).Код, который у меня есть, выглядит так:
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/netfilter.h>
#include <linux/netfilter_ipv4.h>
#include <linux/skbuff.h>
#include <linux/udp.h>
#include <linux/icmp.h>
#include <linux/ip.h>
#include <linux/inet.h>
#define DIP "1.2.3.4"
static struct nf_hook_ops nfho;
static struct net n;
MODULE_DESCRIPTION("Monitor packets");
MODULE_AUTHOR("john");
MODULE_LICENSE("GPL");
unsigned int hook_func(void *priv, struct sk_buff *skb, const struct nf_hook_state *state)
{
printk(KERN_INFO "hook!\n");
return NF_ACCEPT;
}
int init_module()
{
int ret;
nfho.hook = hook_func;
nfho.hooknum = NF_INET_PRE_ROUTING;
nfho.pf = AF_INET;
nfho.priority = NF_IP_PRI_FIRST;
ret = nf_register_net_hook(&n, &nfho);
if (ret != 0)
{
printk(KERN_INFO "module is NOT loaded into the kernel\n");
return -1;
}
else
{
printk(KERN_INFO "module IS loaded into the kernel\n");
return 0;
}
}
void cleanup_module()
{
nf_unregister_net_hook(&n, &nfho);
printk(KERN_INFO "module has been unloaded\n");
}
Из моего системного журнала похоже, что модуль ядра загружен / выгружен правильно (из сообщений печати).Я не получаю "крюк!"сообщение, когда я пингую мою машину.Это неправильный пф?неправильный приоритет крючка?Можно ли это как-то отладить?
Следует сказать, что я нахожусь на виртуальной машине и что я пингую виртуальную машину с другой физической машины, которая не является хост-машиной.Моя ОС - Ubuntu 18.04 LTS, результат "uname -a": Linux ubuntu 4.18.0-20-generic # 21 ~ 18.04.1-Ubuntu SMP Ср. 8 мая 08:43:37 UTC 2019 x86_64 x86_64 x86_64 GNU / Linux
Я знаю, что есть несколько неиспользованных включений.Это адаптировано из примера кода для другой версии ядра, которую я планирую заполнить позже.Я действительно надеюсь, что кто-то может дать мне представление о том, с чего начать, или, возможно, увидеть, что я делаю не так.
Заранее всем спасибо