Com esse artigo pretendo mostrar uma maneira prática de acessar computadores protegidos por uma firewall ou NAT. Isso é muito útil nos casos em que não é possível - ou não se tem o controle para - efetuar um direcionamento de portas para a máquina desejada. É apresentado ainda um script que, utilizando DNS dinâmico, permite estabelecer essa conexão de qualquer lugar.
Se tudo correu bem, o servidor tentará se conectar ao cliente apontado pelo DNS dinâmico de 1 em 1 minuto. Como a chave pública do usuário tunnel está cadastrada na máquina cliente, a conexão deve ser estabelecida automaticamente, deixando o túnel pronto para você se conectar ao servidor remoto. Podemos verificar se a conexão foi efetuada listando os sockets ocupados máquina cliente (supondo a porta 9000):
socklist | grep 9000
Note que, para ter acesso ao servidor, você deve ter sua própria chave pública cadastrada para o usuário que você deseja assumir nele. Suponho que você já saiba fazer isso para uma conexão SSH direta, então não vou entrar em detalhes. Para efetuar a conexão, basta então rodar o ssh para a porta especificada do localhost, que é a ponta "de cá" do túnel, porém usando o usuário "do lado de lá".
Para esclarecer, digamos que tenho um usuário "claudio" no servidor, para o qual já cadastrei minha chave pública, e que a porta definida para conexão seja a 9000. Assim, para efetuar a conexão pelo cliente, basta executar o seguinte comando:
ssh -p9000 claudio@localhost
Se você quiser acessar o mesmo servidor a partir de outra máquina cliente, você deve repetir o procedimento de configuração do cliente para essa outra máquina, e então alterar o DNS dinâmico para que o hostname apontado por ele corresponda ao IP do novo cliente.
Espero que este artigo ajude a outros que também tenham esbarrado nesse problema incômodo e cada vez mais frequente. :)
[1] Comentário enviado por andre.vmatos em 21/11/2008 - 16:50h
Hhmmm. Muito boa a dica. Suponho que vc deve ter aprendido isso no artigo do GdH. Se sim, acredito que seria justo colocar os creditos. De qualquer forma, muito bom e muito completo mesmo seu artigo. Parabéns.
[5] Comentário enviado por chffelix em 21/11/2008 - 19:14h
Inicialmente, gostaria de agradecer o incentivo de todos. É um imenso prazer poder contribuir para essa comunidade maravilhosa, na qual a troca de conhecimento é feita de forma tão natural e visando o bem comum.
Gostaria apenas de responder o questionamento do nosso colega andre.vmatos, sobre os supostos créditos "devidos" ao GdH. Vocês devem ter reparado que coloquei três referências ao final do meu artigo. Pois bem, a primeira delas foi a principal, que eu realmente usei como base para minha solução em 2006, quando enfrentamos esse problema na prática. Reparem inclusive que meu script se parece com o dele, guardando minhas adaptações específicas. As referências seguintes servem apenas como outras fontes que os interessados podem pesquisar para comparar e realmente entender o que está sendo feito. Em nenhum momento sequer soube da existência desse artigo do GdH, tendo-o visto pela primeira vez agora com esse comentário.
Resumindo, não vou adicionar o crédito pois realmente não é devido. Apesar de desconfiar que o comentário não teve essa intenção, achei bastante deselegante a suposição, pois lança dúvidas sobre um trabalho autêntico e que comecei a escrever desde outubro de 2007, quando então se tinha muito menos material sobre o assunto.
Bom, é isso aí. Espero que a informação seja útil e obrigado a todos novamente pela atenção e incentivo.
[8] Comentário enviado por wagner_guitar em 22/11/2008 - 11:05h
Desculpe a minha ignorancia mais na parte do comando >>
$ ssh -R 9000:localhost:22 usuario@cliente
o usuario (usuario@) é o nome do host ou o ip ,e sobre o cliente tenho a mesma duvida...
tipo tenho um host cujo nome do usuario seja Brasil@... , e o ip dele seja 200.200.200.200 onde ficaria o Brasil e onde ficaria o 200.200.200.200 no comando $ ssh -R 9000:localhost:22 usuario@cliente
?????
Desde ja agradeco....
[9] Comentário enviado por chffelix em 22/11/2008 - 12:11h
Olá Wagner, sem problema, estamos aqui pra aprender mesmo :)
Nesse comando que você está em dúvida, "usuario" é o nome do usuário existente na máquina cliente (aquela em que você vai estar logado), sendo este responsável apenas por "atender" o pedido de criação do tunel. Já "cliente" seria o hostname ou IP do cliente, novamente, da máquina onde você está. Esse comando aí deve ser executado no servidor, que é a máquina remota que você deseja acessar. Por isso tem todo esse esquema para esse comando ser executado automaticamente, pois você não vai estar lá pra fazer isso, certo?
Para adaptar o negócio ao seu exemplo, você deve considerar outra máquina. Por exemplo.. você está logado na máquina 200.200.200.200, mas você quer acessar a 100.100.100.100. Então, nessa última você rodaria:
ssh -R 9000:localhost:22 brasil@200.200.200.200
Uma vez estabelecida a conexão (a pessoa em 100.100.100.100 teria que saber a senha de brasil ou ter sua chave pública cadastrada para ele), você pode então se conectar ao servidor. Digamos que o usuário que você deseja acessar em 100.100.100.100 seja wagner. Assim, estando em 200.200.200.200, você deverá executar esse comando:
ssh -p9000 wagner@localhost
Pronto! Você vai cair no shell de 100.100.100.100, com usuário wagner.
[10] Comentário enviado por wagner_guitar em 22/11/2008 - 13:59h
Nao muito,desculpe
tipo tanto "usuario" quanto "cliente" vao ser da maquina remota??
mas eu nao tenho acesso nenhum a maquina remota.
o meu problema é o seguinte : sou cliente de uma rede wireless ( radio),gostaria de acessar o roteador da minha rede para abrir algumas portas, é que gostaria de baixar uns torrents, mas acho q as portas estao fechadas, ai so consigo baixar a 1.,3kbps no maximo. Mas nao sei o login do roteador . Gostaria de resolver isso , se vc souber como eu posso fazer isso gostaria q me ajudasse...
[11] Comentário enviado por chffelix em 22/11/2008 - 17:03h
Wagner, o que descrevi no artigo é apenas para o caso de querer acessar uma máquina remota que está numa rede sem acesso de fora pra dentro. Se você quer apenas se logar no roteador da sua rede e você não tem acesso a ele esse procedimento infelizmente não vai lhe ajudar. Para fazer o que você quer, vai ter que conseguir a senha do roteador e fazer um direcionamento de portas nele mesmo, do lado WAN para o IP da sua máquina no lado LAN.