| /* 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> | |
| #include <linux/netfilter/x_tables.h> | |
| #include <net/netfilter/nf_conntrack.h> | |
| MODULE_DESCRIPTION("Xtables: Disabling connection tracking for packets"); | |
| MODULE_LICENSE("GPL"); | |
| MODULE_ALIAS("ipt_NOTRACK"); | |
| MODULE_ALIAS("ip6t_NOTRACK"); | |
| static unsigned int | |
| notrack_tg(struct sk_buff *skb, const struct xt_target_param *par) | |
| { | |
| /* Previously seen (loopback)? Ignore. */ | |
| if (skb->nfct != NULL) | |
| return XT_CONTINUE; | |
| /* 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 */ | |
| skb->nfct = &nf_conntrack_untracked.ct_general; | |
| skb->nfctinfo = IP_CT_NEW; | |
| nf_conntrack_get(skb->nfct); | |
| return XT_CONTINUE; | |
| } | |
| static struct xt_target notrack_tg_reg __read_mostly = { | |
| .name = "NOTRACK", | |
| .revision = 0, | |
| .family = NFPROTO_UNSPEC, | |
| .target = notrack_tg, | |
| .table = "raw", | |
| .me = THIS_MODULE, | |
| }; | |
| static int __init notrack_tg_init(void) | |
| { | |
| return xt_register_target(¬rack_tg_reg); | |
| } | |
| static void __exit notrack_tg_exit(void) | |
| { | |
| xt_unregister_target(¬rack_tg_reg); | |
| } | |
| module_init(notrack_tg_init); | |
| module_exit(notrack_tg_exit); |