Linux下使用netfilter进行IP包解析

简单的使用netfilter对IP包进行解析,主要是打通netfilter的使用方法。

一个简单的样例:打印出经过钩子函数的包的源目IP地址

sample.c

#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/types.h>
#include <linux/netdevice.h>
#include <linux/skbuff.h>
#include <linux/netfilter_ipv4.h>
#include <linux/inet.h>
#include <linux/in.h>
#include <linux/ip.h>

MODULE_LICENSE("GPL");
#define NIPQUAD(addr) \
  ((unsigned char *)&addr)[0], \
  ((unsigned char *)&addr)[1], \
  ((unsigned char *)&addr)[2], \
  ((unsigned char *)&addr)[3]

static unsigned int sample(
unsigned int hooknum,
struct sk_buff * skb,
const struct net_device *in,
const struct net_device *out,
int (*okfn) (struct sk_buff *))
{
    __be32 sip,dip;
 if(skb){
   struct sk_buff *sb = NULL;
   sb = skb;
   struct iphdr *iph;
   iph  = ip_hdr(sb);
   sip = iph->saddr;
   dip = iph->daddr;
   printk("Packet for source address: %d.%d.%d.%d\n destination address: %d.%d.%d.%d\n ", NIPQUAD(sip), NIPQUAD(dip));
	}
 return NF_ACCEPT;
}

 struct nf_hook_ops sample_ops = {
   .list =  {NULL,NULL},
   .hook = sample,
   .pf = PF_INET,
   .hooknum = NF_INET_PRE_ROUTING,
   .priority = NF_IP_PRI_FILTER+2
 };

static int __init sample_init(void) {
  nf_register_hook(&sample_ops);
  return 0;
}


static void __exit sample_exit(void) {
  nf_unregister_hook(&sample_ops);
}

 module_init(sample_init);
 module_exit(sample_exit); 
 MODULE_AUTHOR("chenkangrui");
 MODULE_DESCRIPTION("sample");

编译:

Makefile文件,主要tab键

obj-m := sample.o
	KERNELBUILD :=/lib/modules/$(shell uname -r)/build
default:
	make -C $(KERNELBUILD) M=$(shell pwd) modules
clean:
	rm -rf *.o *.ko *.mod.c .*.cmd *.markers *.order *.symvers .tmp_versions

这是我使用的Makefile,需要注意的是,因为编译内核模块需要使用内核中的头文件,所以需要

sudo make

编译完成之后,将.ko文件加载到内核中就可以了

sudo insmod ./sample.ko

内核模块的输出printk不是直接打印到系统终端的,而是在系统日志中

你可以使用

dmesg

或者直接去/var/log/目录下查看syslog文件

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值