linux 网络netfilter学习

转载 2018年04月17日 10:12:13

学习网上有关Linux 内核hook博客。
深入Linux网络核心堆栈–netfilter详解(整理)

通过hook过滤ip地址代码:
/* 
* 安装一个丢弃所有到达的数据包的Netfilter hook函数的示例代码 
*/

#define __KERNEL__
#define MODULE

#include <linux/kernel.h>  
#include <linux/init.h>  
#include <linux/module.h>  
#include <linux/version.h>  
#include <linux/string.h>  
#include <linux/kmod.h>  
#include <linux/vmalloc.h>  
#include <linux/workqueue.h>  
#include <linux/spinlock.h>  
#include <linux/socket.h>  
#include <linux/net.h>  
#include <linux/in.h>  
#include <linux/skbuff.h>  
#include <linux/ip.h>  
#include <linux/tcp.h>  
#include <linux/netfilter.h>  
#include <linux/netfilter_ipv4.h>  
#include <linux/icmp.h>  
#include <net/sock.h>  
#include <asm/uaccess.h>  
#include <asm/unistd.h>  

MODULE_LICENSE("GPL");  
MODULE_AUTHOR("xsc");  

/* 用于注册我们的函数的数据结构 */
static struct nf_hook_ops nfho;

/* 过滤接口 */
static char *drop_if="lo";
/* 过滤ip */
//static char *drop_ip="/x7f/x00/x00/x01";  /*  127.0.0.1 */ 
static char *parg="192.168.2.1";
module_param(parg, charp, S_IRUGO);

/* 
 * there is not a inet_addr in kernel.use in_aton or write one.
*/
unsigned int inet_addr(char *str)
{
    int a,b,c,d;
    char arr[4];

    sscanf(str,"%d.%d.%d.%d",&a,&b,&c,&d);
    arr[0] = a;arr[1] = b;
    arr[2] = c;arr[3] = d;
    return *(unsigned int*)arr;
}


/* 注册的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 sk_buff *sk = skb_copy(skb,1);
    struct iphdr *ip;
    ip = ip_hdr(sk);
//  printk( KERN_ALERT "zzk lo NF_DROP !\n");

    if( ip->saddr == inet_addr(parg) )
    {
        return NF_DROP;
    }
    else
    {
        return NF_ACCEPT;
    }
}

/* 初始化程序 */
int init_module()
{
    /* 填充我们的hook数据结构 */
    nfho.hook     = hook_func;         /* 处理函数 */
    nfho.hooknum  = NF_INET_PRE_ROUTING; /* 使用IPv4的第一个hook */
    nfho.pf       = PF_INET;
    nfho.priority = NF_IP_PRI_FIRST;   /* 让我们的函数首先执行 */

    nf_register_hook(&nfho);

    return 0;
}

/* 清除程序 */
void cleanup_module()
{
    nf_unregister_hook(&nfho);
}
Makefile
obj-m += ip_filter.o
    CURRENT_PATH:=$(shell pwd)
    LINUX_KERNEL_PATH:=/lib/modules/$(shell uname -r)/build
all:
    $(MAKE) -C $(LINUX_KERNEL_PATH) M=$(CURRENT_PATH) modules
clean:
    rm -rf .*.cmd *.o *.mod.c *.ko .tmp_versions

深入Linux网络核心堆栈--netfilter详解(整理)

本文转载自: http://blog.csdn.net/xsckernel/article/details/8186679 plain] view plaincopyprint? ...
  • qiushanjushi
  • qiushanjushi
  • 2015-01-30 13:46:19
  • 1281

Linux netfilter 学习笔记 之一 HOOK机制的分析与应用

ddddd
  • lickylin
  • lickylin
  • 2014-06-19 23:29:33
  • 5136

对于数据包的截取,使用linux中的netfilter钩子函数

在师哥的代码(packet.c)中使用的是Linux2.4内核中的一个子系统:netfilter,该子系统的使用可以过滤数据包,也就对数据包经行了截获,它通过调用内核网络代码中的一些hook函数完成所...
  • wswifth
  • wswifth
  • 2009-12-31 22:03:00
  • 7638

Linux内核工程导论——网络:Netfilter概览

简介最早的内核包过滤机制是ipfwadm,后来是ipchains,再后来就是iptables/netfilter了。再往后,也就是现在是nftables。不过nftables与iptables还处于争...
  • ljy1988123
  • ljy1988123
  • 2016-01-04 19:52:59
  • 2017

Linux netfilter 学习笔记 之十五 netfilter模块添加一个match

通过这段时间的学习,基本上熟悉了netfilter模块,为了进一步加深对netfilter的认识以及理解iptables与netfilter的联系,准备添加一个match模块。   在看到网关产品...
  • lickylin
  • lickylin
  • 2014-07-24 21:11:26
  • 4874

Netfilter资料集合

  • 2014年06月17日 16:07
  • 3.58MB
  • 下载

【Linux 驱动】Netfilter/iptables (五) 数据包过滤

通过前面的学习,我们窥探了整个Netfilter框架,下面我们就通过一些编程实例来进一步学习。一. 基于网络设备接口进行数据包过滤 根据hook函数接收的参数中的 struct net_device...
  • yeswenqian
  • yeswenqian
  • 2015-12-22 14:48:45
  • 2165

Netfilter学习笔记

这两天在学习iptables,感觉这个东西实在是太牛逼!想用两篇博文来介绍一番。 第一篇会介绍下netfilter和iptables的关系,以及iptables的原理;第二篇希望通过libipq和n...
  • langeldep
  • langeldep
  • 2013-04-11 15:08:18
  • 6111

2.6内核基于NetFilter处理框架修改TCP数据包实现访问控制

征战论文的途中,以前公司的人来找我说要给之前我设计的网络内容过滤产品添加一个功能,只允许使用了我们产品的用户才能访问某教育局提供的视频教育资源。相比写论文,这种工程复杂性接近于O(1)或顶多是O(t)...
  • stonesharp
  • stonesharp
  • 2014-05-26 16:33:43
  • 1465

Linux Netfilter开发小结

前置知识: IP包: struct ip { #if BYTE_ORDER == LITTLE_ENDIAN unsigned char ip_hl:4, /* h...
  • zhuhuibeishadiao
  • zhuhuibeishadiao
  • 2016-05-25 18:35:11
  • 5305
收藏助手
不良信息举报
您举报文章:linux 网络netfilter学习
举报原因:
原因补充:

(最多只允许输入30个字)