On Sun, Sep 03, 2023 at 11:00:56PM +0200, Alexandr Nedvedicky wrote: > Hello, > > On Sun, Sep 03, 2023 at 09:26:29PM +0200, Florian Obser wrote: > > FYI, I'm not using sloppy, and I don't have a network with asymmetric > > routing > > at the moment. I only remembered that we used sloppy for a while at my > > previous job. I think we settled on no-state because it was faster than > > sloppy and less hastle. > > > > From my perspective 'no state' vs. 'keep state (sloppy)' are valid > approaches. > Both are equally good. Perhaps 'no state' option keeps code bit more > simple. > Because if we will go with sloppy state, then we need to include a small > tweak to pf_test_rule() too, so 'keep state' (and nat-to) are not ignored.
I do not think that ICMP error messages should create a state. If the rule is sloppy, just pass them. nat-to does not work in this case, but I would ignore that. If you use sloppy states, don't be surprized about strange effects in corner cases. First two chunks are OK bluhm@, but not the third. > Updated diff is below. > > thanks and > regards > sashan > > --------8<---------------8<---------------8<------------------8<-------- > diff --git a/sys/net/pf.c b/sys/net/pf.c > index 4f0fc3f91a9..6f7b782612c 100644 > --- a/sys/net/pf.c > +++ b/sys/net/pf.c > @@ -4148,6 +4148,10 @@ enter_ruleset: > (r->rule_flag & PFRULE_STATESLOPPY) == 0 && > ctx->icmp_dir != PF_IN), > TAILQ_NEXT(r, entries)); > + /* icmp packet must match existing state */ > + PF_TEST_ATTRIB(r->keep_state && ctx->state_icmp && > + (r->rule_flag & PFRULE_STATESLOPPY) == 0, > + TAILQ_NEXT(r, entries)); > break; > > case IPPROTO_ICMPV6: > @@ -4165,6 +4169,10 @@ enter_ruleset: > ctx->icmp_dir != PF_IN && > ctx->icmptype != ND_NEIGHBOR_ADVERT), > TAILQ_NEXT(r, entries)); > + /* icmp packet must match existing state */ > + PF_TEST_ATTRIB(r->keep_state && ctx->state_icmp && > + (r->rule_flag & PFRULE_STATESLOPPY) == 0, > + TAILQ_NEXT(r, entries)); > break; > > default: > @@ -4469,8 +4477,7 @@ pf_test_rule(struct pf_pdesc *pd, struct pf_rule **rm, > struct pf_state **sm, > > action = PF_PASS; > > - if (pd->virtual_proto != PF_VPROTO_FRAGMENT > - && !ctx.state_icmp && r->keep_state) { > + if (pd->virtual_proto != PF_VPROTO_FRAGMENT && r->keep_state) { > > if (r->rule_flag & PFRULE_SRCTRACK && > pf_insert_src_node(&ctx.sns[PF_SN_NONE], r, PF_SN_NONE,