netfilter-devel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* ip6tables breaks dnssec?
@ 2011-04-27  8:57 Leo Baltus
  2011-04-27 10:08 ` Jan Engelhardt
  0 siblings, 1 reply; 10+ messages in thread
From: Leo Baltus @ 2011-04-27  8:57 UTC (permalink / raw)
  To: netfilter-devel

Hi,

When doing recusive dns queries to dnssec-enbled servers it looks like
ip6tables does not assemble udp packets before filtering takes place.
This results in fragments being dropped.

Here's how to reproduce using bind-9.7.x or bind-9.8.x with fedora 14,
kernel 2.6.35.12-88

1. make /tmp/named./conf
        options {
                directory               "/tmp";
                recursion yes;
                listen-on-v6 { ::1; };
        };

2. start named

        named -6 -c /tmp/named.conf

3. my ip6tables filter

        # cleanup
        ip6tables -P INPUT ACCEPT;
        ip6tables -P OUTPUT ACCEPT;
        for table in $(cat /proc/net/ip6_tables_names); do
                ip6tables -t $table -F; 
                ip6tables -t $table -X;
                ip6tables -t $table -Z;
        done
        
        #accept icmp6
        ip6tables -A INPUT -j ACCEPT -p icmpv6
        ip6tables -A OUTPUT -j ACCEPT -p icmpv6
        
        # accept incoming dns
        ip6tables -A INPUT -j ACCEPT -p udp --dport 53
        ip6tables -A OUTPUT -j ACCEPT -p udp --sport 53
        
        # accept outgoing dns
        ip6tables -A INPUT -j ACCEPT -p udp --sport 53
        ip6tables -A OUTPUT -j ACCEPT -p udp --dport 53
        
        # drop policy
        ip6tables -A INPUT  -j LOG --log-level 6 --log-prefix 'drop in: '
        ip6tables -A OUTPUT -j LOG --log-level 6 --log-prefix 'drop out: '
        ip6tables -P INPUT DROP;
        ip6tables -P OUTPUT DROP;

4. Do a query to a dnssec servers, I use this test-setup:
 https://www.dns-oarc.net/oarc/services/replysizetest

        dig @::1  +short  rs.dns-oarc.net txt

5. The result should be
        'DNS reply size limit is at least 4091', or roundabout 4000

However we see fragments being dropped in the logs and a reply size
just under MTU so I assume no fragments get assembled:

Apr 27 10:43:38 leo kernel: [81648.003267] drop in: IN=eth0 OUT= MAC=00:--:--:--:--:--:--:--:--:--:--:--:--:-- SRC=2001:04f8:0003:02bc:0002:0000:0000:0135 DST=2a02:0458:0101:----:----:----:----:---- LEN=1496 TC=0 HOPLIMIT=56 FLOWLBL=0 FRAG:1448 INCOMPLETE ID:88b59425 PROTO=UDP 
Apr 27 10:43:38 leo kernel: [81648.003289] drop in: IN=eth0 OUT= MAC=00:--:--:--:--:--:--:--:--:--:--:--:--:-- SRC=2001:04f8:0003:02bc:0002:0000:0000:0135 DST=2a02:0458:0101:----:----:----:----:---- LEN=1243 TC=0 HOPLIMIT=56 FLOWLBL=0 FRAG:2896 ID:88b59425 PROTO=UDP 


-- 
Leo Baltus, internetbeheerder                         /\
NPO ICT Internet Services                            /NPO/\
Sumatralaan 45, 1217 GP Hilversum, Filmcentrum, west \  /\/
beheer@omroep.nl, 035-6773555                         \/

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: ip6tables breaks dnssec?
  2011-04-27  8:57 ip6tables breaks dnssec? Leo Baltus
@ 2011-04-27 10:08 ` Jan Engelhardt
  2011-04-27 10:43   ` Ulrich Weber
  0 siblings, 1 reply; 10+ messages in thread
From: Jan Engelhardt @ 2011-04-27 10:08 UTC (permalink / raw)
  To: Leo Baltus; +Cc: netfilter-devel

On Wednesday 2011-04-27 10:57, Leo Baltus wrote:

>Hi,
>
>When doing recusive dns queries to dnssec-enbled servers it looks like
>ip6tables does not assemble udp packets before filtering takes place.
>This results in fragments being dropped.

You need to have nf_defrag_ipv6 loaded for automatic defragmentation. 
There are only a few components that depend on it - nf_conntrack and 
TPROXY, so it may not be autoloaded if you do not use either.

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: ip6tables breaks dnssec?
  2011-04-27 10:08 ` Jan Engelhardt
