git: 829a69db855b - main - pf: change pf_route so pf only runs when packets enter and leave the stack.
Kubilay Kocak
koobs at FreeBSD.org
Tue Apr 6 00:01:15 UTC 2021
On 5/04/2021 9:44 pm, Kristof Provost wrote:
> The branch main has been updated by kp:
>
> URL: https://cgit.FreeBSD.org/src/commit/?id=829a69db855b48ff7e8242b95e193a0783c489d9
>
> commit 829a69db855b48ff7e8242b95e193a0783c489d9
> Author: Kristof Provost <kp at FreeBSD.org>
> AuthorDate: 2021-04-02 10:23:42 +0000
> Commit: Kristof Provost <kp at FreeBSD.org>
> CommitDate: 2021-04-05 07:57:06 +0000
>
> pf: change pf_route so pf only runs when packets enter and leave the stack.
>
> before this change pf_route operated on the semantic that pf runs
> when packets go over an interface, so when pf_route changed which
> interface the packet was on it would run pf_test again. this change
> changes (restores) the semantic that pf is only supposed to run
> when packets go in or out of the network stack, even if route-to
> is responsibly for short circuiting past the network stack.
>
> just to be clear, for normal packets (ie, those not touched by
> route-to/reply-to/dup-to), there isn't a difference between running
> pf when packets enter or leave the stack, or having pf run when a
> packet goes over an interface.
>
> the main reason for this change is that running the same packet
> through pf multiple times creates confusion for the state table.
> by default, pf states are floating, meaning that packets are matched
> to states regardless of which interface they're going over. if a
> packet leaving on em0 is rerouted out em1, both traversals will end
> up using the same state, which at best will make the accounting
> look weird, or at worst fail some checks in the state and get
> dropped.
>
> another reason for this commit is is to make handling of the changes
> that route-to makes consistent with other changes that are made to
> packet. eg, when nat is applied to a packet, we don't run pf_test
> again with the new addresses.
>
> the main caveat with this diff is you can't have one rule that
> pushes a packet out a different interface, and then have a rule on
> that second interface that NATs the packet. i'm not convinced this
> ever worked reliably or was used much anyway, so we don't think
> it's a big concern.
>
> discussed with many, with special thanks to bluhm@, sashan@ and
> sthen@ for weathering most of that pain.
> ok claudio@ sashan@ jmatthew@
>
> Obtained from: OpenBSD
> MFC after: 2 weeks
> Sponsored by: Rubicon Communications, LLC ("Netgate")
> Differential Revision: https://reviews.freebsd.org/D29554
Relnotes: Yes
For the rule semantics change?
> ---
> sys/netpfil/pf/pf.c | 4 ++--
> 1 file changed, 2 insertions(+), 2 deletions(-)
>
> diff --git a/sys/netpfil/pf/pf.c b/sys/netpfil/pf/pf.c
> index 50bf4b3871c5..5b41be4ad683 100644
> --- a/sys/netpfil/pf/pf.c
> +++ b/sys/netpfil/pf/pf.c
> @@ -5549,7 +5549,7 @@ pf_route(struct mbuf **m, struct pf_krule *r, int dir, struct ifnet *oifp,
> if (ifp == NULL)
> goto bad;
>
> - if (oifp != ifp) {
> + if (dir == PF_IN) {
> if (pf_test(PF_OUT, 0, ifp, &m0, inp) != PF_PASS)
> goto bad;
> else if (m0 == NULL)
> @@ -5738,7 +5738,7 @@ pf_route6(struct mbuf **m, struct pf_krule *r, int dir, struct ifnet *oifp,
> if (ifp == NULL)
> goto bad;
>
> - if (oifp != ifp) {
> + if (dir == PF_IN) {
> if (pf_test6(PF_OUT, PFIL_FWD, ifp, &m0, inp) != PF_PASS)
> goto bad;
> else if (m0 == NULL)
> _______________________________________________
> dev-commits-src-main at freebsd.org mailing list
> https://lists.freebsd.org/mailman/listinfo/dev-commits-src-main
> To unsubscribe, send any mail to "dev-commits-src-main-unsubscribe at freebsd.org"
>
More information about the dev-commits-src-main
mailing list