Linux – Conexão SSH lenta no login

Recentemente tentando acessar um servidor novo, percebi uma lentidão para conectar via SSH. Vamos ao caso:

1) Servidor era novo, a versão do openssh-server não era a mais recente no caso 6.5 mas uma que uso em vários servidores sem problema.
2) Latência da conexão baixa, depois de várias requisições ICMP tive um resultado como min/avg/max/mdev = 0.368/0.627/0.706/0.200 ms, então minha rede não era.
3) Em termos de hardware do servidor sem comentários, estava tranquilo. Por vias duvidas até acompanhei algumas coisas monitorando mas, sem problemas.
4) Firewall? Não. Pois com as regras ativas ou limpas era mesma coisa.

Agora as etapas que segui para resolver o problema:

E como a alguns anos eu tive um problema parecido o que eu fiz, no caso desabilitei ou comentar o seguinte parâmetro no /etc/ssh/sshd_config.

GSSAPIAuthentication no
GSSAPICleanupCredentials no

ou

#GSSAPIAuthentication no
#GSSAPICleanupCredentials no

Ou ainda pode passar direto em linha de comando:

cleiton@linuxVM:~$ ssh -o GSSAPIAuthentication=no -v [email protected]

E mesmo assim nada, não era esse o problema. Então resolvi dar uma investigada no log do Linux, e para ajudar habilitei o DEBUG no /etc/ssh/sshd_config.

# Logging
SyslogFacility AUTH
#LogLevel INFO
LogLevel DEBUG

Modo VERBOSE também ajuda, para entender as opções pode usar o man sshd_config. E não consegui abstrair nada que poderia ser este o problema, ou seja solicitava o usuário eu informava e demora alguns minutos para solicitar senha, e no /var/log/auth.log e nada estranho era reportado.
Testei varias configurações dos parâmetros que eu conhecia, os que alterei voltei para o padrão e nada, até que ae tive que apelar, como no meu TCC usei bastante ltrace, strace e ‘N’ ferramentas para debugar aplicações e resolver problemas me recordo de ser possível fazer o mesmo baseado em um PID de processo rodando, então vamos lá.
Existem diversas combinações para trabalhar com ltrace e strace, no meu caso queria capturar todas as System Calls então strace era perfeito, a sintaxe abaixo me atendeu muito bem e qualquer duvida o man strace vai exibir todas as combinações possíveis, agora vamos as etapas para isso.

Primeiro encontrar o PID do processo SSH Daemon que esta rodando.

cleiton@linuxVM:~$ sudo ps aux | grep sbin/sshd
root 31184 0.0 0.4 5840 2252 ? Ss 18:51 0:00 /usr/sbin/sshd -D
root 31601 0.0 0.1 1948 524 pts/1 S+ 19:01 0:00 grep --color=auto sbin/sshd

Ok, o importante dessas informações é a segunda coluna da linha /usr/sbin/sshd -D, no caso o PID (31184).
E agora chamando o strace e passando o PID no parâmetro -p.

cleiton@linuxVM:~$ sudo strace -f -p 31184
Process 31184 attached - interrupt to quit
select(7, [3 4], NULL, NULL, NULL

Beleza, ae fui no terminal do outro computador e conectei, notei que ficou preso em uma etapa e logo prosseguiu, e não consegui ver, então com mais um parâmetro joguei toda a saída em um arquivo.

cleiton@linuxVM:~$ sudo strace -f -p 31184 -o /tmp/strace_sshd.log
Process 31184 attached - interrupt to quit

Tinha me recordado de ter visto meu IP e a string ADDRESS, para não pesquisar no arquivo /tmp/strace_sshd.log inteiro que gerou 38631 linhas acabei dando um cat filtrando o que me interessava e cheguei na informação a seguir.

cleiton@linuxVM:~$ sudo cat /tmp/strace_sshd.log | grep "ADDRESS"
31995 write(4, "RESOLVE-ADDRESS 172.20.20.35n", 30) = 30

E esse RESOLVE-ADDRESS me chamou atenção, pois se estou em uma rede interna e este servidor nem internet irá utilizar, já pensei no sentido de DNS, e fui dar uma garimpada no help do sshd, no caso man sshd_config e vi algo curioso.

cleiton@linuxVM:~$ man sshd_config | grep DNS
UseDNS Specifies whether sshd(8) should look up the remote host name and check that the resolved host name for the remote IP address maps back to...

Abrindo o help e lendo a informação, ele esta tentando ler o hostname do IP remoto, ele tem um tempo de timeout e caso não conseguir prossegue, esta opção por default vem setada com “yes” e no caso basta setar como “no” em /etc/ssh/sshd_config ficando assim:

...
UseDNS no
...

Reiniciei o serviço e mandei conectar, conectou na hora e sem delay na conexão.

Espero ter ajudado alguem com o mesmo problema, eu poderia apenas informar para inserir UseDNS no no /etc/ssh/sshd_config, mas acho legal compartilhar como cheguei na solução do problema.

Até a próxima!

Share Button

CC BY-NC-SA 4.0 Linux – Conexão SSH lenta no login by Cleiton Bueno is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.