@ 2011-04-27 10:43   ` Ulrich Weber
  2011-04-27 10:56     ` Leo Baltus
  2011-04-27 11:22     ` Jan Engelhardt
  0 siblings, 2 replies; 10+ messages in thread
From: Ulrich Weber @ 2011-04-27 10:43 UTC (permalink / raw)
  To: Jan Engelhardt; +Cc: Leo Baltus, netfilter-devel

Each fragmented IPv6 packets will traverse netfilter separately,
in contrast to IPv4, where its only one refragmented packet.

"ip6tables -A INPUT -j ACCEPT -p udp --dport 53" will only match the
first fragment, where the UDP header can be found. To match the
additional fragments, you have to insert these rules:

ip6tables -I INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
ip6tables -I OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

Cheers
 Ulrich

On 04/27/2011 12:08 PM, Jan Engelhardt wrote:
> On Wednesday 2011-04-27 10:57, Leo Baltus wrote:
> 
>> Hi,
>>
>> When doing recusive dns queries to dnssec-enbled servers it looks like
>> ip6tables does not assemble udp packets before filtering takes place.
>> This results in fragments being dropped.
> 
> You need to have nf_defrag_ipv6 loaded for automatic defragmentation. 
> There are only a few components that depend on it - nf_conntrack and 
> TPROXY, so it may not be autoloaded if you do not use either.
> --
> To unsubscribe from this list: send the line "unsubscribe netfilter-devel" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html


^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: ip6tables breaks dnssec?
  2011-04-27 10:43   ` Ulrich Weber
@ 2011-04-27 10:56     ` Leo Baltus
  2011-04-27 11:22     ` Jan Engelhardt
  1 sibling, 0 replies; 10+ messages in thread
From: Leo Baltus @ 2011-04-27 10:56 UTC (permalink / raw)
  To: Ulrich Weber; +Cc: Jan Engelhardt, netfilter-devel

Op 27/04/2011 om 12:43:19 +0200, schreef Ulrich Weber:
> Each fragmented IPv6 packets will traverse netfilter separately,
> in contrast to IPv4, where its only one refragmented packet.
> 

I seem to have missed that.

> "ip6tables -A INPUT -j ACCEPT -p udp --dport 53" will only match the
> first fragment, where the UDP header can be found. To match the
> additional fragments, you have to insert these rules:
> 
> ip6tables -I INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
> ip6tables -I OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
> 

Thanks. That was it.

> On 04/27/2011 12:08 PM, Jan Engelhardt wrote:
> > On Wednesday 2011-04-27 10:57, Leo Baltus wrote:
> > 
> >> Hi,
> >>
> >> When doing recusive dns queries to dnssec-enbled servers it looks like
> >> ip6tables does not assemble udp packets before filtering takes place.
> >> This results in fragments being dropped.
> > 
> > You need to have nf_defrag_ipv6 loaded for automatic defragmentation. 
> > There are only a few components that depend on it - nf_conntrack and 
> > TPROXY, so it may not be autoloaded if you do not use either.
> > --
> > To unsubscribe from this list: send the line "unsubscribe netfilter-devel" in
> > the body of a message to majordomo@vger.kernel.org
> > More majordomo info at  http://vger.kernel.org/majordomo-info.html
> 

