Um pacote de resposta do ICMP Echo faz parte de um fluxo estabelecido. Isso significa que, quando o kernel recebeu tal pacote em um caso normal, ele já estava esperando (após a requisição de eco ICMP inicial), então conntrack, o bloco base necessário para nat, já criou uma entrada de expectativa para ele. Nesse caso, a tabela nat entrará em curto-circuito e nem será executada para este pacote de resposta.
referência: link (NAT)
This table is slightly different from the 'filter' table, in that only the first packet of a new connection will traverse the table: the result of this traversal is then applied to all future packets in the same connection.
Para verificar esse comportamento, use o comando conntrack (do pacote conntrack) no modo do monitor de eventos. Aqui está um exemplo com um ping para o Google:
# conntrack -E
[NEW] icmp 1 30 src=192.168.3.2 dst=8.8.8.8 type=8 code=0 id=12837 [UNREPLIED] src=8.8.8.8 dst=198.51.100.5 type=0 code=0 id=12837
[UPDATE] icmp 1 30 src=192.168.3.2 dst=8.8.8.8 type=8 code=0 id=12837 src=8.8.8.8 dst=198.51.100.5 type=0 code=0 id=12837
[DESTROY] icmp 1 src=192.168.3.2 dst=8.8.8.8 type=8 code=0 id=12837 src=8.8.8.8 dst=198.51.100.5 type=0 code=0 id=12837
O primeiro pacote criará a entrada [NEW] e assim passará a tabela nat dando uma chance de alterar a expectativa (neste exemplo, um SNAT / MASQUERADE clássico). Outros pacotes deste fluxo são manipulados apenas com a expectativa de conntrack até que a entrada seja destruída (30s timeout para este icmp).
O uso de uma regra nat teria funcionado com a solicitação ICMP Ping Echo inicial, porque seria um novo fluxo.
Você não disse o que realmente quer fazer com tudo isso. Se o seu objetivo é copiar o pacote para 172.31.20.219, você deve tentar o alvo TEE (man iptables-extensions).