netfilter-devel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Florian Westphal <fw@strlen.de>
To: Christoph Anton Mitterer <mail@christoph.anton.mitterer.name>
Cc: netfilter-devel@vger.kernel.org, pablo@netfilter.org
Subject: Re: [PATCH v2 2/7] doc: fix/improve documentation of verdicts
Date: Sat, 18 Oct 2025 15:25:10 +0200	[thread overview]
Message-ID: <aPOVNvw1t8lZT88o@strlen.de> (raw)
In-Reply-To: <11427578d25220212d40533ed4a77652acefcc26.camel@christoph.anton.mitterer.name>

Christoph Anton Mitterer <mail@christoph.anton.mitterer.name> wrote:
> On Wed, 2025-10-15 at 13:42 +0200, Florian Westphal wrote:
> > Christoph Anton Mitterer <mail@christoph.anton.mitterer.name> wrote:
> > > +*accept*:: Terminate the evaluation of the current base chain (and
> > > any regular
> > > +chains called from it) and accept the packet from their point of
> > > view.
> > 
> > Suggest:
> > *accept*:: Terminate the evaluation of the chain.  Evaluation
> > continues in the next base chain, if any.
> 
> What I like about it, is that it avoids the slightly awkward "current
> base chain (and any regular chains called from it)" construct...
> 
> What I'm neutral about: Strictly speaking, it does not mention whether
> evaluation of any "parent" chains is also terminated.
> You try to solve that by saying "Evaluation continues in the next base
> chain"... and it is indeed kinda reasonable that all from the current
> base chain are then stopped... but a weird system could in principle
> continue with the next base chain, and eventually go back to the
> previous.

But this should describe netfilter and not something else :-)

> (Just like originally I completely misunderstood how return works when
> goto was involved).
> 
> What I like less about it, is that is misses this additional context of
> "acceptance is only with respect to those chains".

Hm, I think "Terminates the evaluation of the chain" is pretty clear.
And "Evaluation continues in ..." is also clear, packet is allowed to
move on in the processing pipeline.

> Yes it can be deduced from the following sentence ("The packet may
> however still be dropped by either")... and meanwhile, where I
> (hopefully ;-) ) understand how it works, that seems enough, but for a
> pure beginner it's IMO better to give such context and rather reinforce
> things twice in different words.

> What would you think about:
> 1st:
>    Either:
> Terminate the evaluation of the current chain as well as any chains
> from which that was called and accept the packet with respect to the
> base chain of these.
> or:
> Terminate the evaluation of the current chain as well as any chains in
> the call stack and accept the packet with respect to the base chain of
> these.

It correct but it sounds overly complicated IMO.

> 2nd and also replacing:
> > The packet may however still be dropped by either another chain with a higher
> > priority of the same hook or any chain of a later hook.

I would be fine with that, even though I also consider it too verbose.

> Evaluation continues in the next base chain (of higher or possibly
> equal priority from the same hook or of any priority from a later
> hook), if any.


Hmm, I am not sure.  Is it really needed to mention all of this?
Packet will just move on in the pipeline, it would be weird to assume
that forward-accepted packet would e.g. bypass postrouting.

> This means the packet can still be dropped in that next base chain as
> well as any regular chain (directly or indirectly) called from it.

... or that it moes to the next base chain but that base chain ignores
jumps to user-defined chains.

Your suggestions aren't wrong of course but it seems very repetitive to
me.

> > > +*drop*:: Terminate ruleset evaluation and drop the packet. This
> > > occurs
> > > +instantly, no further chains of any hooks are evaluated and it is
> > > thus not
> > > +possible to again accept the packet in a higher priority or later
> > > chain, as
> > > +those are not evaluated anymore for the packet.
> > 
> > Can this be compacted a bit?  I feel this is a tad too verbose.
> > 
> > *drop*: Packet is dropped immediately.  No futher evaluation of any
> > kind.
> > 
> > I think thats enough, no?
> 
> Uhm... I made it a perhaps bit extra verbose, mostly because we have
> terms like "terminal statement/verdict", where not all of them are
> really ultimately terminal.
> 
> What about the following compromise: O;-)
> 
> *drop*: Immediately drop the packet and terminate ruleset evaluation.
> This means no further evaluation of any chains and it's thus - unlike
> with  *accept* - not possible to again change the ultimate fate of the
> packet in any later chain.

Thats fine.

> What I'd at least think would be nice to have is to re-iterate on that
> conceptual difference between accept (may be overruled) and drop (is
> ultimate).

Yes, I understand that some people see it that way.

I see netfilter as a pipeline, where packet moves along a certain path,
e.g. prerouting, forward, postrouting or prerouting -> input.

accept is just a "move along", whereas drop stops the packet dead in its
tracks.

nftables is just a "user visible" part that allows to customize
the move-along-or-not decisions.

Hence, this "overrule old decision" idea doesn't apply.