-- 
Leo Baltus, internetbeheerder                         /\
NPO ICT Internet Services                            /NPO/\
Sumatralaan 45, 1217 GP Hilversum, Filmcentrum, west \  /\/
beheer@omroep.nl, 035-6773555                         \/

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: ip6tables breaks dnssec?
  2011-04-27 10:43   ` Ulrich Weber
  2011-04-27 10:56     ` Leo Baltus
@ 2011-04-27 11:22     ` Jan Engelhardt
  2011-04-27 11:41       ` Leo Baltus
                         ` (2 more replies)
  1 sibling, 3 replies; 10+ messages in thread
From: Jan Engelhardt @ 2011-04-27 11:22 UTC (permalink / raw)
  To: Ulrich Weber; +Cc: Leo Baltus, netfilter-devel

On Wednesday 2011-04-27 12:43, Ulrich Weber wrote:

>Each fragmented IPv6 packets will traverse netfilter separately,
>in contrast to IPv4, where its only one refragmented packet.

Not really. All fragments enter nf_hook_slow, be it IPv4 or IPv6.
It's just that nf_defrag - which is a netfilter module - collects and 
suppresses fragments before spitting out the unfragmented one.

>"ip6tables -A INPUT -j ACCEPT -p udp --dport 53" will only match the
>first fragment, where the UDP header can be found. To match the
>additional fragments, you have to insert these rules:
>
>ip6tables -I INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
>ip6tables -I OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

That will load nf_conntrack_ipv6, and because conntrack depends on 
nf_defrag_ipv6, will load that too. Once it is loaded, packets should 
be defragmented independetly of whether you actually use -m conntrack 
(or the obsolete -m state) or not.

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: ip6tables breaks dnssec?
  2011-04-27 11:22     ` Jan Engelhardt
@ 2011-04-27 11:41       ` Leo Baltus
  2011-05-06 14:05         ` Leo Baltus
  2011-04-27 11:43       ` Ulrich Weber
  2011-04-27 12:54       ` Stephen Clark
  2 siblings, 1 reply; 10+ messages in thread
From: Leo Baltus @ 2011-04-27 11:41 UTC (permalink / raw)
  To: Jan Engelhardt; +Cc: Ulrich Weber, netfilter-devel

Op 27/04/2011 om 13:22:57 +0200, schreef Jan Engelhardt:
> On Wednesday 2011-04-27 12:43, Ulrich Weber wrote:
> 
> >Each fragmented IPv6 packets will traverse netfilter separately,
> >in contrast to IPv4, where its only one refragmented packet.
> 
> Not really. All fragments enter nf_hook_slow, be it IPv4 or IPv6.
> It's just that nf_defrag - which is a netfilter module - collects and 
> suppresses fragments before spitting out the unfragmented one.
> 
> >"ip6tables -A INPUT -j ACCEPT -p udp --dport 53" will only match the
> >first fragment, where the UDP header can be found. To match the
> >additional fragments, you have to insert these rules:
> >
> >ip6tables -I INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
> >ip6tables -I OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
> 
> That will load nf_conntrack_ipv6, and because conntrack depends on 
> nf_defrag_ipv6, will load that too. Once it is loaded, packets should 
> be defragmented independetly of whether you actually use -m conntrack 
> (or the obsolete -m state) or not.

my /proc/config.gs says:
CONFIG_NF_CONNTRACK_IPV6=y
so it is already loaded

But is does not defrag.

Also I am a bit worried about using conntrack because of the high
volume dns queries tend to be which would generate a very large
connectiontracking table and/or system load.

-- 
Leo Baltus, internetbeheerder                         /\
NPO ICT Internet Services                            /NPO/\
Sumatralaan 45, 1217 GP Hilversum, Filmcentrum, west \  /\/
beheer@omroep.nl, 035-6773555                         \/

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: ip6tables breaks dnssec?
  2011-04-27 11:22     ` Jan Engelhardt
  2011-04-27 11:41       ` Leo Baltus
@ 2011-04-27 11:43       ` Ulrich Weber
  2011-04-27 12:54       ` Stephen Clark
  2 siblings, 0 replies; 10+ messages in thread
