Re: named counters vs flush ruleset

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

 



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.

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; }

...
# 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?

Cheers,
Victor

--
----------------------------------------------
Victor Julien
https://www.inliniac.net/
PGP: https://www.inliniac.net/victorjulien.asc
----------------------------------------------





[Index of Archives]     [Linux Netfilter Development]     [Linux Kernel Networking Development]     [Netem]     [Berkeley Packet Filter]     [Linux Kernel Development]     [Advanced Routing & Traffice Control]     [Bugtraq]

  Powered by Linux