encontrou sua pergunta fazendo uma pesquisa no google sobre tópicos semelhantes de firewall de várias interfaces para o firewalld. Estamos cerca de um ano depois, e sua pergunta permanece sem resposta, e estou querendo saber se o problema que você tem com --permanent está relacionado à ordem dos argumentos.
Na versão 0.4.4.4 do Enterprise Linux 7.5, a página man no firewall-cmd mostra claramente que você precisa ter --permanent before --direct. Isso é provável porque quaisquer argumentos após --direct são sub-argumentos para direcionar, não o firewall-cmd. Então, execute seu comando da seguinte forma:
# firewall-cmd --permanent --direct --add-rule ipv4 filter FORWARD 0 -o ens256 -i ens161 -j ACCEPT
Em seu problema com as duas Interfaces Internas ... Por um lado, você precisa dar uma olhada na saída de # iptables -L
e mapear como suas correntes fluem. O comando que você colocou lá insere uma regra na cadeia direta no topo da cadeia, com prioridade 0. Meu palpite é que há outra cadeia com prioridade mais alta, como "FORWARD_IN_ZONES", que acaba descartando seus pacotes.
Além disso, em versões recentes do firewalld, é possível executar # firewall-cmd --set-log-denied=all
para ver informações sobre pacotes descartados. Os logs devem incluir o nome da cadeia que está criando o drop.