Seguindo meu comentário, aqui está uma solução que deve funcionar como você pretende. Observe que o pedido é o contrário dos exemplos no link Netfilter Connmark , mas desde as suas decisões são feitos com pacotes de entrada, não de saída, essa é a ordem certa para ir. Então, remova suas duas regras MARK anteriores (eu as coloquei de volta aqui) e substitua por:
# iptables -t mangle -A INPUT -i ens3 -j MARK --set-mark 1
# iptables -t mangle -A INPUT -i ens4 -j MARK --set-mark 2
# iptables -t mangle -A INPUT -j CONNMARK --save-mark
# iptables -t mangle -A OUTPUT -j CONNMARK --restore-mark
Estou usando INPUT (que é chamado depois de PREROUTING, mas apenas para fluxos locais) por uma questão de simetria e clareza: isso é para conexões locais, não para encaminhamento. Usar PREROUTING em vez de INPUT (mas manter OUTPUT) daria os mesmos resultados.
Isso usa o conntrack, que está rastreando todos os fluxos, para lembrar a marca e colocá-la de volta no pacote de saída gerado localmente, porque o conntrack sabe que é parte do mesmo fluxo.
O uso de uma regra OUTPUT na tabela mangle aciona uma verificação de reencaminhamento (veja este Linux routing e netfilter schematic ), e é isso que é necessário para rotear de acordo com a marca.
Se você estiver usando outras regras -t mangle
ou se o servidor também estiver encaminhando, as regras precisarão ser alteradas. De qualquer forma, o --save-mark
provavelmente deve ser o último em INPUT, e o --restore-mark
será o primeiro em OUTPUT.
A marca está definida para pacotes de resposta não-usuário (como o TCP RST), então fwmark_reflect
pode nem ser mais necessário ou pode interferir, você deve testar.