But I can see that others may have a different concept of how
this all works under the hood.

But I have no idea how to best describe this let alone make it
clear that you can't back out of a "drop" decision.

> > > +All the above applies analogously to statements that imply a
> > > verdict:
> > > +*redirect*, *dnat*, *snat* and *masquerade* internally issue
> > > eventually an
> > > +*accept* verdict.
> > 
> > You can remove 'eventually'.
> 
> > > +*reject* and *synproxy* internally issue eventually a *drop*
> > > verdict.
> > 
> > Same.
> 
> The idea of that was a slight indication that these statements do:
> <other things> + accept|drop.
> 
> Admittedly eventually isn't really perfect …

OK, never mind. I have no strong opinion here.

> 
> > > +For example, a *reject* also immediately terminates the evaluation
> > > of the
> > > +current rule, overrules any *accept* from any other chains
> > 
> > No, not really.  There is no *overrule*.  We don't keep any 'verdict
> > state'.  There is no difference between 'drop' in the first rule of
> > the
> > first ever base chain or a drop somewhere later in the pipeline,
> > aside
> > from side effects from other matching expressions.
> 
> Well first, whether you keep an internal verdict state or not... isn't
> that again some implementation detail which here not really matters for
> the user's understanding of how evaluation works?

I hope my comments above wrt. netfilter pipeline make sense and answer
this question.

> > I would suggest:
> > For example, *reject* is like *drop*, but will attempt to send a
> > error
> > reply packet back to the sender before doing so.
> 
> I mean I'm open to change, but what I think should in one form or
> another go in, is explicitly reinforcing that reject has the same
> "power" like drop, i.e. it can render any further accepts (of other
> base chains) moot.

Hmm, I feel there is a need to document the netfilter pipeline better.

Perhaps we should add a netfilter man page document and
ship that too to explain this "move on" thing that accept does behind
the scenes?

> That's what I mean with respect to "overruling" (i.e. and previous
> accept).

Yes, I understand that.

> You're proposal rather describes the side effects of *reject* which are
> however IMO not really relevant with respect to overall ruleset
> evaluation.

Yes, its not relevant, in eval terms reject and drop are the same.

> > > +overruled, while the various NAT statements may be overruled by
> > > other *drop*
> > > +verdicts respectively statements that imply this.
> > 
> > There is no overrule.  I would not mention NAT at all here.
> > *accept* documentation already says that later chains in the pipeline
> > can drop the packet (and so could the traffic scheduler, qdisc, NIC,
> > network ...)
> 
> Like above... the idea here was again to reinforce that the statements
> which internally issue an accept, have the same "weakness" as accept
> itself, i.e. they're not ultimate and any later drop/reject/similar may
> "overrule" them.

I wonder where the idea that "accept" is a kind of magic teleporter that
just fast-forwards a packet to the socket or NIC came from...

This isn't the case even in old ipchains.

> Any other ideas how include these two points? At least I personally
> rather think that the actual side effect of "but will attempt to send a
> error reply packet back to the sender" is rather not that interesting
> with respect to the overall semantics of evaluation.

Correct, it should be in the REJECT STATEMENT section only.

> I think it makes no sense to spam the list with a v3 until I've got
> your opinions on all the above points.... so I'm waiting for that and
> the make a v3. :-)

I suggest to send a smaller v3 first, with the less "controversial"
stuff.  Patch 3 seems ready to go for instance.

Then, once thats in, revisit this patch in a (rebased and smaller) v4.

There is nothing wrong with getting this merged in smaller batches
over a longer period.

  reply	other threads:[~2025-10-18 13:25 UTC|newest]

