sexta-feira, 13 de janeiro de 2012

Como fazer túnel SSH com dois saltos (Two hop SSH tunnel)

0 comentários
 
Decidi escrever esse texto por ter tido, recentemente, alguma dificuldade para fazer um túnel SSH em uma máquina que estava em uma rede diferente da minha e que somente seria acessível se eu passasse por outras duas máquinas, por não pertencerem todas a mesma rede.


No entanto não irei fazer um texto muito explicativo, assumo que conceitos básicos como o funcionamento de túneis SSH sejam entendidos pelo leitor. De qualquer forma segue uma referência:
Usando o PuTTY para túneis SSH: http://sites.google.com/site/fabiodias/putty

A topologia da algo aproximadamente assim:
Nessa figura temos:
"host" - Microsoft Windows 7 Professional - PuTTY
"A", "B" e "C" - GNU/Linux - Openssh

Para questão de resumo, o serviço que estamos buscando em "C" é um servidor HTTP, rodando na porta 80, A porta utilizada para a criação do túnel em questão será a 10080.

Ou seja, do "host" eu somente conseguiria alcançar a máquina "A", se quisesse atingir ao computador "B" deveria fazer um túnel SSH passando por "A". Para alcançar "C" esse túnel deveria passar por "A" e "B".

Como devemos passar por duas máquinas, precisaremos de dois túneis: um que atravesse "A" e outro "B", além disso, esses túneis precisam ter a mesma porta na interconexão entre "A" e "B" (linha azul), se conseguirmos atender essas necessidades, teremos um túnel que irá comunicar "host" diretamente com "C".

A solução:
1) Em "host" criamos uma conexão SSH utilizando o PuTTY para "A", nessa conexão configuraremos um túnel da seguinte forma:
Source Port: [10080]; Destination: [localhost:10080], esse é o pulo do gato, nessa instância estamos dizendo que todo o tráfego que sair do "host" na porta 10080 será direcionado para localhost (no caso de "A" na porta 10080);
2) Nessa sessão SSH que se abriu em "A" (se tudo correu bem nesse momento você terá um acesso ao terminal da máquina) devemos, então criar um outro túnel, dessa vez apontando a porta 10080 de "A" para a porta 80 de "C". Repare que nesse ponto estamos nos conectando em "B", computador esse que consegue enxergar tanto "A" quanto "C", ou seja, a configuração de túnel funcionará. Nesse camo estamos em ambiente GNU/Linux, devemos executar o seguinte comando:
$ ssh -L 10080:c.dominio.com.br:80 seu_usuario@b.dominio.com.br
Após efetuar autenticação em "B", teremos um túnel efetivo entre "host" e "C", para acessar ao serviço em questão, rodando na porta 80 de "C", devemos acessar o endereço localhost:10080 do "host",  e o tráfego será devidamente redirecionado.

Espero que tenha ficado claro como se cria um túnel de dois saltos, quaisquer dúvidas, podem perguntar pelos comentários.

Leave a Reply