From: Ulrich Weber @ 2011-04-27 11:43 UTC (permalink / raw)
  To: Jan Engelhardt; +Cc: Ulrich Weber, Leo Baltus, netfilter-devel

On 04/27/2011 01:22 PM, Jan Engelhardt wrote:
> On Wednesday 2011-04-27 12:43, Ulrich Weber wrote:
> 
>> Each fragmented IPv6 packets will traverse netfilter separately,
>> in contrast to IPv4, where its only one refragmented packet.
> 
> Not really. All fragments enter nf_hook_slow, be it IPv4 or IPv6.
> It's just that nf_defrag - which is a netfilter module - collects and 
> suppresses fragments before spitting out the unfragmented one.

nf_ct_frag6_output() sends each fragment itself through netfilter.

Personally I don't like this and would rather see, that IPv6 behaves the
same way as IPv4, sending the unfragmented packet through netfilter...


Cheers
 Ulrich

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: ip6tables breaks dnssec?
  2011-04-27 11:22     ` Jan Engelhardt
  2011-04-27 11:41       ` Leo Baltus
  2011-04-27 11:43       ` Ulrich Weber
@ 2011-04-27 12:54       ` Stephen Clark
  2011-04-27 13:01         ` Jan Engelhardt
  2 siblings, 1 reply; 10+ messages in thread
From: Stephen Clark @ 2011-04-27 12:54 UTC (permalink / raw)
  To: Jan Engelhardt; +Cc: Ulrich Weber, Leo Baltus, netfilter-devel

On 04/27/2011 07:22 AM, Jan Engelhardt wrote:
> On Wednesday 2011-04-27 12:43, Ulrich Weber wrote:
>
>    
>> Each fragmented IPv6 packets will traverse netfilter separately,
>> in contrast to IPv4, where its only one refragmented packet.
>>      
> Not really. All fragments enter nf_hook_slow, be it IPv4 or IPv6.
> It's just that nf_defrag - which is a netfilter module - collects and
> suppresses fragments before spitting out the unfragmented one.
>
>    
>> "ip6tables -A INPUT -j ACCEPT -p udp --dport 53" will only match the
>> first fragment, where the UDP header can be found. To match the
>> additional fragments, you have to insert these rules:
>>
>> ip6tables -I INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
>> ip6tables -I OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
>>      
> That will load nf_conntrack_ipv6, and because conntrack depends on
> nf_defrag_ipv6, will load that too. Once it is loaded, packets should
> be defragmented independetly of whether you actually use -m conntrack
> (or the obsolete -m state) or not.
>    
Jan,

are you saying we should be using -m conntrack now instead of -m state 
and that -m state is going away?

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


-- 

"They that give up essential liberty to obtain temporary safety,
deserve neither liberty nor safety."  (Ben Franklin)

"The course of history shows that as a government grows, liberty
decreases."  (Thomas Jefferson)




^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: ip6tables breaks dnssec?
  2011-04-27 12:54       ` Stephen Clark
@ 2011-04-27 13:01         ` Jan Engelhardt
  0 siblings, 0 replies; 10+ messages in thread
From: Jan Engelhardt @ 2011-04-27 13:01 UTC (permalink / raw)
  To: Stephen Clark; +Cc: Ulrich Weber, Leo Baltus, netfilter-devel

On Wednesday 2011-04-27 14:54, Stephen Clark wrote:

> On 04/27/2011 07:22 AM, Jan Engelhardt wrote:
>> On Wednesday 2011-04-27 12:43, Ulrich Weber wrote:
>>
>>   
>>> Each fragmented IPv6 packets will traverse netfilter separately,
>>> in contrast to IPv4, where its only one refragmented packet.
>>>     
>> Not really. All fragments enter nf_hook_slow, be it IPv4 or IPv6.
>> It's just that nf_defrag - which is a netfilter module - collects and
>> suppresses fragments before spitting out the unfragmented one.
>>
>>   
>>> "ip6tables -A INPUT -j ACCEPT -p udp --dport 53" will only match the
>>> first fragment, where the UDP header can be found. To match the
>>> additional fragments, you have to insert these rules:
>>>
>>> ip6tables -I INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
>>> ip6tables -I OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
>>>     
>> That will load nf_conntrack_ipv6, and because conntrack depends on
>> nf_defrag_ipv6, will load that too. Once it is loaded, packets should
>> be defragmented independetly of whether you actually use -m conntrack
>> (or the obsolete -m state) or not.
>>   
> Jan,
>
> are you saying we should be using -m conntrack now instead of -m state and that
> -m state is going away?

-m state is old, redundant (since at least 2.6.12..), - and as such 
ignored whenever possible - but others think removing xt_state is too 
much a message to people..

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: ip6tables breaks dnssec?
  2011-04-27 11:41       ` Leo Baltus
