- 论坛徽章:
- 0
|
Linux netfilter Hacking HOWTO中有:
连接跟踪帮助模块
描述
连接跟踪模块的任务是指出哪一个信息包属于一个已经建立的连接。模块这样做有下面的含义:
· 告诉netfilter我们的模块对哪一个信息包感兴趣(大多数的帮助操作一个特殊的端口)。
· 用netfilter注册一个函数。这个函数被每一个符合上面的标准的信息包调用。
· 一个“ip_conntrack_expect_related()”函数,它能从那里被调用来告诉netfilter去期待一个关联连接。
如果这里有一些附加的工作在预期的连接的第一个信息包到达的时候被完成,模块可以注册一个在这个时候被调用的回调函数。
可用的结构和函数
你的内核模块的初始函数用一个指向“struct ip_conntrack_helper”的指针调用“ip_conntrack_helper_register()”。这个结构有下面的成员:
list
这是链表的报头。Netfilter在内部掌管这个列表只要用“{NULL,NULL}”初始化。
name
这是一个指向字符串常量的指针,该常量是协议名称。(“ftp”,“irc”,…)。
flags
一组有下面一个或多个标志的标志:
· IP_CT_HELPER_F_REUSE_EXPECT重新使用期待值,如果限制(查看下面的“max_expected”)到达。
me
一个指向帮助的模块结构的指针。用“THIS_MODULE”宏初始化它。
max_expected
未认可的(突出的)预期值的最大数值。
timeout
对于每一个未认可的预期值的timeout(很短时间内)。在预期被“ip_conntrack_expect_related()”函数产生片刻之后,一个预期是被注销的“timeout”。
tuple
这是一个“struct ip_conntrack_tuple”,它指出我们的conntrack帮助模块感兴趣的信息包。
mask
又一个“struct ip_conntrack_tuple”,这个掩码指定哪一个数组的比特位是有效的。
help
netfilter应该为每一个信息包匹配tuple+mask调用的函数。
一个conntrack帮助模块的框架例子
#define FOO_PORT 111
static int foo_expectfn(struct ip_conntrack *new)
{
/* called when the first packet of an expected
connection arrives */
return 0;
}
static int foo_help(const struct iphdr *iph, size_t len,
struct ip_conntrack *ct,
enum ip_conntrack_info ctinfo)
{
/* analyze the data passed on this connection and
decide how related packets will look like */
/* update per master-connection private data
(session state, ...) */
ct->help.ct_foo_info = ...
if (there_will_be_new_packets_related_to_this_connection)
{
struct ip_conntrack_expect exp;
memset(&exp, 0, sizeof(exp));
exp.t = tuple_specifying_related_packets;
exp.mask = mask_for_above_tuple;
exp.expectfn = foo_expectfn;
exp.seq = tcp_sequence_number_of_expectation_cause;
/* per slave-connection private data */
exp.help.exp_foo_info = ...
ip_conntrack_expect_related(ct, &exp);
}
return NF_ACCEPT;
}
static struct ip_conntrack_helper foo;
static int __init init(void)
{
memset(&foo, 0, sizeof(struct ip_conntrack_helper);
foo.name = "foo";
foo.flags = IP_CT_HELPER_F_REUSE_EXPECT;
foo.me = THIS_MODULE;
foo.max_expected = 1; /* one expectation at a time */
foo.timeout = 0; /* expectation never expires */
/* we are interested in all TCP packets with destport 111 */
foo.tuple.dst.protonum = IPPROTO_TCP;
foo.tuple.dst.u.tcp.port = htons(FOO_PORT);
foo.mask.dst.protonum = 0xFFFF;
foo.mask.dst.u.tcp.port = 0xFFFF;
foo.help = foo_help;
return ip_conntrack_helper_register(&foo);
}
static void __exit fini(void)
{
ip_conntrack_helper_unregister(&foo);
}
其中conntrack帮助模块的框架例子对我们的参考意义实在太大了
向所有伟大的人致敬!!! |
|