制作linux下netfilter过滤驱动程序

本文适合过去一直用VisualStudio进行windows程序设计的人阅读

环境:

服务器端centOS8(必需安装linux内核源码),客户端windows+VisualCode+putty

vscode插件繁多功能强大,我暂时只是将其作为一个远程代码书写工具,用于编写C/C++代码和Makefile文件。编译则是通过putty远程执行make命令。vscode有maketools插件,但插件安装之后的配置对我来说是个麻烦事。所以干脆使用putty,反正也得用它执行其它指令。

我的vscode主要安装有SSH插件和C/C++插件,参见vscode安装笔记 

最重要的是centOS8上必需安装好内核源码,此乃一切工作之基础。 然后在配置C/C++插件时,把其路径include进去,这样vscode才能"认识"代码前面所包含的头文件。

注:centos内核源码路径为usr/src/kernels如果没安装此路径下无内容。安装方式为:

yum install "kernel-devel-uname-r == $(uname -r)"

安装gcc: yum -y install gcc

安装g++: yum install -y gcc-c++

c_pp_properties.json

{
    "configurations": [
        {
            "name": "Linux",
            "includePath": [
                "${workspaceFolder}/**",
                "/home/szm/linux/IMX6ULL/szm_linux/linux-imx-rel_imx_4.1.15_2.1.0_ga/include/**", 
                "/home/szm/linux/IMX6ULL/szm_linux/linux-imx-rel_imx_4.1.15_2.1.0_ga/arch/arm/include", 
                "/home/szm/linux/IMX6ULL/szm_linux/linux-imx-rel_imx_4.1.15_2.1.0_ga/arch/arm/include/generated/"
            ],
            "defines": [],
            "compilerPath": "/usr/bin/gcc",
            "cStandard": "c11",
            "cppStandard": "c++17",
            "intelliSenseMode": "gcc-x64"
        }
    ],
    "version": 4

源码根下的include是主要包含路径,除此处还可能用到其它路径,当发现vscode中头文件有红色波浪线,就在putty中CD到源码根路径后find -name xxx.h头文件,找到后将相关路径添加到上面配置文件中。

发现设置了includepath后头文件还可能飘红,可参考我另一篇博文“centos7 netfilter过滤程序

搞定头文件后,vscode可能还会报"不允许使用不完整的类类型"这样的错误,经我实践并不影响编译。

下面进入正题,一个最新版的、最简单的netfilter代码:

#include <linux/kernel.h>  
#include <linux/kern_levels.h>
#include <linux/netfilter.h>  
#include <linux/netfilter_ipv4.h>  
#include <linux/init.h> 

  
static struct nf_hook_ops nfho;


unsigned int hook_func(void *priv, struct sk_buff *skb, const struct nf_hook_state *state)  
{  
  printk(KERN_INFO"netflt packet dropped !\n");
  return NF_DROP;
}  

int init_module()  
{  
  nfho.hook = hook_func;
  nfho.hooknum = NF_INET_PRE_ROUTING;
  nfho.pf = PF_INET;
  nfho.priority = NF_IP_PRI_FIRST;
  int r = nf_register_net_hook(&init_net, &nfho);//成功返回0
  printk(KERN_INFO"netflt init ! %d\n",r);
  return 0;
}  

void cleanup_module()
{  
  nf_unregister_net_hook(&init_net,&nfho);
  printk(KERN_INFO"netflt exit !\n");
}

接下来说一下makefile,linux下makefile就是名为"Makefile"的一个文件,没有扩展名。

# KERNELDIR表示内核源码路径
KERNELDIR := /home/szm/linux/IMX6ULL/szm_linux/linux-imx-rel_imx_4.1.15_2.1.0_ga
# 表示当前路径,即pwd
CURRENT_PATH := $(shell pwd)

# 将netflt.c编译成模块
obj-m := netflt.o

build : kernel_modules


# 具体的编译命令,后面的 modules 表示编译模块,-C 表示将当前的工作目录切
# 换到指定目录中,也就是 KERNERLDIR 目录。M 表示模块源码目录,“make modules”命令
# 中加入 M=dir 以后程序会自动到指定的 dir 目录中读取模块的源码并将其编译为.ko 文件。
kernel_modules:
	$(MAKE) -C $(KERNELDIR) M=$(CURRENT_PATH) modules

clean:
	$(MAKE) -C $(KERNELDIR) M=$(CURRENT_PATH) clean

关于makefile可参阅:https://blog.csdn.net/daocaokafei/article/details/124641034 

 vscode安装完后会在服务器端用户目录下建.vscode-server目录,编写的代码和makefile文件也在该目录下或其子目录中,putty CD到那里,执行make。如果成功会生成一个.ko文件,insmod这个ko文件,netfilter驱动被加载入内核。由于我这个示例代码太过简单粗暴,直接屏蔽所有IP包,于是insmod后putty和vscode就立刻瘫痪了。。。要恢复得在运营商控制面板那重启服务器。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值