From: Eric L. <er...@in...> - 2008-12-02 09:55:10
|
This patch adds a netfilter_reinject_mask option which can be used to only modify the packet mark with respect to the selected mask. Let's say you can use mark 1 and mask 1 (thus reserve one bit to the reinjection process). To send all traffic to snort-inline, you can just add at the top of your ruleset: iptables -I FORWARD -m mark ! --mark 1/1 -j NFQUEUE Signed-off-by: Eric Leblond <er...@in...> --- src/inline.c | 10 +++++++--- src/parser.c | 20 ++++++++++++++++++++ src/snort.h | 1 + 3 files changed, 28 insertions(+), 3 deletions(-) diff --git a/src/inline.c b/src/inline.c index 2f3b6f0..a5f8766 100644 --- a/src/inline.c +++ b/src/inline.c @@ -242,7 +242,7 @@ static int cb(struct nfq_q_handle *qh, struct nfgenmsg *nfmsg, //ipq_pkt.packet_id = glid; //ipq_pkt.hw_protocol = ntohs(ph->hw_protocol); //ipq_pkt.hook = ph->hook; - //ipq_pkt.mark = nfq_get_nfmark(nfa); + ipq_pkt.mark = nfq_get_nfmark(nfa); /* TODO: we only use this for rejects, so we might move * this to the reject code */ @@ -998,7 +998,9 @@ void HandlePacket() #ifdef NFNETLINKQ if (pv.netfilter_reinject_mark) { - status = nfq_set_verdict_mark(qhndl, glid, NF_REPEAT, htonl(pv.netfilter_reinject_mark), 0, NULL); + status = nfq_set_verdict_mark(qhndl, glid, NF_REPEAT, + htonl((pv.netfilter_reinject_mark & pv.netfilter_reinject_mask) | m->mark), + 0, NULL); } else { status = nfq_set_verdict(qhndl, glid, NF_ACCEPT, 0, NULL); } @@ -1018,7 +1020,9 @@ void HandlePacket() { #ifdef NFNETLINKQ if (pv.netfilter_reinject_mark) { - status = nfq_set_verdict_mark(qhndl, glid, NF_REPEAT, htonl(pv.netfilter_reinject_mark), m->data_len, m->payload); + status = nfq_set_verdict_mark(qhndl, glid, NF_REPEAT, + htonl((pv.netfilter_reinject_mark & pv.netfilter_reinject_mask) | m->mark), + m->data_len, m->payload); } else { status = nfq_set_verdict(qhndl, glid, NF_ACCEPT, m->data_len, m->payload); } diff --git a/src/parser.c b/src/parser.c index 991a8f7..b0ac525 100644 --- a/src/parser.c +++ b/src/parser.c @@ -6861,6 +6861,26 @@ void ParseConfig(char *rule) return; } + else if(!strcasecmp(config, "netfilter_reinject_mask")) + { + if(args) + { + toks = mSplit(args, " ", 1, &num_toks, 0); +#ifdef GIDS +#ifdef NFNETLINKQ + pv.netfilter_reinject_mask = atoi(toks[0]); +#endif +#endif + + mSplitFree( &toks, num_toks ); + } + + mSplitFree(&rule_toks,num_rule_toks); + mSplitFree(&config_decl,num_config_decl_toks); + + return; + + } else if(!strcasecmp(config, "asn1")) { toks = mSplit(args, ", ", 20, &num_toks, 0); diff --git a/src/snort.h b/src/snort.h index a9ea3a4..d0f1542 100644 --- a/src/snort.h +++ b/src/snort.h @@ -300,6 +300,7 @@ typedef struct _progvars #endif /* USE IPFW DIVERT socket instead of IPtables */ #ifdef NFNETLINKQ int netfilter_reinject_mark; + int netfilter_reinject_mask; #endif #endif /* GIDS */ #ifdef WIN32 -- 1.5.6.5 |