Teste automatizado, Docker, SVN Subversion container, demora de aproximadamente 10 segundos para conectar via SSH ⏩ Troubleshooting

História

📋 A série Diário de Bordo não tem a inteção de explicar detalhes técnicos e soluçãoes bem elebadoras, é apenas uma história real contada.

Tenho alguns testes automatizados escritos em Java que sobem um container do SVN e se conectam ao container via SSH utilizando chave púlica/privada.

A biblioteca Java utilizada para fazer acesso SSH é a jsch na versão 0.1.55. Inicialmente pensei que o problema fosse nela, inclusive precisei escrever uma classe de log para ela seguindo esse modelo (estranho!), onde é possível vincular ao sistema de log da minha aplicação.

Agora com o log do jsch e debugando o código dele, percebi que o código ficava esperando um InputStream de um socket no método com.jcraft.jsch.IO.getByte(byte[], int, int), então comecei a pensar que o problema estava no servidor de SSH no container. Antes disso pesquisei sobre lentidão na conexão SSH com jsch, na esperança de achar algum parâmetro mágico e pouco achei e nada serviu.

Para elimintar de vez que o problema poderia estar no jsch, resolvi me conectar ao container via linha de comando (porque não pensei nisso antes!). Ao me conectar, exatamente com a linha ssh -i chave-privada -p 2220 user@127.0.0.1, assim como fazia meu teste automatizado, também obtive o delay de aproximadamente 10 segundos para concluir a conexão.

NOTA: o IP 127.0.0.1 é porque o container subiu fazendo bind das portas para o meu host.

Agora eu já sabia que a lentidão era alguma coisa no servidor, no daemon do SSH, ou ao menos eu tinha 99% de certeza. Ativei então o modo verboso no cliente, me conectando assim: ssh -vvvvv -i chave-privada -p 2220 user@127.0.0.1. No log percebi que a demora toda era na linha debug3: send packet: type 50. Mas o que é isso? Google!

Então pesquisei exatamente por ssh slow “send packet: type 50” e cheguei no link https://tanelpoder.com/posts/troubleshooting-linux-ssh-logon-delay-always-takes-10-seconds/.

NOTA: esse link é MUITO bom. 📋

Resumo do link: o chapa explica de forma detalhada e clara como ele descobriu o problema, inclusive fazendo um strace do processo do daemon do SSH (sshd). Fica claro que o problema era o tempo para executar um lookup reverso do DNS, ou seja, a partir do IP obter o nome.

💭 Pensei: será isso? 🏃‍♂️ Entrei no container docker exec -it svn bash e executei nslookup IP_DO_HOST e o comando demorou 10 segundos (nem cheguei a fazer o strace)! Como eu não precisava disso para os meus testes, agora bastava descobrir como desativar esse comportamento no servidor SSH. Google!

Bastou então adicionar os parâmetros abaixo ao arquivo /etc/ssh/sshd_config

  • UseDNS no
  • UsePAM no

… e reiniciar o sshd com service sshd restart já que o container é Ubuntu.

NOTA: tenho dúvidas se o UsePAM no é necessário, embora eu saiba o que ele faz.

Agora, tanto via linha de comando como pelos meus testes automatizados, a demora para se conectar foi embora.

Até a próxima!

Referências