xt_NOTRACK.c 1.5 KB
Newer Older
L
Linus Torvalds 已提交
1 2 3 4 5 6
/* This is a module which is used for setting up fake conntracks
 * on packets so that they are not seen by the conntrack/NAT code.
 */
#include <linux/module.h>
#include <linux/skbuff.h>

7
#include <linux/netfilter/x_tables.h>
8
#include <net/netfilter/nf_conntrack_compat.h>
L
Linus Torvalds 已提交
9

10 11 12
MODULE_LICENSE("GPL");
MODULE_ALIAS("ipt_NOTRACK");

L
Linus Torvalds 已提交
13 14 15 16 17
static unsigned int
target(struct sk_buff **pskb,
       const struct net_device *in,
       const struct net_device *out,
       unsigned int hooknum,
18
       const struct xt_target *target,
19
       const void *targinfo)
L
Linus Torvalds 已提交
20 21 22
{
	/* Previously seen (loopback)? Ignore. */
	if ((*pskb)->nfct != NULL)
23
		return XT_CONTINUE;
L
Linus Torvalds 已提交
24 25 26 27 28

	/* Attach fake conntrack entry. 
	   If there is a real ct entry correspondig to this packet, 
	   it'll hang aroun till timing out. We don't deal with it
	   for performance reasons. JK */
29
	nf_ct_untrack(*pskb);
L
Linus Torvalds 已提交
30 31 32
	(*pskb)->nfctinfo = IP_CT_NEW;
	nf_conntrack_get((*pskb)->nfct);

33
	return XT_CONTINUE;
L
Linus Torvalds 已提交
34 35
}

36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
static struct xt_target xt_notrack_target[] = {
	{
		.name		= "NOTRACK",
		.family		= AF_INET,
		.target		= target,
		.table		= "raw",
		.me		= THIS_MODULE,
	},
	{
		.name		= "NOTRACK",
		.family		= AF_INET6,
		.target		= target,
		.table		= "raw",
		.me		= THIS_MODULE,
	},
L
Linus Torvalds 已提交
51 52
};

53
static int __init xt_notrack_init(void)
L
Linus Torvalds 已提交
54
{
55 56
	return xt_register_targets(xt_notrack_target,
				   ARRAY_SIZE(xt_notrack_target));
L
Linus Torvalds 已提交
57 58
}

59
static void __exit xt_notrack_fini(void)
L
Linus Torvalds 已提交
60
{
61
	xt_unregister_targets(xt_notrack_target, ARRAY_SIZE(xt_notrack_target));
L
Linus Torvalds 已提交
62 63
}

64 65
module_init(xt_notrack_init);
module_exit(xt_notrack_fini);