Eu reproduzi seu resultado (com a tentativa de conexão SSH para 127.0.0.1 enquanto meu sshd estava ouvindo). É verdade que o software apenas trava.
Acho que o software aguarda uma resposta ou uma mensagem de erro, mas a mensagem de erro se enquadra na mesma regra e é rejeitada. Eu não sei se há alguma reação em cadeia de mensagens de erro ou não - eu não investiguei até agora. Eu posso errar em primeiro lugar, então se alguém tiver uma explicação melhor, eu ficarei feliz em lê-lo.
Aqui está a solução que funciona no meu Debian:
Você deve se conectar à 127.0.0.2 ( explicação aqui ) e fazer sua regra da seguinte forma:
sudo iptables -I INPUT 1 -p tcp -d 127.0.0.2 -j REJECT --reject-with tcp-reset
Observe o fragmento -I INPUT 1 que garante que a regra a ser inserida na primeira posição tenha precedência sobre qualquer regra de ACCEPT que você já tenha na sua interface de loopback (como eu fiz no meu Debian).
Eu repeti o teste (com tentativa de conexão SSH, desta vez para 127.0.0.2 ). Falhou imediatamente com
Connection refused
Eu acho que funciona como você deseja, porque agora a mensagem de erro é destinada a 127.0.0.1 , portanto, não sendo pego pela regra de rejeição e capaz de passar.