Usando SSH para acessar máquinas de uma rede interna

Um problema freqüente é termos uma máquina em uma rede interna, a qual não conseguimos acessar da internet. Por exemplo, eu moro em um prédio, utilizo DirectNet e portanto não posso acessar minha máquina de casa via internet. Outro exemplo seria você não conseguir acessar sua máquina no trabalho pois esta está atrás de um firewall.

Porém se você possui uma máquina com acesso externo e um servidor SSH tudo pode ser resolvido utilizando Redirecionamento de Portas (Port Forwarding).

O procedimento é bem simples, na máquina interna (inacessível na internet), execute o comando:

  ssh -C -R \
          $REMOTE_PORT_FW:$LOCAL_HOST:$LOCAL_PORT \
          $REMOTE_USER@$REMOTE_HOST \
          -o CompressionLevel=9 \
          -n sleep 365d

No qual:

$REMOTE_PORT_FW
Porta na máquina remota, acessível na internet, a qual vai receber as conexões a redirecionar

$LOCAL_HOST
Nome da máquina ou IP na rede interna, possivelmente inacessível via internet, pode ser algo como 192.168.1.1 caso este seja um IP acessível na máquina em que este comando foi executado. As conexões serão redirecionadas para esta máquina.

$LOCAL_PORT
Porta na máquina $LOCAL_HOST que receberá as conexões redirecionadas.

$REMOTE_USER
Usuário de ssh na máquina $REMOTE_HOST

$REMOTE_HOST
Máquina com servidor de ssh que pode ser acessada pela máquina interna, na qual será executado o comando.

Exemplo

Vamos supor que você tenha uma máquina no trabalho que seja inacessível de casa pois ela está em uma intranet, atrás de um firewall, etc. Esta máquina tem o IP 10.0.0.123.

Na sua casa você tem um servidor de ssh, o qual consegue acessar do trabalho. Suponhamos que você tenha um nome minha-casa.no-ip.com para esta máquina, no trabalho você consegue acessar com:

trabalho$ ssh usuario-casa@minha-casa.no-ip.com

Portanto suas variáveis para o comando devem ser:

  LOCAL_HOST=10.0.0.123
  LOCAL_PORT=22
  REMOTE_PORT_FW=8822
  REMOTE_HOST=minha-casa.no-ip.com
  REMOTE_USER=usuario-casa

Na máquina no trabalho execute o comando:

  LOCAL_HOST=10.0.0.123
  LOCAL_PORT=22
  REMOTE_PORT_FW=8822
  REMOTE_HOST=minha-casa.no-ip.com
  REMOTE_USER=usuario-casa
  
  ssh -C -R \
          $REMOTE_PORT_FW:$LOCAL_HOST:$LOCAL_PORT \
          $REMOTE_USER@$REMOTE_HOST \
          -o CompressionLevel=9 \
          -n sleep 365d

Agora você poderá, em sua casa acessar o trabalho com:

casa$ ssh -p8822 usuario-trabalho@localhost

Isso irá pegar a conexão a localhost:8822 na sua casa, redirecionar para 10.0.0.123:22 no seu trabalho.

Caso você quisesse acessar o servidor de emails interno (IP: 10.0.0.2, Porta: 110) da sua empresa, você poderia fazer:

  LOCAL_HOST=10.0.0.2
  LOCAL_PORT=110
  REMOTE_PORT_FW=88110
  REMOTE_HOST=minha-casa.no-ip.com
  REMOTE_USER=usuario-casa
  
  ssh -C -R \
          $REMOTE_PORT_FW:$LOCAL_HOST:$LOCAL_PORT \
          $REMOTE_USER@$REMOTE_HOST \
          -o CompressionLevel=9 \
          -n sleep 365d

e então configurar seu cliente de email para verificar sua caixa postal em localhost:88110.

Dica para usuários de Speedy & Afins

Os usuários de Speedy e outros que bloqueiam portas baixas devem mudar um pouco o comando. Primeiramente deve-se alterar as configurações do servidor de ssh para que este utilize outra porta que não a 22 (vide arquivo /etc/init.d/sshd). Depois mude o comando supra citado e adicione o parâmetro -p$REMOTE_PORT, com $REMOTE_PORT sendo a porta escolhida.

Download

Você pode obter um script que auxilia a manter a conexão aberta em: http://www.gustavobarbieri.com.br/inverse-ssh.sh

A versão mais atual desta página está em http://www.gustavobarbieri.com.br/linux_help/inverse-ssh.html