From: Pablo Neira Ayuso <pablo@netfilter.org>
To: Victor Julien <lists@inliniac.net>
Cc: netfilter@vger.kernel.org
Subject: Re: named counters vs flush ruleset
Date: Wed, 26 Feb 2025 00:47:30 +0100 [thread overview]
Message-ID: <Z75WkjyCSmptettz@calendula> (raw)
In-Reply-To: <d33b9a31-2e67-4983-b1e2-549647256b3d@inliniac.net>
Hi Victor,
On Sun, Feb 09, 2025 at 11:58:56AM +0100, Victor Julien wrote:
> On 08-02-2025 22:49, Pablo Neira Ayuso wrote:
> > On Sat, Feb 08, 2025 at 03:35:27PM +0100, Victor Julien wrote:
> > > Hi all,
> > >
> > > I'm working on finally supporting nftables in Vuurmuur.
> > >
> > > In the iptables support, I have special rules per interface to get per iface
> > > packets and bytes. Essentially my tool reads the iptables -vnL output and
> > > parses all the things. When a user applies a ruleset change, Vuurmuur reads
> > > the most current values, constructs a new input file to `iptables-restore`
> > > and loads the rules. This works but is tedious, and also lacks some
> > > precision as we are not counting the packets/bytes while Vuurmuur is
> > > working.
> > >
> > > In the nftables support, I'm more or less looking at the same logic. The
> > > ruleset is build as a .nft file that is loaded with `nft -f`.
> > >
> > > Now I found the the named counter feature, and also the json output `nft -j
> > > list counters`. This combination seems perfect.
> > >
> > > I guess my main question is if we can make these counters persistent
> > > somehow. As part of the ruleset reload, I issue a `flush ruleset`, which
> > > also removes the counters.
> > >
> > > So can we make counters survive a `flush ruleset`, or is there a better way
> > > to load a new ruleset?
> >
> > Would it work for you to destroy all other existing objects (not the
> > table and counters) instead?
>
> Thanks Pablo. Here's what I'm thinking now:
>
> I create an additional table "vrmr_accounting"
>
> table ip vrmr_accounting {
> counter vrmr_enp1s0 {
> packets 17546 bytes 3901328
> }
>
> chain INPUT {
> type filter hook input priority -100; policy accept;
> iifname "enp1s0" counter name "vrmr_enp1s0" comment
> "lan-nic"
> }
>
> chain OUTPUT {
> type filter hook output priority dstnat; policy accept;
> oifname "enp1s0" counter name "vrmr_enp1s0"
> }
>
> chain FORWARD {
> type filter hook forward priority -100; policy accept;
> iifname "enp1s0" counter name "vrmr_enp1s0"
> oifname "enp1s0" counter name "vrmr_enp1s0"
> }
> }
>
> Then I create regular a regular filter table, where the normal rules are
> created. My assumption is that due to the lower priority value the
> `vrmr_accounting` table goes first in the processing.
I see, you are using a table that contains rules for metering only.
> In my reload instead of a `flush ruleset`, I do:
>
> # clear existing tables/rules
> destroy table ip filter
> ...
> add table ip filter
> add chain ip filter INPUT { type filter hook input priority 0; policy drop;
> }
> add chain ip filter OUTPUT { type filter hook output priority 0; policy
> drop; }
> add chain ip filter FORWARD { type filter hook forward priority 0; policy
> drop; }
Maybe you could use?
flush table ip filter
to leave the table and chain in place. Similar semantics to
iptables -F.
> ...
> # clear accounting chains (incl rules), but not the counter itself
> add table ip vrmr_accounting
> destroy chain ip vrmr_accounting INPUT
> destroy chain ip vrmr_accounting OUTPUT
> destroy chain ip vrmr_accounting FORWARD
> add chain ip vrmr_accounting INPUT { type filter hook input priority -100;
> policy accept; }
> add chain ip vrmr_accounting OUTPUT { type filter hook output priority -100;
> policy accept; }
> add chain ip vrmr_accounting FORWARD { type filter hook forward priority
> -100; policy accept; }
> ...
> add counter ip vrmr_accounting vrmr_enp1s0
> add rule ip vrmr_accounting INPUT iifname "enp1s0" counter name vrmr_enp1s0
> comment lan-nic
> ...
>
> This appears to leave the counters intact.
>
> Does this make sense to you?
I wonder if you could consolidate all in one single table:
flush table ip filter
leaves table, chain and counters intact.
next prev parent reply other threads:[~2025-02-25 23:47 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-02-08 14:35 named counters vs flush ruleset Victor Julien
2025-02-08 21:49 ` Pablo Neira Ayuso
2025-02-09 10:58 ` Victor Julien
2025-02-25 23:47 ` Pablo Neira Ayuso [this message]
2025-03-02 12:01 ` Victor Julien
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=Z75WkjyCSmptettz@calendula \
--to=pablo@netfilter.org \
--cc=lists@inliniac.net \
--cc=netfilter@vger.kernel.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