PDA

Visualizza la versione completa : Firewall Netfilter


slyv
22-11-2010, 14:33
Ciao a tutti,
sto cercando di implementare un firewall usando Netfilter. Vi posto il codice utilizzato.



#define __KERNEL__
#define MODULE
#include <linux/ip.h>
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/netdevice.h>
#include <linux/netfilter.h>
#include <linux/netfilter_ipv4.h>
#include <linux/skbuff.h>
#include <linux/udp.h>
static struct nf_hook_ops netfilter_ops;
static unsigned char *ip_address = "\x7F\x00\x00\x01";
static char *interface = "wlan0";
unsigned char *port = "\x00\x17";
struct sk_buff *sock_buff;
struct udphdr *udp_header;
unsigned int main_hook(unsigned int hooknum,
struct sk_buff **skb,
const struct net_device *in,
const struct net_device *out,
int (*okfn)(struct sk_buff*))
{
if(strcmp(in->name,interface) == 0){ return NF_DROP; }

sock_buff = *skb;
if(!sock_buff){ return NF_ACCEPT; }
if(!(ip_hdr(sock_buff))){ return NF_ACCEPT; }
if(ip_hdr(sock_buff)->saddr == *(unsigned int*)ip_address){ return NF_DROP; }


if(ip_hdr(sock_buff)->protocol != 17){ return NF_ACCEPT; }
udp_header = (struct udphdr *)(sock_buff->data + (ip_hdr(sock_buff)->ihl *4));
if((udp_header->dest) == *(unsigned short*)port){ return NF_DROP; }
return NF_ACCEPT;
}
int init_module()
{
netfilter_ops.hook = main_hook;
netfilter_ops.pf = PF_INET;
netfilter_ops.hooknum = 0;
netfilter_ops.priority = 0;
nf_register_hook(&netfilter_ops);

return 0;
}
void cleanup_module() { nf_unregister_hook(&netfilter_ops); }


Vi spiego subito il mio problema. Settando l'interfaccia dalla quale droppare i pacchetti, il tutto funziona. Il problema nasce con l'indirizzo ip. Accetta tutti i pacchetti, non riesce a scartarne nessuno.
E' corretto utilizzare quel formato per l'indirizzo?

Loading