Bê-á-bá do SSH, parte 7: Túneis

Autor: Pablo Hess do Blog do developerWorks

Bê-á-bá do SSH, parte 7: Túneis

Agora que já entramos nos recursos avançados do OpenSSH, é hora de apresentar aquele que talvez seja o mais apreciado pelos usuários avançados: túneis.

Um túnel SSH é uma conexão criptografada entre duas máquinas (o servidor e o cliente), que tem como objetivo redirecionar o tráfego entre a máquina remota (o servidor) e uma terceira, como mostra a figura:

imagem  

O tubo amarelado que atravessa parte da nuvem representa justamente a conexão criptografada (chamada de túnel) entre o seu computador local (indicado pelo texto local) e o servidor SSH (indicado pro inter, de intermediário).

Por sua vez, o servidor SSH se conecta à máquina de destino (destino) sem qualquer criptografia, e age como intermediário nas comunicações entre a sua máquina local e a de destino.

Vejamos como usar isso.

 

Exemplos práticos

Fulano está em sua máquina de casa e precisa alterar uma regra no firewall da empresa. Porém, o sistema de gerenciamento do firewall só pode ser acessado a partir de dentro da própria rede da empresa. Como fazer?

Basta criar um túnel SSH entre sua máquina de casa e uma máquina no trabalho, redirecionando o tráfego para a porta correta do sistema de gerenciamento do firewall.

Para este exemplo, suponhamos a seguinte estrutura de rede:

  • Fulano em casa (máquina casa): 10.0.1.2

  • Máquina no trabalho (máquina trab): 222.222.222.222 (escutando SSH via Internet)

  • Sistema de gerenciamento do firewall (máquina fire): 192.168.1.60 (na rede interna da empresa), porta 4545

Com esse cenário, a criação do túnel SSH com as características desejadas só precisaria do seguinte comando:

  [fulano@casa ~] $ ssh ftal@trab -NL 6000:192.168.1.60:4545

Este comando diz: crie uma conexão SSH com a máquina trab `` usando o usuário ``ftal, não execute comando algum (-N) e ligue minha porta local (-L) 6000 à porta 4545 da máquina 192.168.1.60.

Confuso? Veja se a figura abaixo ajuda.

 

imagem Como mostra a figura, quando o Firefox é apontado para o endereço localhost:6000, o tráfego é repassado, por meio de uma porta qualquer (representada por abc), à porta 22 da máquina trab via SSH — isto é, sob forte criptografia — e, em seguida, sai de trab por uma porta qualquer (xyz na figura) em direção à porta 4545 de fire.

Outro exemplo útil, mas que nem sempre dá certo, é o redirecionamento da porta TCP 80 (ou seja, web). O motivo da frequente falha é que muitos sites empregam javascript e outras tecnologias que fazem, elas próprias, inúmeras requisições a outros servidores, possivelmente até em portas diferentes da TCP 80. O resultado é que muitos sites falham.

 

Túnel compactado

Um exemplo extremamente importante é o emprego de túneis SSH com uso de compactação. Um ótimo caso de uso: VNC via Internet.

O protocolo VNC é simples e inegavelmente prático, mas via Internet ele pode ser impraticável, dependendo da velocidade de acesso das duas pontas envolvidas. Com uso da compactação no túnel, tudo funciona melhor.

Vejamos o comando:

  [fulano@casa ~] $ ssh ftal@trab -CNL 55900:localhost:5900

Note, neste comando, o uso da opção -C, que ativa a compactação da conexão, e o uso da máquina de destino localhost. Isto significa: entre em trab com o usuário ftal e, lá, redirecione a porta 5900 (VNC) de localhost para a porta 55900 da minha máquina local. Notou a diferença? O redirecionamento de uma porta do próprio servidor SSH intermediário requer o uso de localhost no lugar da máquina de destino.

Em seguida, entre em trab e abra uma sessão VNC. Eu gosto do x11vnc, que exporta a sessão X.org atual via VNC — muito útil quando o seu computador do trabalho é incapaz de exibir adequadamente aquele site todo feito em Flash, por exemplo.

  [fulano@casa ~] $ ssh ftal@trab

  ftal@trab [~]$ x11vnc

  (várias linhas na saída)

Por último, num novo terminal em casa, conecte seu cliente VNC à porta 55900 local:

  [fulano@casa ~] $ vncviewer localhost::55900

Um detalhe: se você já usa a multiplexação de terminais conforme proposto na parte 5 desta série, é importante criar o túnel sobre uma nova conexão SSH. Portanto, o comando mais indicado, nesse caso, é:

  [fulano@casa ~] $ ssh ftal@trab -MCNL 55900:localhost:5900

Note a opção -M. Ela significa que a sessão SSH deve ser uma sessão mestre, mesmo que já existam outras sessões SSH estabelecidas de casa para trab.

  

