Túneis SSH

Jul 16, 2014 09:03 · 569 words · 3 minutes read

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 é?

SSH Tunnel

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:

  1. 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.

  2. 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.

  3. 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.