[Bug 1748] nft masquerade commands make table nat unreadable by iptables-nft

bugzilla-daemon at netfilter.org bugzilla-daemon at netfilter.org
Thu Apr 18 13:27:59 CEST 2024


https://bugzilla.netfilter.org/show_bug.cgi?id=1748

Phil Sutter <phil at nwl.cc> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|NEW                         |RESOLVED
                 CC|                            |phil at nwl.cc
         Resolution|---                         |INVALID

--- Comment #1 from Phil Sutter <phil at nwl.cc> ---
Hi,

(In reply to Thomas Schlien from comment #0)
> If I inject a masquerade rule into the nat table by nft I cannot read the
> table with iptables-nft (git hash 8bf2bab8eb2e4f5ae2fef859ea7c877662854101
> and also older versions like 1.8.9) anymore till I delete this single rule
> with nft
> tool.

This is expected behaviour. You should not mix iptables-nft and nft tools when
manipulating the ruleset. Doing so is a good way to shoot one's foot (as you
did).

> E.g. if I put the below configuration into file postrouting.nft and inject it
> via `nft -f postrouting.nft`:
> table ip nat {
>     chain POSTROUTING {
>         oifname != "br-mailcow" ip saddr 172.22.1.0/24 masquerade
>     }
> }
> 
> `iptables -t nat -L` than tells me `iptables v1.8.10 (nf_tables): table
> `nat' is incompatible, use 'nft' tool.` If I inject the same rule with
> iptables-nft, everything is working fine. I was able to fix this behavior by
> this patch to iptables, but I am pretty sure that this is not the right way
> to do it:
> 
> diff --git a/iptables/nft.c b/iptables/nft.c
> index 884cc77e..a7086014 100644
> --- a/iptables/nft.c
> +++ b/iptables/nft.c
> @@ -3931,6 +3931,7 @@ static const char *supported_exprs[] = {
>         "immediate",
>         "lookup",
>         "range",
> +       "masq",
>  };

This will merely accept the unsupported expression in the rule but the output
is likely incomplete (or even broken).

> In my further debugging I found that the rule injected by iptables seems to
> have "target" as expression instead of "masq", but this only as a hint for
> someone who really knows the code. ;-)

For NAT rules, iptables-nft uses xtables extensions (xt_MASQUERADE.ko) while
nft uses its native code (nft_masq.ko). There are "compat" nftables expressions
named "match" and "target" to call xtables extensions from an nftables rule.

> Yesterday morning this "bug" caused a severe problem as libvirt was not able
> to read the nat table anymore because I used some nft commands before to
> insert some masquerading rules. This also may affect others who update their
> libvirt in, e.g., Ubuntu, and have inserted masquerading rules in the nat
> table via `nft`.

Starting with v1.0.6, nft even warns when listing a ruleset which contains the
compat expressions mentioned above.

Cheers, Phil

-- 
You are receiving this mail because:
You are watching all bug changes.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.netfilter.org/pipermail/netfilter-buglog/attachments/20240418/d1a9c435/attachment.html>


More information about the netfilter-buglog mailing list