Para solucionar sua configuração, desative-a e teste cada parte individualmente.
Eu tenho um servidor de firewall (10.3.1.5), então eu adicionei o comando para pacotes para 1.2.3.4 em uma caixa interna 10.3.1.140 (mil102):
iptables -t nat -A PREROUTING -i eth0 -d 1.2.3.4 -j LOG
iptables -t nat -A PREROUTING -i eth0 -d 1.2.3.4 -j DNAT --to 10.3.1.140
Este deve ser o mesmo que o seu ponto de partida, e agora a partir de uma máquina interna 10.3.1.129 (hp) eu posso pingar 1.2.3.4. O log no firewall mostra os pacotes:
Feb 3 15:42:54 firewall kernel: [7052380.506166] IN=eth0 OUT= MAC=00:0c:29:64:b1:4a:00:22:64:f7:b4:b8:08:00 SRC=10.3.1.129 DST=1.2.3.4 LEN=84 TOS=0x00 PREC=0x00 TTL=64 ID=27456 DF PROTO=ICMP TYPE=8 CODE=0 ID=922 SEQ=1
E usando o tcpdump para exibir apenas os pacotes ICMP (tcpdump 'icmp [icmptype] = icmp-echo ou icmp [icmptype] = icmp-echoreply') Eu vejo o pacote em mil102 (10.3.1.140):
16:42:55.161125 IP hp > mil102: ICMP echo request, id 922, seq 1, length 64
16:42:55.161185 IP mil102 > hp: ICMP echo reply, id 922, seq 1, length 64
Você deve conseguir chegar a esse ponto apenas com a linha PREROUTING na tabela nat - verifique se ela está funcionando antes de tentar a regra POSTROUTING.
Em seguida, adicionei as regras de POSTROUTING:
iptables -t nat -I POSTROUTING 1 -d 10.3.1.140 -s 10.3.1.0/24 -j LOG
iptables -t nat -I POSTROUTING 2 -d 10.3.1.140 -s 10.3.1.0/24 -j SNAT --to 10.3.1.5
O que muda os pacotes da rede local para 10.3.1.140 (mil102) para parecer que eles estão vindo de 10.3.1.5 (firewall).
O arquivo de log agora mostra o ping passando:
Feb 3 15:40:33 firewall kernel: [7052239.848022] IN=eth0 OUT= MAC=00:0c:29:64:b1:4a:00:22:64:f7:b4:b8:08:00 SRC=10.3.1.129 DST=1.2.3.4 LEN=84 TOS=0x00 PREC=0x00 TTL=64 ID=21950 DF PROTO=ICMP TYPE=8 CODE=0 ID=32310 SEQ=1
Feb 3 15:40:33 firewall kernel: [7052239.848081] IN= OUT=eth0 SRC=10.3.1.129 DST=10.3.1.140 LEN=84 TOS=0x00 PREC=0x00 TTL=63 ID=21950 DF PROTO=ICMP TYPE=8 CODE=0 ID=32310 SEQ=1
e minha máquina de destino mil102 (10.3.1.140) agora mostra a origem dos pings sendo o firewall (10.3.1.5):
16:40:35.639037 IP firewall > mil102: ICMP echo request, id 32310, seq 2, length 64
16:40:35.639110 IP mil102 > firewall: ICMP echo reply, id 32310, seq 2, length 64
Algumas notas sobre minha configuração - eth0 é a interface interna do firewall, eth1 a externa. Tanto o hp quanto o mil102 possuem apenas uma interface eth0.
Minha tabela nat existente tem algum roteamento - por isso usei comandos de inserção. Esta é a aparência da minha tabela original:
Chain PREROUTING (policy ACCEPT 37 packets, 2362 bytes)
pkts bytes target prot opt in out source destination
1444 73980 DNAT tcp -- eth1 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:81 to:10.3.1.129:81
Chain INPUT (policy ACCEPT 18 packets, 1222 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 6 packets, 420 bytes)
pkts bytes target prot opt in out source destination
Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
5 420 ACCEPT all -- * eth1 0.0.0.0/0 172.20.20.0/24
116M 7439M MASQUERADE all -- * eth1 0.0.0.0/0 0.0.0.0/0
Por favor, ignore os timestamps nos logs - eu coletei dados para o exemplo depois que eu testei tudo.
O melhor conselho, se isso não estiver funcionando, é simplificar a configuração até você chegar a um ponto em que ela esteja funcionando como esperado e, em seguida, adicionar complexidade até que você quebre ou atinja a meta.