Acessando computadores remotos protegidos por NAT ou firewall com túnel SSH reverso direcionado por DNS dinâmico
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.
Problema a ser resolvido
Não seria ótimo se, ao precisarmos acessar um computador distante, pudéssemos simplesmente iniciar o ssh e voilá... cairmos dentro de nosso amado shell remoto? Infelizmente o mundo não é perfeito e, não raras vezes, nos deparamos com NATs e firewalls que impedem nosso acesso direto.
Quando se tem gerência sobre o roteador ou firewall em questão a solução pode ser até simples: basta direcionar uma porta específica no lado WAN (geralmente a internet) para a máquina desejada na LAN. Quando isso não é possível surge a questão... o que fazer para acessar o tal computador?
Numa série de telecentros que instalamos no interior do Maranhão (Projeto Jovem Cidadão) essa pergunta não queria calar, pois em algumas cidades não existia outro meio de acesso que não fosse via satélite, tirando totalmente de nosso controle direcionar portas para os servidores de thin client que precisávamos gerenciar remotamente.
Uma vez estabelecida a conexão para nossa máquina, podemos iniciar o SSH para uma porta local específica e então "cair" na máquina que desejamos gerenciar através do túnel que havia sido criado pela primeira conexão. Na prática isso funciona assim:
1. No servidor, estabeleça a conexão SSH reversa para o cliente:
ssh -R 9000:localhost:22 usuario@cliente
Esse comando faz com que as conexões à porta 9000 no cliente sejam direcionadas à porta 22 do localhost (servidor), desde que o usuário "usuario" exista e tenha acesso SSH liberado no computador denominado "cliente".
2. No cliente, estabeleça a conexão SSH direta para a porta aberta pelo túnel:
ssh -p 9000 usuario@localhost
Esse comando estabelecerá a conexão SSH à porta local 9000 (no cliente), direcionando todos os seus comandos para a porta 22 do servidor pelo túnel estabelecido anteriormente. Neste caso o usuário "usuario" tem que existir no servidor e possuir nele acesso SSH liberado.
Note que "usuario" não precisa ser o mesmo no servidor e no cliente, utilizei o mesmo nome porque é um exemplo genérico. Da mesma forma a porta utilizada não precisa ser a 9000, mas qualquer porta que não esteja sendo utilizada no computador cliente.
Quando se tem gerência sobre o roteador ou firewall em questão a solução pode ser até simples: basta direcionar uma porta específica no lado WAN (geralmente a internet) para a máquina desejada na LAN. Quando isso não é possível surge a questão... o que fazer para acessar o tal computador?
Numa série de telecentros que instalamos no interior do Maranhão (Projeto Jovem Cidadão) essa pergunta não queria calar, pois em algumas cidades não existia outro meio de acesso que não fosse via satélite, tirando totalmente de nosso controle direcionar portas para os servidores de thin client que precisávamos gerenciar remotamente.
Entendendo a teoria da solução
Após uma boa pesquisa, deparei-me com essa maravilha chamada SSH reverso. Nessa modalidade, quem inicia a conexão SSH não é a sua máquina (cliente) e sim a máquina que desejamos acessar (servidor). É justamente por isso que se consegue bypassar NAT e a maioria das firewalls, pois é bastante comum se bloquear nelas as conexões de entrada, mas não as de saída.Uma vez estabelecida a conexão para nossa máquina, podemos iniciar o SSH para uma porta local específica e então "cair" na máquina que desejamos gerenciar através do túnel que havia sido criado pela primeira conexão. Na prática isso funciona assim:
1. No servidor, estabeleça a conexão SSH reversa para o cliente:
ssh -R 9000:localhost:22 usuario@cliente
Esse comando faz com que as conexões à porta 9000 no cliente sejam direcionadas à porta 22 do localhost (servidor), desde que o usuário "usuario" exista e tenha acesso SSH liberado no computador denominado "cliente".
2. No cliente, estabeleça a conexão SSH direta para a porta aberta pelo túnel:
ssh -p 9000 usuario@localhost
Esse comando estabelecerá a conexão SSH à porta local 9000 (no cliente), direcionando todos os seus comandos para a porta 22 do servidor pelo túnel estabelecido anteriormente. Neste caso o usuário "usuario" tem que existir no servidor e possuir nele acesso SSH liberado.
Note que "usuario" não precisa ser o mesmo no servidor e no cliente, utilizei o mesmo nome porque é um exemplo genérico. Da mesma forma a porta utilizada não precisa ser a 9000, mas qualquer porta que não esteja sendo utilizada no computador cliente.