
1. 前言Linux中的netfilter提供了一个防火墙框架,具有很好的扩展性,除了自带的模块之外,用户可以根据自己的需求定义新的防火墙模块加入其中,而编程过程也不是很复杂,只要依葫芦画瓢即可,可在原来的类似功能的模块基础上修改即可,甚至对各函数是如何调用,一些内部结构是如何定义的都不用详细了解,本文即介绍如何编写自定义的目标模块。
目标(target)是防火墙规则策略中的结果部分,定义对数据包要进行如何处理,如接受、丢弃、修改、继续等。在具体实现时分为两部分,内核部分和用户空间部分:内核中是以netfilter的扩展模块实现,定义该模块并将其挂接到netfilter的目标链表中后,在内核进行目标检测时自动根据目标名称查找该模块而调用相应的目标函数,完成真正的目标功能;在用户空间,目标模块是作为iptables的一个扩展动态库来实现,只是一个用户接口,不完成实际目标功能,完成接收用户输入并将目标数据结构传递到内核的功能,该库的名称有限制,必须为libipt_xxx.so,其中“xxx”是该目标的名字,为区别于匹配,
通常目标的名称一般都是用大写。
2. 内核模块目标在2.4内核和在2.6内核中的函数参数略有区别,两者不兼容,但只要简单修改后即可相互移植,主体部分不需要改变,本文以2.6内核的模块为例。
为方便说明,还是通过举例来进行说明,要实现的目标是修改IP头中的ID字段,在实际使用中这个功能是没什么实际意义的,只是用来举例说明。
在内核中已经自带了net/ipv4/netfilter/ipt_ID.c模块用来修改IP头中的ID字段,我们可以以此模块为基础来进行修改。
首先要定义要进行目标的数据结构,用来描述目标条件,以ipt_ID.h头文件为基础修改为:
/* include/linux/netfilter_ipv4/ipt_ID.h */
#ifndef _IPT_ID_H_target
#define _IPT_ID_H_targetstruct ipt_id_target_info {
/* network order. */
u_int16_t id; // id是16位的数
};
#endif /*_IPT_ID_H_target*/
然后是定义内核模块处理,最主要的是定义一个ipt_target目标结构,该结构在include/linux/netfilter_ipv4/ip_tables.h中定义:
/* Registration hooks for targets. */
struct ipt_target
{
struct list_head list;
const char name[IPT_FUNCTION_MAXNAMELEN];
/* Called when user tries to insert an entry of thistype:
hook_mask is a bitmask of hooks from which it can be
called. */
/* Should return true or false. */
int (*checkentry)(const char *tablename,
const struct ipt_entry *e,
void *targinfo,
unsigned int targinfosize,
unsigned int hook_mask);
/* Called when entry of this type deleted. */
void (*destroy)(void *targinfo, unsigned inttarginfosize);
本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/jisuanjixue/article-34719-1.html
我们就把那3艘军舰给没收了
请多提宝贵意见
直接问问他