Nada é impossível, com o iptables.
# iptables -t nat -L -v --line-numbers -n
Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
1 5 281 MARK udp -- docker0 * 0.0.0.0/0 172.17.0.1 udp dpt:53 MARK set 0xc0fe
2 5 281 TEE udp -- docker0 * 0.0.0.0/0 172.17.0.1 udp dpt:53 TEE gw:127.1.2.3
3 3 167 DNAT udp -- * * 0.0.0.0/0 0.0.0.0/0 mark match 0xc0fe to:1.1.1.1:53
Eu estava testando isso com o docker, já que é mais fácil de jogar com sua interface. Observe que eu coloquei essas regras antes de qualquer outra regra na tabela de pré-detalhamento.
O que você faz é marcar o pacote que você está interessado, então TEE (copiar) esse pacote, e agora você pode DNAT aquele pacote para 1.1.1.1.
Marque-os, aqui você deve usar seu eth0 ou eno1, não docker0.
iptables -t nat -I PREROUTING 1 -i docker0 -p udp -d 172.17.0.1 --dport 53 -j MARK --set-mark 0xc0fe
Copie / tee para o localhost, a regra pode ser assim
iptables -t nat -I PREROUTING 2 -i docker0 -p udp --dst 172.17.0.1 --dport 53 -j TEE --gateway 127.1.2.3
Mas também pode ser assim iptables -t nat -I PREROUTING 3 -p udp -m mark --mark 0xc0fe -j TEE --gateway 127.1.2.3
Finalmente
iptables -t nat -I PREROUTING 3 -p udp -m mark --mark 0xc0fe -j DNAT --to-destination 1.1.1.1:53
Ei, então você estava no caminho certo, exceto pelo uso de TEE na tabela mangle, aqui estou usando tanto o TEE quanto o DNAT na tabela nat, e a MARK não é necessária, exceto para facilitar a depuração e lidar com regras. alterar. Também outro erro que você teve foi deixar a regra DNAT atuar no que você acreditou que o TEE deveria ir, mas em vez disso a TEE e a DNAT deveriam agir nas mesmas condições. Mas vou deixar as regras da marca aqui, apenas para me divertir com cultistas de carga.
Em forma abreviada iptables -t nat -I PREROUTING 1 -i eth0 -p udp --dst 172.17.0.1 --dportar 53 -j TEE --gateway 127.3.3.3 iptables -t nat -I PREROUTING 2 -i eth0 -p udp --dst 172.17.0.1 --dportar 53 -j DNAT --para o destino 1.1.1.1:53