struct ipt_entry *e:指向规则的指针;
targetinfo:用户空间传入的目标条件信息的指针;
targetinfosize:用户空间传入目标条件信息的长度;
hook_mask:表示挂接点(PREROUTING/INPUT/FORWARD/OUTPUT/POSTROUTING)的掩码,可用来限制目标只能在指定的挂接点中处理;
宏IPT_ALIGN用来得到实际目标结构的实际大小。
本例中需要检查目标数据长度是否正确,表名是否是“mangle”,因为需要对数据进行修改,所以一般要在mangle表中进行处理,其实也可以不限制;
destroy函数释放该目标中动态分配的资源,无返回值,函数定义为:
void (*destroy)(void *targetinfo, unsigned inttargetinfosize);
函数参数同check()函数说明,在本例中,并没有分配相关资源,所以没定义此函数。
最后在模块初始化函数中要调用ipt_register_target()函数将一个ipt_target目标结构挂接到系统目标链表中,在模块的结束函数中调用ipt_unregister_target()函数将目标结构从目标链表中去除。
修改net/ipv4/netfilter/Makefile和Kconfig文件,加入关于ipt_ID相关内容即可在编译内核中自动编译,或者单独直接将其编译为模块插入内核。netfilter
ipt_ID.c
/* This is a module which is used for setting the ID field of apacket.
* based on ipt_ID.c
* in fact, it's useless.
*/
#include <linux/module.h>
#include <linux/skbuff.h>
#include <linux/ip.h>
#include <net/checksum.h>
#include <linux/netfilter_ipv4/ip_tables.h>
#include <linux/netfilter_ipv4/ipt_ID.h>
MODULE_LICENSE("GPL");
MODULE_AUTHOR("yfydzyfydz_no1@hotmail.com >");
MODULE_DESCRIPTION("iptables ID mangling module");static unsigned int
target(struct sk_buff **pskb,
const struct net_device*in,
const struct net_device*out,
unsigned int hooknum,
const void *targinfo,
void *userinfo)
{
const struct ipt_id_target_info *idinfo = targinfo;
// 如果当前包的ID值和指定值不同,将指定值赋值给IP头中的ID字段
if ((*pskb)->nh.iph->id != idinfo->id) {
u_int16_t diffs[2];
if (!skb_ip_make_writable(pskb, sizeof(structiphdr)))
return NF_DROP;
本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/jisuanjixue/article-34719-3.html
很棒