Re: [PATCH v3] netfilter: nf_tables: allow NFPROTO_INET in nft_(match/target)_validate()

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

 



Hi Pablo,

On Thu, Feb 22, 2024 at 10:52 AM Pablo Neira Ayuso <pablo@xxxxxxxxxxxxx> wrote:
>
> Hi Ignat,
>
> On Thu, Feb 22, 2024 at 10:33:08AM +0000, Ignat Korchagin wrote:
> > Commit d0009effa886 ("netfilter: nf_tables: validate NFPROTO_* family") added
> > some validation of NFPROTO_* families in the nft_compat module, but it broke
> > the ability to use legacy iptables modules in dual-stack nftables.
> >
> > While with legacy iptables one had to independently manage IPv4 and IPv6
> > tables, with nftables it is possible to have dual-stack tables sharing the
> > rules. Moreover, it was possible to use rules based on legacy iptables
> > match/target modules in dual-stack nftables.
> >
> > As an example, the program from [2] creates an INET dual-stack family table
> > using an xt_bpf based rule, which looks like the following (the actual output
> > was generated with a patched nft tool as the current nft tool does not parse
> > dual stack tables with legacy match rules, so consider it for illustrative
> > purposes only):
> >
> > table inet testfw {
> >   chain input {
> >     type filter hook prerouting priority filter; policy accept;
> >     bytecode counter packets 0 bytes 0 accept
> >   }
> > }
>
> This nft command does not exist in tree, this does not restores fine
> with nft -f. It provides a misleading hint to the reader.

I tried to clarify above that this is for illustrative purposes only -
just to give context about what we are trying to do, but do let me
know if you prefer a v4 with this completely removed.

> I am fine with restoring this because you use it, but you have to find
> a better interface than using nft_compat to achieve this IMO.

We're actually looking to restore the effort in [1] so some support
would be appreciated.

> The upstream consensus this far is not to expose nft_compat features
> through userspace nft. But as said, I understand and I am fine with
> restoring kernel behaviour so you can keep going with your out-of-tree
> patch.

Understood. There is no expectation from us that upstream userspace
nft should natively support this (as it didn't before d0009effa886),
but we can send the patch if consensus changes.

> Thanks !
>
> > After d0009effa886 ("netfilter: nf_tables: validate NFPROTO_* family") we get
> > EOPNOTSUPP for the above program.
> >
> > Fix this by allowing NFPROTO_INET for nft_(match/target)_validate(), but also
> > restrict the functions to classic iptables hooks.
> >
> > Changes in v3:
> >   * clarify that upstream nft will not display such configuration properly and
> >     that the output was generated with a patched nft tool
> >   * remove example program from commit description and link to it instead
> >   * no code changes otherwise
> >
> > Changes in v2:
> >   * restrict nft_(match/target)_validate() to classic iptables hooks
> >   * rewrite example program to use unmodified libnftnl
> >
> > Fixes: d0009effa886 ("netfilter: nf_tables: validate NFPROTO_* family")
> > Link: https://lore.kernel.org/all/Zc1PfoWN38UuFJRI@calendula/T/#mc947262582c90fec044c7a3398cc92fac7afea72 [1]
> > Link: https://lore.kernel.org/all/20240220145509.53357-1-ignat@xxxxxxxxxxxxxx/ [2]
> > Reported-by: Jordan Griege <jgriege@xxxxxxxxxxxxxx>
> > Signed-off-by: Ignat Korchagin <ignat@xxxxxxxxxxxxxx>
> > ---
> >  net/netfilter/nft_compat.c | 20 ++++++++++++++++++++
> >  1 file changed, 20 insertions(+)
> >
> > diff --git a/net/netfilter/nft_compat.c b/net/netfilter/nft_compat.c
> > index 1f9474fefe84..d3d11dede545 100644
> > --- a/net/netfilter/nft_compat.c
> > +++ b/net/netfilter/nft_compat.c
> > @@ -359,10 +359,20 @@ static int nft_target_validate(const struct nft_ctx *ctx,
> >
> >       if (ctx->family != NFPROTO_IPV4 &&
> >           ctx->family != NFPROTO_IPV6 &&
> > +         ctx->family != NFPROTO_INET &&
> >           ctx->family != NFPROTO_BRIDGE &&
> >           ctx->family != NFPROTO_ARP)
> >               return -EOPNOTSUPP;
> >
> > +     ret = nft_chain_validate_hooks(ctx->chain,
> > +                                    (1 << NF_INET_PRE_ROUTING) |
> > +                                    (1 << NF_INET_LOCAL_IN) |
> > +                                    (1 << NF_INET_FORWARD) |
> > +                                    (1 << NF_INET_LOCAL_OUT) |
> > +                                    (1 << NF_INET_POST_ROUTING));
> > +     if (ret)
> > +             return ret;
> > +
> >       if (nft_is_base_chain(ctx->chain)) {
> >               const struct nft_base_chain *basechain =
> >                                               nft_base_chain(ctx->chain);
> > @@ -610,10 +620,20 @@ static int nft_match_validate(const struct nft_ctx *ctx,
> >
> >       if (ctx->family != NFPROTO_IPV4 &&
> >           ctx->family != NFPROTO_IPV6 &&
> > +         ctx->family != NFPROTO_INET &&
> >           ctx->family != NFPROTO_BRIDGE &&
> >           ctx->family != NFPROTO_ARP)
> >               return -EOPNOTSUPP;
> >
> > +     ret = nft_chain_validate_hooks(ctx->chain,
> > +                                    (1 << NF_INET_PRE_ROUTING) |
> > +                                    (1 << NF_INET_LOCAL_IN) |
> > +                                    (1 << NF_INET_FORWARD) |
> > +                                    (1 << NF_INET_LOCAL_OUT) |
> > +                                    (1 << NF_INET_POST_ROUTING));
> > +     if (ret)
> > +             return ret;
> > +
> >       if (nft_is_base_chain(ctx->chain)) {
> >               const struct nft_base_chain *basechain =
> >                                               nft_base_chain(ctx->chain);
> > --
> > 2.39.2
> >

[1]: https://lore.kernel.org/netfilter-devel/20220831101617.22329-1-fw@xxxxxxxxx/

Ignat





[Index of Archives]     [Netfitler Users]     [Berkeley Packet Filter]     [LARTC]     [Bugtraq]     [Yosemite Forum]

  Powered by Linux