@ 2011-05-06 14:05         ` Leo Baltus
  0 siblings, 0 replies; 10+ messages in thread
From: Leo Baltus @ 2011-05-06 14:05 UTC (permalink / raw)
  To: Jan Engelhardt; +Cc: Ulrich Weber, netfilter-devel

Op 27/04/2011 om 13:41:39 +0200, schreef Leo Baltus:
> Op 27/04/2011 om 13:22:57 +0200, schreef Jan Engelhardt:
> > On Wednesday 2011-04-27 12:43, Ulrich Weber wrote:
> > 
> > >Each fragmented IPv6 packets will traverse netfilter separately,
> > >in contrast to IPv4, where its only one refragmented packet.
> > 
> > Not really. All fragments enter nf_hook_slow, be it IPv4 or IPv6.
> > It's just that nf_defrag - which is a netfilter module - collects and 
> > suppresses fragments before spitting out the unfragmented one.
> > 
> > >"ip6tables -A INPUT -j ACCEPT -p udp --dport 53" will only match the
> > >first fragment, where the UDP header can be found. To match the
> > >additional fragments, you have to insert these rules:
> > >
> > >ip6tables -I INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
> > >ip6tables -I OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
> > 
> > That will load nf_conntrack_ipv6, and because conntrack depends on 
> > nf_defrag_ipv6, will load that too. Once it is loaded, packets should 
> > be defragmented independetly of whether you actually use -m conntrack 
> > (or the obsolete -m state) or not.
> 
> my /proc/config.gs says:
> CONFIG_NF_CONNTRACK_IPV6=y
> so it is already loaded
> 
> But is does not defrag.
> 

So is this a bug? Given the state ip6tables is now in the only way to
make defrag work is to set '--state RELATED,ESTABLISHED'. As I
understand it, this should not be the case, right?

> Also I am a bit worried about using conntrack because of the high
> volume dns queries tend to be which would generate a very large
> connectiontracking table and/or system load.
> 

I am not sure if this is true or not for fragments, but for heavy tcp
traffic (http) we use raw/NOTRACK to avoid conntrack, how would that work
with ip6tables considering heavy fragmented (http or dns) traffic?

-- 
Leo Baltus, internetbeheerder                         /\
NPO ICT Internet Services                            /NPO/\
Sumatralaan 45, 1217 GP Hilversum, Filmcentrum, west \  /\/
beheer@omroep.nl, 035-6773555                         \/

^ permalink raw reply	[flat|nested] 10+ messages in thread

end of thread, other threads:[~2011-05-06 14:05 UTC | newest]

Thread overview: 10+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2011-04-27  8:57 ip6tables breaks dnssec? Leo Baltus
2011-04-27 10:08 ` Jan Engelhardt
2011-04-27 10:43   ` Ulrich Weber
2011-04-27 10:56     ` Leo Baltus
2011-04-27 11:22     ` Jan Engelhardt
2011-04-27 11:41       ` Leo Baltus
2011-05-06 14:05         ` Leo Baltus
2011-04-27 11:43       ` Ulrich Weber
2011-04-27 12:54       ` Stephen Clark
2011-04-27 13:01         ` Jan Engelhardt

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).