Re: Question about ipt_REJECT

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Xiong Wu wrote:
> Hi,
> 
> I have to reject some connection which are confirmed, therefor I apply
> the following patch to solve this problem. Please help me to review
> this patch.

As I said, this doesn't work properly since conntrack can't associate
packets generated in response to half-way NATed packets with the
original connection.

The manual conntrack association is necessary, you need to find a way
to make the packet visible to TCP conntrack. I think what might work
is to change the condition ignoring already-tracked packets in
nf_conntrack to only ignore packets using either nf_conntrack_untracked
or received in NF_INET_PRE_ROUTING.

> --- linux-2.6.32.3/net/ipv4/netfilter/ipt_REJECT.c      2010-01-07
> 07:07:45.000000000 +0800
> +++ linux-2.6.32.3-new/net/ipv4/netfilter/ipt_REJECT.c  2010-01-10
> 21:18:11.000000000 +0800
> @@ -23,6 +23,7 @@
>  #include <linux/netfilter/x_tables.h>
>  #include <linux/netfilter_ipv4/ip_tables.h>
>  #include <linux/netfilter_ipv4/ipt_REJECT.h>
> +#include <include/net/netfilter/nf_conntrack.h>
>  #ifdef CONFIG_BRIDGE_NETFILTER
>  #include <linux/netfilter_bridge.h>
>  #endif
> @@ -40,6 +41,9 @@
>         const struct tcphdr *oth;
>         struct tcphdr _otcph, *tcph;
>         unsigned int addr_type;
> +       enum ip_conntrack_info ctinfo;
> +       const struct nf_conn *ct;
> +
> 
>         /* IP header checks: fragment. */
>         if (ip_hdr(oldskb)->frag_off & htons(IP_OFFSET))
> @@ -120,7 +124,12 @@
>         if (nskb->len > dst_mtu(skb_dst(nskb)))
>                 goto free_nskb;
> 
> -       nf_ct_attach(nskb, oldskb);
> +       /*only when the ct isn't confirmed, attach it to reset packet*/
> +       ct = nf_ct_get(skb, &ctinfo);
> +       if((ct != NULL) && (!nf_ct_is_confirmed(ct)))
> +       {
> +               nf_ct_attach(nskb, oldskb);
> +       }
> 
>         ip_local_out(nskb);
>         return;
> 
> Thanks,
> Xiong
> 
> 2010/1/4 Patrick McHardy <kaber@xxxxxxxxx>:
>> Xiong Wu wrote:
>>> Hi All,
>>>
>>> I found the TCP RST packet sent from ipt_REJECT target isn't able to
>>> update related conntrack state.
>>>
>>> I install a 2.6.30.10 kernel as a router and add a iptables rule with
>>> REJECT target to reset specific connections.  However  I found  when
>>> the packets is handled by the ipt_REJECT and the TCP RST packet is
>>> sent, the related conntrack state isn't updated to CLOSE state.
>>>
>>> Then I review the ipt_REJECT codes. I found the target attach the old
>>> conntrack to RST packet as:
>>> {
>>>    nf_ct_attach(nskb, oldskb);
>>>    ip_local_out(nskb);
>>> }
>>>
>>> Therefor the nf_conntrack_in() will ignore this RST packet due to the
>>> nfct is valid in skb.
>>> {
>>>      if (skb->nfct) {
>>>                     NF_CT_STAT_INC_ATOMIC(net, ignore);
>>>                     return NF_ACCEPT;
>>>      }
>>> }
>>>
>>>
>>> Is there any reason to attach the old conntrack to new RST skb?  I
>>> think let the RST packet lookup and update related conntrack is
>>> better.
>> The packet that is rejected might be half-way mangled by NAT (DNAT
>> performed, SNAT not yet performed). In this state conntrack is
>> be unable to associate the generated RST packet with the conntrack
>> entry. The same applies when you reject the first packet of a
>> connection which hasn't entered the hash tables yet.
>>
>> Usually this shouldn't be a problem exactly because you would
>> normally reject the first packet of a connection, so it wouldn't
>> be placed in the conntrack hash.
>>
>>
> 

--
To unsubscribe from this list: send the line "unsubscribe netfilter-devel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Netfitler Users]     [LARTC]     [Bugtraq]     [Yosemite Forum]

  Powered by Linux