struct ipt_entry_target *t;
unsigned int tflags;
unsigned int used;
#ifdef NO_SHARED_LIBS
unsigned int loaded; /* simulate loading so options aremerged properly */
#endif
};
struct iptables_target结构参数说明如下:
next: 目标链表的下一个,目标链表是一个单向链表;
name:目标的名称,必须是唯一的;
version:iptables的版本;
size:目标结构的数据长度;
userspacesize:用于目标部分的数据长度,通常此值等于size,但某些情况可能会小于size;
help函数:打印帮助信息,当 "-j xxx -h"时调用;
init函数:初始化函数,可对目标结构赋初值;
parse函数:解析用户输入参数,这是最主要的处理函数;
final_check函数:对用户数据进行最后的检查;
print函数:打印目标信息,iptables -L时调用
save函数:保存当前iptables规则时打印目标格式,被iptables-save程序调用;
extra_opts:选项信息,选项格式是标准的UNIX选项格式,通过getopt函数识别;
option_offset:选项偏移;
t:指向iptables规则;
tflags:规则相关标志
used: 模块使用计数;
本例中,用户输入的参数是新的ID值,格式为:
“-j ID --set-id id_value ”
id_value 为id的实际数值。
libipt_id.c函数就是填写structiptables_target结构,然后定义动态库初始化函数_init()将该结构挂接到iptables的选项链表中。程序在libipt_id.c的基础上修改,程序比较简单,直接将代码列出,相关说明在注释中:
/* libipt_id.c */
/* Shared library add-on to iptables to add ID target support.*/
#include <stdio.h>
#include <string.h>

#include <stdlib.h>
#include <getopt.h>
#include <iptables.h>
#include <linux/netfilter_ipv4/ip_tables.h>
#include <linux/netfilter_ipv4/ipt_ID.h>
struct idinfo {
struct ipt_entry_target t;
struct ipt_id_target_info id;
};
/* Function which prints out usage message. */
static void
help(void)
{
unsigned int i;printf(
"ID target v%s options:n"
" --set-idvalueSet ID of IP headeren",
IPTABLES_VERSION);
}
// opts结构第一个参数为选项名称,
// 第二个参数为1表示选项名称后还带参数,为0表示选项名称后不带参数
// 第3个参数是标志,表示返回数据的格式,一般都设为0
本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/jisuanjixue/article-34719-6.html
要的不就是不断的在变化吗