Eu finalmente descobri como resolver esse problema.
# nft list table nat
table ip nat {
chain prerouting {
type nat hook prerouting priority 0; policy accept;
}
chain postrouting {
type nat hook postrouting priority 100; policy accept;
oifname "ppp0" masquerade
}
}
Você só precisa usar iifname/oifname "ppp0"
em vez de oif/iif ppp0
. O último endereça a interface por string, em vez de usar o id da interface. As citações são opcionais, mas acho que enfatiza bem a interpretação diferente.
A página do manual simplesmente afirma:
Type ifname: Interface name (16 byte string). Does not have to exist.
Não sei se há alguma desvantagem, como o impacto no desempenho ao fazer a correspondência, mas parece que é a solução correta.