Se o server1 não for o gateway para o server2, você também precisará do SNAT. Caso contrário, o servidor2 enviará a resposta ao cliente que não reconhece o pacote, pois ele não tem o servidor1 como endereço de origem, mas o servidor2.
iptables -t nat -A POSTROUTING -p tcp -m conntrack --ctstate DNAT --ctorigdst server1 --ctorigdstport 23 -j SNAT --to-source server1
Um critério de filtro preciso e fácil de entender para as regras em FORWARD, PREROUTING e POSTROUTING seria uma marca de pacote:
iptables -t mangle -A PREROUTING -d $server1_ip -p tcp --dport 23 -j MARK --set-mark 22
iptables -t nat -A PREROUTING -p tcp -m mark --mark 22 -j DNAT --to-destination $server2_ip:22
iptables -t nat -A POSTROUTING -m mark --mark 22 -j SNAT --to-source $server1_ip
iptables -A FORWARD -m mark --mark 22 -j ACCEPT
Por favor, note: Se server1 tiver mais de uma interface e os pacotes DNATed forem roteados de uma interface para outra (como aconteceu neste caso), então o IP de correspondência de destino e o SNAT IP são diferentes.
"- p tcp" não deve ser necessário na segunda linha, mas o iptables ou o Netfilter precisam disso. Pode ser útil adicionar, e. -m comment --comment "DNAT SSH from port 23 to server2"
em todas as linhas para facilitar a compreensão da iptables -L -nv
.