nftables 1:1 NAT (dirección IP a dirección IP)

nftables 1:1 NAT (dirección IP a dirección IP)

Actualicé a Fedora 32, que usa nftables, que no conozco en absoluto, y después de examinar toda la documentación que pude encontrar, no puedo encontrar la manera de replicar mi NAT 1:1 con nftables, lo que significa que actualmente mi servidor de correo es inaccesible.

Estaba usando estas reglas con firewalld/iptables.

  <passthrough ipv="ipv4">-t nat -A PREROUTING -i eno1 -d public.ip -j DNAT --to-destination 10.99.99.21</passthrough>
  <passthrough ipv="ipv4">-t nat -A POSTROUTING -s 10.99.99.21 -o eno1 -j SNAT --to public.ip</passthrough>
  <passthrough ipv="ipv6">-t nat -A PREROUTING -i eno1 -d public.ipv6 -j DNAT --to-destination fdb9:b611:5d5d:ffff::21</passthrough>
  <passthrough ipv="ipv6">-t nat -A POSTROUTING -s fdb9:b611:5d5d:ffff::21 -o eno1 -j SNAT --to-source public.ipv6</passthrough>

He probado esto y parece que no funciona:

nft list table nat
table ip nat {
        chain postrouting {
                type nat hook postrouting priority srcnat; policy accept;
                ip saddr 10.99.99.21 oif "eno1" snat to public.ip
        }

        chain prerouting {
                type nat hook prerouting priority dstnat; policy accept;
                iif "eno1" ip daddr public.ip dnat to 10.99.99.21
        }
}

Más información: después de seguir investigando esto, es la regla SNAT la que no coincide por algún motivo.

Respuesta1

Voy a responder mi propia pregunta tal como la descubrí después de hablar con uno de los desarrolladores de firewalld en github.

Aparentemente el problema es que tanto nftables como iptables se emplean al mismo tiempo.

Citando:

This makes sense. It's due to the fact that iptables and nftables rules are executed independently inside the kernel/netfilter. So your scenarios are:

    iptables backend
        your direct rules accept the packets in the FORWARD chain
        further iptables rules in the FORWARD chain are not evaluated (due to accept)
        firewalld rules are part of iptables, so they're not considered (due to accept)
    nftables backend
        your direct rules accept the packets in the FORWARD chain
        further iptables rules in the FORWARD chain are not evaluated (due to accept)
        packet is now subject to firewalld's nftables ruleset, this happens even if the packet is accepted it iptables.
        zone is using "default" target, so packet is dropped in the FORWARD chain
        due to drop POSTROUTING (SNAT) is never reached

There is no fix possible as it's a result of how the kernel works. You can read more about this in the CAVEATS section of man page firewalld.direct.

Fuente:https://github.com/firewalld/firewalld/issues/708

Entonces, las reglas de nftables anteriores creadas a través de alternativas de iptables-nft no funcionan porque todavía usan el código del kernel de iptables. Simplemente aparecen en nft.

Explicación detallada sobre la interacción de nftables e iptables aquí: https://developers.redhat.com/blog/2020/08/18/iptables-the-two-variants-and-their-relationship-with-nftables/

información relacionada