On Tue, 23 Jul 2019 19:12:23 +1000 "Trent W. Buck" <trentbuck@xxxxxxxxx> wrote: > (I hope these questions aren't too stupid for this list!) > > A stateful firewall ruleset usually starts like: > > ct state established,related accept > ct state invalid drop > # Hooray, 99% of packets are now decided; > # we only need to think hard the ones in ct state new! Personally, I drop INVALID packets in PREROUTING in order to waste no more CPU cycles than are necessary because we already know that that packet cannot be processed. > > If you want to guard against a coworker "accidentally" adding NOTRACK in > raw, you might tweak that to drop "ct untracked" as well: > > ct state established,related accept > ct state != new drop > > But nftables has these "verdict map" things now: > > ct state vmap { established:accept, related:accept, invalid:drop } > > Is that "better" than the original? > It's one less rule, so it ought to be more efficient, right? > > One obvious downside is you lose the ability to counter/log/reject the > ct state invalid packets, because those aren't valid in verdict_expr. > > > Why is the original allowed to have "established,related" without braces? > [UPDATE: answered below] > > I'm a little bit worried because "nft describe ct state" looks like a > list of flags (powers of two), and in parser_bison.y I don't understand > ct_expr, but set_flag_list is using a comma as a bitwise OR. > > Can a packet be *both* established and related at the same time? 'RELATED' is the first ('NEW') packet of a conn that has been determined to be related to an existing conn. As far as I know, once a conn transitions from 'RELATED' to 'ESTABLISHED', the system loses all knowledge that the conn was ever 'RELATED' in the first place. I mention this because I've never been able to determine if netfilter will close/terminate 'RELATED' conns when it closes/terminates the master. For example, if netfilter terminates an FTP control conn, does it also terminate data conns that were 'RELATED' to that control conn? > > If so, is "ct state established,related" matching any packet that has > established or related *OR BOTH*? > > If so, does that mean it will accept some packets that my vmap (above) won't? > > The parser won't accept "{related,established: accept}" in a vmap, but > it will accept a pipe. Does this has the same meaning as the original > pair of rules? > > ct state vmap { invalid : drop, established | related : accept } > > I think so, because the pipe comes back out as a comma here: > > # nft add rule 'inet x y ct state established|related accept' > # nft list chain inet x y > table inet x > chain y { > ct state established,related accept > } > } > > Oh using the English word "or" is probably clearer, at least for > anglophones: > > ct state established or related accept > ct state vmap { established or related: accept, invalid: drop } > > The equivalence of "or" and "|" and "," --- except inside a set/map --- > wasn't obvious to me from the nft manpage (as at 0.9.1). I "caught on" > because equivalences like "ne" and "!=" were mentioned here: > https://wiki.nftables.org/wiki-nftables/index.php/Building_rules_through_expressions > (no bitwise operators there, though) > > > PS: AFAICT if a vmap doesn't match, the rule doesn't match, so > processing just carries on to the next rule. Is there a way to have a > "default value" in the vmap? e.g. > > ct state vmap { established or related: accept, > new: continue, > OTHERWISE: return } > > I can't see it in verdict_map_list_expr or in the manpage. > > PPS: my earlier "chain comment" question, I now realize the "NOOP rule" > I wanted is just "continue", e.g. > > table inet x { > chain y { > continue comment "This chain is the common start for INPUT and FORWARD." > continue comment "It allows the things you (almost always) want." > ct state vmap { established or related: accept; invalid: drop } > iiftype loopback accept > icmp type { ... } accept > icmpv6 type { ... } accept > } > } >