Não é possível fazer isso com apenas um comando por DNAT - a menos que ... veja abaixo. Mas é possível inserir os dados apenas uma vez.
Vamos definir o intervalo de marcas 1024-2047 para as conexões que recebem DNAT e encaminhadas.
Uma linha com cada condição de correspondência DNAT no mangle:
iptables -t mangle -A PREROUTING -p tcp --dport 46000 -j MARK --set-mark 0x400
iptables -t mangle -A PREROUTING -p tcp --dport 46001 -j MARK --set-mark 0x401
iptables -t mangle -A PREROUTING -p tcp --dport 46002 -j MARK --set-mark 0x402
Um comando para cada in nat:
iptables -t nat -A PREROUTING -m mark --mark 0x400 -j DNAT \
--to-destination 172.16.8.2:46000
iptables -t nat -A PREROUTING -m mark --mark 0x401 -j DNAT \
--to-destination 172.16.8.2:46001
iptables -t nat -A PREROUTING -m mark --mark 0x402 -j DNAT \
--to-destination 172.16.8.2:46002
Um comando para todos no filtro:
iptables -A FORWARD -m mark --mark 0x400/0x400 -j ACCEPT
BTW: Não há necessidade de fornecer a porta de destino para -j DNAT
, se não for alterada.
Editar 1:
Você pode fazer isso sem ter permitido as conexões explicitamente, se você está bem em permitir tudo o que foi DNATted. Nesse caso, você iria ficar com o seu
iptables -t nat -A PREROUTING -p tcp --dport 46000 -j DNAT --to-destination 172.16.8.2:46000
mas tem apenas uma regra FORWARD para todos:
iptables -A FORWARD -m conntrack --ctstate DNAT -j ACCEPT