Thread overview: 63+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-09-25  0:07 nft manpage/wiki issues and improvement ideas Christoph Anton Mitterer
2025-09-25  7:35 ` Pablo Neira Ayuso
2025-09-25 20:37   ` Christoph Anton Mitterer
2025-09-26  1:52   ` [PATCH 0/7] doc: miscellaneois improvements Christoph Anton Mitterer
2025-09-26  1:52     ` [PATCH 1/7] doc: clarify evaluation of chains Christoph Anton Mitterer
2025-09-26  1:52     ` [PATCH 2/7] doc: fix/improve documentation of verdicts Christoph Anton Mitterer
2025-09-30 10:50       ` Florian Westphal
2025-10-02 14:50         ` Christoph Anton Mitterer
2025-10-02 15:21           ` Florian Westphal
2025-10-10 23:06             ` Christoph Anton Mitterer
2025-09-26  1:52     ` [PATCH 3/7] doc: minor improvements with respect to the term “ruleset” Christoph Anton Mitterer
2025-09-26  1:52     ` [PATCH 4/7] doc: add overall description of the ruleset evaluation Christoph Anton Mitterer
2025-09-30 11:50       ` Florian Westphal
2025-10-10 23:07         ` Christoph Anton Mitterer
2025-09-26  1:52     ` [PATCH 5/7] doc: add some more documentation on bitmasks Christoph Anton Mitterer
2025-09-30 11:51       ` Florian Westphal
2025-09-30 11:53         ` Florian Westphal
2025-09-26  1:52     ` [PATCH 6/7] doc: describe include’s collation order to be that of the C locale Christoph Anton Mitterer
2025-09-26  1:52     ` [PATCH 7/7] doc: describe how values match sets Christoph Anton Mitterer
2025-09-26  2:32   ` nft manpage/wiki issues and improvement ideas Christoph Anton Mitterer
2025-10-11  0:23 ` [PATCH v2 0/7] doc: miscellaneous improvements Christoph Anton Mitterer
2025-10-11  0:23   ` [PATCH v2 1/7] doc: clarify evaluation of chains Christoph Anton Mitterer
2025-10-15 11:46     ` Florian Westphal
2025-10-11  0:23   ` [PATCH v2 2/7] doc: fix/improve documentation of verdicts Christoph Anton Mitterer
2025-10-15 11:42     ` Florian Westphal
2025-10-17  2:30       ` Christoph Anton Mitterer
2025-10-18 13:25         ` Florian Westphal [this message]
2025-10-19  0:11           ` Christoph Anton Mitterer
2025-10-11  0:23   ` [PATCH v2 3/7] doc: minor improvements with respect to the term “ruleset” Christoph Anton Mitterer
2025-10-15 11:51     ` Florian Westphal
2025-10-11  0:24   ` [PATCH v2 4/7] doc: add overall description of the ruleset evaluation Christoph Anton Mitterer
2025-10-20  9:39     ` Florian Westphal
2025-10-20 23:48       ` Christoph Anton Mitterer
2025-10-11  0:24   ` [PATCH v2 5/7] doc: add some more documentation on bitmasks Christoph Anton Mitterer
2025-10-18 13:32     ` Florian Westphal
2025-10-19  1:31       ` Christoph Anton Mitterer
2025-10-11  0:24   ` [PATCH v2 6/7] doc: describe include’s collation order to be that of the C locale Christoph Anton Mitterer
2025-10-18 13:35     ` Florian Westphal
2025-10-18 22:13       ` Christoph Anton Mitterer
2025-10-11  0:24   ` [PATCH v2 7/7] doc: describe how values match sets Christoph Anton Mitterer
2025-10-18 13:51     ` Florian Westphal
2025-10-19  1:50       ` Christoph Anton Mitterer
2025-10-19  1:38 ` [PATCH v3 0/6] doc: miscellaneous improvements Christoph Anton Mitterer
2025-10-19  1:38   ` [PATCH v3 1/6] doc: fix/improve documentation of verdicts Christoph Anton Mitterer
2025-10-20  9:28     ` Florian Westphal
2025-10-20 22:13       ` Christoph Anton Mitterer
2025-10-19  1:38   ` [PATCH v3 2/6] doc: minor improvements with respect to the term “ruleset” Christoph Anton Mitterer
2025-10-20  9:04     ` Florian Westphal
2025-10-19  1:38   ` [PATCH v3 3/6] doc: add overall description of the ruleset evaluation Christoph Anton Mitterer
2025-10-19  1:38   ` [PATCH v3 4/6] doc: add more documentation on bitmasks and sets Christoph Anton Mitterer
2025-10-20  9:06     ` Florian Westphal
2025-10-20 21:57       ` Christoph Anton Mitterer
2025-10-20 22:18         ` Florian Westphal
2025-10-20 23:51           ` Christoph Anton Mitterer
2025-10-19  1:38   ` [PATCH v3 5/6] doc: describe include’s collation order to be that of the C locale Christoph Anton Mitterer
2025-10-19  1:38   ` [PATCH v3 6/6] doc: minor improvements the `reject` statement Christoph Anton Mitterer
2025-10-20 23:49 ` [PATCH v4 0/5] doc: miscellaneous improvements Christoph Anton Mitterer
2025-10-20 23:49   ` [PATCH v4 1/5] doc: fix/improve documentation of verdicts Christoph Anton Mitterer
2025-10-20 23:49   ` [PATCH v4 2/5] doc: add overall description of the ruleset evaluation Christoph Anton Mitterer
2025-10-20 23:49   ` [PATCH v4 3/5] doc: add more documentation on bitmasks and sets Christoph Anton Mitterer
2025-10-20 23:49   ` [PATCH v4 4/5] doc: describe include’s collation order to be that of the C locale Christoph Anton Mitterer
2025-10-20 23:49   ` [PATCH v4 5/5] doc: minor improvements the `reject` statement Christoph Anton Mitterer
2025-10-22 14:34     ` Florian Westphal

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=aPOVNvw1t8lZT88o@strlen.de \
    --to=fw@strlen.de \
    --cc=mail@christoph.anton.mitterer.name \
    --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 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).