Coloque a regra de recebimento antes do restante das regras e, em seguida, o SSH funcionará normalmente.
O pedido é importante, pois o iptables avalia as regras de cima para baixo. Da mesma forma, se você primeiro criar uma regra que permita a porta 22 e, em seguida, a próxima regra que desce tudo para a porta 22, a última regra será aplicada.
Aqui está um exemplo de configuração de um servidor de produção em funcionamento:
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT
-A INPUT -j LOG --log-prefix "IPTABLES IN:"
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
-A OUTPUT -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT
-A OUTPUT -j LOG --log-prefix "IPTABLES OUT:"
COMMIT
Primeiro, configura as conexões de entrada e encaminhada para descartar por padrão e aceitar de saída por padrão. Então as conexões com estado relacionadas e estabelecidas são aceitas. Então o ICMP é globalmente aceito e o tráfego de loopback é aceito. Depois que as portas de destino 22 e 80 são aceitas, seguidas pelas regras sobre logging etc. Usando o centos eu salvo as regras em um arquivo, então se eu recarregar o iptables ele atualiza as regras daquele arquivo diretamente. É claro que para definir um arquivo padrão, você precisa ter certeza de que as regras estão funcionando bem, já que elas são carregadas na reinicialização.
Pode-se usar 'iptables-restore < path_to_rules 'para recarregar um conjunto de regras de um arquivo.