All of lore.kernel.org
 help / color / mirror / Atom feed
From: Felix Kaechele <felix@kaechele.ca>
To: Kristian Evensen <kristian.evensen@gmail.com>
Cc: Pablo Neira Ayuso <pablo@netfilter.org>,
	Netfilter Development Mailing list 
	<netfilter-devel@vger.kernel.org>
Subject: Re: [PATCH 08/13] netfilter: ctnetlink: Resolve conntrack L3-protocol flush regression
Date: Tue, 25 Jun 2019 10:45:01 -0400	[thread overview]
Message-ID: <04ab8f2d-2b50-8d99-2fa1-837b7acaf417@kaechele.ca> (raw)
In-Reply-To: <CAKfDRXjun=cVovtn70jxwTc9pa0hhDHUSdZjLHJC1Xw2AMG+rA@mail.gmail.com>

On 2019-06-25 7:52 a.m., Kristian Evensen wrote:

> I am sorry for the trouble that my change has caused.

No worries. I appreciate you taking the time helping me out.

>> this patch is giving me some trouble as it breaks deletion of conntrack
>> entries in software that doesn't set the version flag to anything else
>> but 0.
> 
> I might be a bit slow, but I have some trouble understanding this
> sentence. Is what you are saying that software that sets version to
> anything but 0 breaks?

Yeah, definitely not my best work of prose ;-)
What I was trying to say is: Any software that remains with the version 
set to 0 will not work. By association, since libnetfilter_conntrack 
explicitly sets the version to 0, anything that uses 
libnetfilter_conntrack will be unable to delete a specific entry in the 
conntrack table.

> According to the discussion triggered by the
> patch adding the feature that we fix here (see the thread [PATCH
> 07/31] netfilter: ctnetlink: Support L3 protocol-filter on flush),
> using the version field is the correct solution. Pablo wrote:
> 
>> The version field was meant to deal with this case.
>>
>> It has been not unused so far because we had no good reason.
> 
> So I guess Nicholas worry was correct, that there are applications
> that leave version uninitialized and they trigger the regression. I
> will let others decide if not setting version counts as a regression
> or incorrect API usage. If an uninitialized version counts as a
> regression, I am fine with reverting and will try to come up with
> another approach. However, I guess we now might have users that depend
> on the new behavior of flush as well.

I believe that's not the issue here.

So here's what my understanding is of what is happening:

Let's go back to that line of code:

u_int8_t u3 = nfmsg->version ? nfmsg->nfgen_family : AF_UNSPEC;

Just to make sure I understand this correctly: If the version is set to 
0 the address family (l3proto) will be set to AF_UNSPEC regardless of 
what the actual l3proto was set to by the user of the API.
It is only set to the value chosen by the if the version is set to a 
non-null value.
We assume that all clients that require the old behaviour set their 
version to 0, since that's the only valid value to set it to at this 
point anyway.

The problem that arises from this:
When creating a conntrack entry with libnetfilter_conntrack it will 
happly accept the address family you supply. Let's assume we create an 
entry where AF_INET is supplied.
The entry will be created with AF_INET as it's l3proto. Hence, the tuple 
and its hash are only going to be matched upon search if the l3proto 
matches as well.

Now, when you try to delete an entry using libnetfilter_conntrack it 
will explicitly set it's version to 0 in the process of creating the 
message to the API, as it usually does.
Therefor the kernel, under the new behaviour, will disregard the l3proto 
and set AF_UNSPEC instead. By doing this we have created a new tuple 
with a hash that is different from the hash of the tuple that was used 
when creating the conntrack entry, since it was initially created with 
AF_INET, not AF_UNSPEC.
Therefor the search will turn up with no results as the tuples we 
actually want to match are now different, after AF_INET was yanked and 
AF_UNSPEC was put in.
Because the search doesn't find the entry we're trying to delete it will 
return ENOENT and our entry will not be deleted.

I hope my description is somewhat comprehensible. I'm basically thinking 
out loud here.