Múltiplas portas

Quer redirecionar mais de uma porta de trab para portas locais em casa? Basta usar múltiplas vezes a opção -L, da seguinte forma:

  [fulano@casa ~] $ ssh ftal@trab -MCN \

     -L 55900:localhost:5900  \

     -L 8080:localhost:80     \

     -L 4545:fire:4545        \

     -L 25:mail.empresa.br:25

Este comando, como você pode imaginar, redireciona as portas:

  • 5900 de trab para a 55900 de casa

  • 8080 de trab para a 80 de casa

  • 4545 de fire para a 4545 de casa (note que é possível usar o mesmo número de porta local e remota sem qualquer problema)

  • 25 de mail.empresa.br para a 25 de casa.

Note que as opções -M (criar uma nova sessão para esta conexão), -C (ativar a compressão do tráfego) e -N (não executar nenhum comando) só precisam ser definidas uma única vez, pois dizem respeito à conexão entre fulano@casa e ftal@trab.

 

Túneis reversos

Se o seu problema envolte acesso externo à sua máquina local, geralmente a questão é atravessar alguma (ou até várias) camadas de NAT. Nestes casos, o OpenSSH também oferece a solução: um túnel reverso.

Se os túneis normais permitem a conexão da máquina local a destinos externos por meio de uma porta local, os túneis reversos fazem justamente o oposto: permitem conectar uma porta da máquina intermediária a outra porta de uma máquina remota ou local por meio da sua máquina local. Calma, o comando esclarece:

  [fulano@casa ~] $ ssh ftal@trab -NR 8080:www.google.com.br:80

Resultado: qualquer um que acesse a porta 8080 em trab terá sua conexão redirecionada, por meio do túnel SSH que passa por casa, para a porta 80 de www.google.com.br.

Outro exemplo: Fulano está em seu computador de trabalho, trab, e já sabe que precisará acessar a máquina fire a partir do computador casa. Com isso, Fulano já prepara o túnel reverso e deixa tudo pronto para uso. Quando chegar em sua casa, bastará acessar a porta 8080 da máquina casa para se conectar à porta 4545 de fire através do túnel que passa por trab:

  ftal@trab [~]$ ssh fulano@casa -NR 8080:fire:4545

Ou seja, para fire, o tráfego vai parecer ter vindo de trab, que é onde foi criado o túnel reverso.

Assim como nos túneis normais, o uso de compressão é altamente recomendável, assim como a criação de uma sessão mestre para esta conexão. E múltiplas portas também podem ser encaminhadas, ou ainda misturadas com túneis normais:

  ftal@trab [~]$ ssh fulano@casa -MCN \

     -R 8080:fire:4545            \

     -R 9091:localhost:8081       \

     -L 3300:www.google.com.br:80 \

     -R 55900:localhost:5900

Isto significa: abra uma conexão com fulano em casa e crie os túneis entre as portas:

  • 8080 de casa para 4545 de fire (passando por trab, pois é um túnel reverso)

  • 9091 de casa para 8081 de trab (túnel reverso)

  • 3300 de trab para 80 de www.google.com.br (passando por casa, pois é um túnel normal)

  • 55900 de casa para 5900 de trab (túnel reverso).
 

VPN para os menos favorecidos

Isto mostra que o OpenSSH pode ser usado até para criar VPN's (redes privadas virtuais, que se comportam como redes locais mas encontram-se espalhadas pela Internet) rudimentares.

 

SSH + Proxy = VPN web

Uma outra forma — esta com menos ar de gambiarra — de usar a criptografia do SSH para estabelecer uma espécie de VPN é o uso de um servidor proxy no computador intermediário. Isto será tema de um post exclusivo no futuro, mas já posso adiantar as bases do sistema: configure um proxy simples (não precisa ser o Squid, basta algo como o privoxy) na máquina intermediária — isto é, no servidor OpenSSH — e crie um túnel para a porta do proxy, depois configure seu navegador para usar como proxy esta porta em localhost. Com isto, você garante o tráfego criptografado entre a sua máquina e o computador intermediário, e ainda consegue fugir de diversos tipos de bloqueios de acesso locais.

  

Conclusão

A criação de túneis SSH torna o uso da Internet ainda mais seguro, já que acrescenta possibilidades altamente flexíveis de uso da criptografia entre vários pontos. Além disso, os túneis SSH reversos conseguem facilitar a árdua tarefa de atravessar camadas de NAT para oferecer algum serviço.

Os túneis SSH, tanto normais quanto reversos, são também uma forma extremamente eficaz de proteger serviços. Como eles possibilitam acessar portas como se o usuário remoto estivesse na máquina local, é possível deixar os servidores escutando apenas na interface loopback e controlar o acesso por meio da criação de túneis protegidos por criptografia.



Comentários