2016-09-10 2 views
3

У меня был базовый код. Этот код падает и регистрирует все входящие и исходящие пакеты. Я хочу написать модуль ядра netfilter, чтобы перехватывать пакеты и записывать их в журналы ядра. Он должен иметь возможность обнаруживать разные (отображать 1 или 2 как пример) типы разведывательных пакетов на основе TCP. Модуль должен обнаружить эти пакеты в логах ядра. Я не хочу фильтровать пакеты, просто идентифицировать их и регистрировать.Модуль ядра Netfilter для перехвата пакетов и их регистрации

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

static struct nf_hook_ops nfho;   //struct holding set of hook function options 

//function to be called by hook 
unsigned int hook_func(unsigned int hooknum, struct sk_buff **skb, const struct net_device *in, const struct net_device *out, int (*okfn)(struct sk_buff *)) 
{ 
    printk(KERN_INFO "packet dropped\n");            //log to var/log/messages 
    return NF_DROP;                 //drops the packet 
} 

//Called when module loaded using 'insmod' 
int init_module() 
{ 
    nfho.hook = hook_func;      //function to call when conditions below met 
    nfho.hooknum = NF_IP_PRE_ROUTING;   //called right after packet recieved, first hook in Netfilter 
    nfho.pf = PF_INET;       //IPV4 packets 
    nfho.priority = NF_IP_PRI_FIRST;    //set to highest priority over all other hook functions 
    nf_register_hook(&nfho);      //register hook 

    return 0;         //return 0 for success 
} 

//Called when module unloaded using 'rmmod' 
void cleanup_module() 
{ 
    nf_unregister_hook(&nfho);      //cleanup – unregister hook 
} 

ответ

-2

можно просто запустить утилиту ufw брандмауэра

(который вы должны работать все время, так или иначе)

запустить его с:

sudo ufw enable 

то, чтобы обеспечить это бег

sudo ufw status 

включите функцию регистрации на

sudo ufw logging on 

затем

cd /var/log 

затем просмотреть журнал

sudo cat ufw.log 

Это даст журнал обо всем, что вход/выход

+0

, который работал, но я хочу создать для него модуль ядра. просто для обучения. Как я могу это сделать ? –

+0

Некоторый еще должен ответить на вопрос о том, как создать модуль ядра. Это область, с которой я не очень хорошо знаком. – user3629249

+0

Кажется, вам нужно что-то вроде http://lxr.free-electrons.com/source/net/netfilter/xt_LOG.c?v=3.10 –

3

Во-первых, этот модуль удаляет только входящие пакеты. Причиной является следующая строка: nfho.hooknum = NF_IP_PRE_ROUTING;. О вашем вопросе: я не понимаю, что такое «основанные на разведке пакеты», но вы можете извлечь все данные из пакета и показать их в журналах ядра. Например:

#include <linux/kernel.h> 
#include <linux/module.h> 
#include <linux/netfilter.h> 
#include <linux/netfilter_ipv4.h> 
#include <linux/ip.h> 
#include <linux/tcp.h> 

static struct nf_hook_ops nfho;   //struct holding set of hook function options 

//function to be called by hook 
unsigned int hook_func(unsigned int hooknum, struct sk_buff *skb, const struct net_device *in, const struct net_device *out, int (*okfn)(struct sk_buff *)) 
{ 
    struct iphdr *ip_header = (struct iphdr *)skb_network_header(skb); //you can access to IP source and dest - ip_header->saddr, ip_header->daddr 
    struct tcphdr *tcp_header; 
    if (ip_header->protocol == 6) //TCP protocol 
    { 
    printk(KERN_INFO "TCP Packet\n"); 
    tcp_header = (struct tcphdr *)(skb_transport_header(skb)+20); //Note: +20 is only for incoming packets 
    printk(KERN_INFO "Source Port: %u\n", tcp_header->source); //can access dest in the same way 
    } 
    return NF_ACCEPT;                 //accept the packet 
} 

//Called when module loaded using 'insmod' 
int init_module() 
{ 
    nfho.hook = hook_func;      //function to call when conditions below met 
    nfho.hooknum = NF_INET_PRE_ROUTING;   //called right after packet recieved, first hook in Netfilter 
    nfho.pf = PF_INET;       //IPV4 packets 
    nfho.priority = NF_IP_PRI_FIRST;    //set to highest priority over all other hook functions 
    nf_register_hook(&nfho);      //register hook 

    return 0;         //return 0 for success 
} 

//Called when module unloaded using 'rmmod' 
void cleanup_module() 
{ 
    nf_unregister_hook(&nfho);      //cleanup – unregister hook 
} 
Смежные вопросы