I have to admit that I also don't know how to approach this in a way 
that will not break userspace but also satisfy the requirements of users 
that would like L3 proto filtering.
I believe the changes required to make it work would also need to 
permeate into how searches are performed. Specifically it would need to 
include tuples with all possible l3protos when AF_UNSPEC is given, so we 
actually gather all entries regardless of l3proto. I believe that this 
is the intended behaviour, right?

Regards,
   Felix

  reply	other threads:[~2019-06-25 14:45 UTC|newest]

Thread overview: 30+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-05-13  9:56 [PATCH 00/13] Netfilter fixes for net Pablo Neira Ayuso
2019-05-13  9:56 ` [PATCH 01/13] netfilter: nf_tables: delay chain policy update until transaction is complete Pablo Neira Ayuso
2019-05-13  9:56 ` [PATCH 02/13] netfilter: nft_flow_offload: add entry to flowtable after confirmation Pablo Neira Ayuso
2019-05-13  9:56 ` [PATCH 03/13] netfilter: nf_flow_table: fix netdev refcnt leak Pablo Neira Ayuso
2019-05-13  9:56 ` [PATCH 04/13] netfilter: nf_flow_table: check ttl value in flow offload data path Pablo Neira Ayuso
2019-05-13  9:56 ` [PATCH 05/13] netfilter: nf_conntrack_h323: restore boundary check correctness Pablo Neira Ayuso
2019-05-13  9:56 ` [PATCH 06/13] netfilter: nf_tables: fix base chain stat rcu_dereference usage Pablo Neira Ayuso
2019-05-13  9:56 ` [PATCH 07/13] netfilter: nf_flow_table: fix missing error check for rhashtable_insert_fast Pablo Neira Ayuso
2019-05-13  9:56 ` [PATCH 08/13] netfilter: ctnetlink: Resolve conntrack L3-protocol flush regression Pablo Neira Ayuso
2019-06-24  3:44   ` Felix Kaechele
2019-06-24 23:58     ` Pablo Neira Ayuso
2019-06-25  3:02       ` Felix Kaechele
2019-06-25  8:08         ` Pablo Neira Ayuso
2019-06-25 11:33           ` Felix Kaechele
2019-06-25 11:52             ` Kristian Evensen
2019-06-25 14:45               ` Felix Kaechele [this message]
2019-06-25 15:08                 ` Kristian Evensen
2019-06-25 16:16                   ` Felix Kaechele
2019-06-25 19:45                     ` Pablo Neira Ayuso
2019-06-25 15:45                 ` Kristian Evensen
2019-06-25 19:40               ` Pablo Neira Ayuso
2019-06-25 19:41             ` Pablo Neira Ayuso
2019-06-25 15:01       ` Nicolas Dichtel
2019-06-25 19:44         ` Pablo Neira Ayuso
2019-05-13  9:56 ` [PATCH 09/13] netfilter: nf_conntrack_h323: Remove deprecated config check Pablo Neira Ayuso
2019-05-13  9:56 ` [PATCH 10/13] netfilter: nf_flow_table: do not flow offload deleted conntrack entries Pablo Neira Ayuso
2019-05-13  9:56 ` [PATCH 11/13] netfilter: ebtables: CONFIG_COMPAT: reject trailing data after last rule Pablo Neira Ayuso
2019-05-13  9:56 ` [PATCH 12/13] netfilter: nf_tables: remove NFT_CT_TIMEOUT Pablo Neira Ayuso
2019-05-13  9:56 ` [PATCH 13/13] netfilter: nf_tables: correct NFT_LOGLEVEL_MAX value Pablo Neira Ayuso
2019-05-13 16:02 ` [PATCH 00/13] Netfilter fixes for net David Miller

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=04ab8f2d-2b50-8d99-2fa1-837b7acaf417@kaechele.ca \
    --to=felix@kaechele.ca \
    --cc=kristian.evensen@gmail.com \
    --cc=netfilter-devel@vger.kernel.org \
    --cc=pablo@netfilter.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.