Túneis SSH
Muitas vezes desejamos ter acesso a serviços remotos que não se encontram disponíveis na rede em que estamos. O que fazer nesse caso?
Não tema, você pode conseguir este acesso por meio de um Túnel.
O que é?
Imagem original por Christian Mueller
Um túnel se trata de um canal capaz de transferir informações de um ponto a outro de uma rede. Existem diversos protocolos de túnel, mas no nosso caso estaremos utilizando o protocolo SSH, que é encriptado e oferece uma boa segurança.
As vezes sua empresa possui um firewall, ou seu computador remoto não tem um IP fixo. É possível resolver diversos tipos de problema com túneis.
Como fazer?
Existem 3 tipos de túnel que podem ser feitos com o client ssh padrão:
-
Túnel Local: Este túnel abre da sua máquina host para a máquina alvo, trazendo um serviço alvo para a máquina host.
ssh -N -L porta_local:alvo:porta_remota usuario@host
Ao tentar acessar a porta_local no host, você será servido a porta_remota do alvo.
-
Túnel Remoto: Abre de sua máquina alvo para a host, levando um serviço do alvo para a máquina host.
ssh -N -R porta_remota:alvo:porta_local usuario@host
Ao tentar acessar a porta_remota no host, é como se estivéssemos acessando a porta_local do alvo.
-
Túnel Dinâmico (SOCKS): É capaz de criar um proxy SOCKS com o protocolo SSH.
ssh -N -D porta_local usuario@host
Todo o tráfego vindo pela porta_local irá passar pelo host. Tornando possível configurar navegadores para utilizar host:porta_local como um proxy SOCKS.
Mantendo túneis abertos com autossh
Nenhuma rede é perfeita, problemas de conexão podem surgir e derrubar suas conexões. Dependendo da sua situação, pode não ser possível religar o túnel manualmente.
Existem formas de manter os túneis abertos, ou refazê-las em caso de problemas de conectividade. Uma dessas formas é utilizando o autossh.
Ele se trata um programa similar ao client ssh padrão, porém com algumas opções extras referentes a confiabilidade da conexão.
Usando um exemplo com túnel remoto:
autossh -M porta_remota_monitoramento -N -o "ServerAliveInterval 60" -o "ServerAliveCountMax 3" -R porta_remota:localhost:porta_local usuario@host
Este túnel funciona da mesma maneira que um túnel remoto, porém o autossh o reconecta novamente em caso de queda. O autossh irá monitorar a porta_remota_monitoramento e a porta acima dela para verificar a atividade do túnel, e reativá-lo caso ele caia.
As outras opções são do client ssh padrão e se tratam de experimentos que fiz para manter a conexão ativa o máximo de tempo possível:
ServerAliveInterval: Intervalo em segundos para mandar uma mensagem pelo túnel, caso o mesmo esteja inativo. O default é 0, indicando que essas mensagens nunca são enviadas. No caso deixei 60, para enviar a cada minuto.
ServerAliveCountMax: Em caso de falha nas respostas, este é o número de tentativas que serão enviadas ao servidor antes de desconectar a sessão ssh. O default é 3 e deixei assim mesmo, coloquei acima apenas para demonstração.
No nosso exemplo, em caso de perda de conexão, o autossh irá trazê-la de volta em cerca de 3 minutos.
Só isso?
O client ssh tem muitas outras opções, que podem ser vistas com man ssh
e man ssh_config
. Compensa dar uma folheada nas páginas de manual para ter noção do que pode ser feito.
Algumas coisas interessantes:
-
Você também pode adicionar a chave -f para deixar o comando executando no background, sem ocupar seu terminal.
-
Caso queira, pode omitir o -N e abrir o túnel juntamente com um terminal para o host alvo.