Túnel SSH

Imagine que você é o Super Mario e que resgatar a princesa dentro da fortaleza do Koopa. No entanto, ela descobre que é mais fácil fugir pelos encanamentos de dentro da fortaleza do que você entrar. Esse pode ser o tipo de situação que você pode encontrar ao tentar acessar seu computador na empresa, cercado por roteadores e firewalls, e o computador de sua casa, com uma ligação mais simples na internet. Ou seja, você consegue conectar no seu computador de casa a partir da empresa, mas tem muitos problemas em tentar o inverso.

Composição de cena do jogo Super Mario Bros.

Continuando a analogia com o Super Mario, o Koopa não vai deixar mexer nas configurações de acesso da fortaleza (firewall, configuração de portas, etc) nem vai te dar um passe livre de entrada (VPN). Só resta criar um encanamento de dentro para fora da fortaleza, o que no jargão é chamado de túnel. Uma vez aberto, é possível transitar em ambos os sentidos desse túnel. O firewall não permite tráfego proveniente de Internet para a rede interna, exceto o tráfego iniciado anteriormente.

Para criar a ligação entre o interior e o exterior da fortaleza, a princesa precisa colocar uma ponta do túnel na fortaleza, com a outra ponta direcionada para o Super Mario. Como a fortaleza tem um complexo sistema de encanamentos, ela precisa escolher um número para identificá-lo e colocar esse número na ponta do cano que vai até o Mario. Veja como fica o comando SSH executado no computador “pc_fortaleza” para criar o túnel entre o computador atrás do firewall (chamado de pc_fortaleza) e o computador com IP público (chamado de pc_mario):

ssh -R 5555:localhost:22 mario@pc_mario

O parâmetro “-R” indica para criar um redirecionamento com túnel reverso (“reverse port forwarding”); o número “5555” é o exemplo de uma porta qualquer para direcionar o tráfego; “localhost” indica que o destino do túnel está no próprio computador; “22” é a porta de serviço (no caso, SSH usa porta 22 por padrão); depois, vem o nome do usuário no pc_mario e o IP (ou nome) do pc_mario. Finalize o comando digitando a senha desse usuário no pc_mario.

Agora, o Mario finalmente vai entrar na fortaleza, bastando saber o número do encanamento. No pc_mario, execute o seguinte comando:

ssh -p 5555 princesa@localhost

O parâmetro “-p” indica a porta configurada para acessar o túnel; depois, vem o usuário do pc_fortaleza e “localhost” (já que a ponta do túnel está no pc_mario). Finalize o comando digitando a

Automatizando a tarefa

Caso alguém dê reset no jogo, digo, reinicie o sistema ou dê algum problema na conexão, esse túnel desaparece. Para que não seja necessário digitar senhas e digitar novamente os comandos, serão incluídos uma chave pública, incluídos alguns parâmetros e criado um script para ficar rodando no crontab para manter a conexão de pé.

É praticamente obrigatório criar as chaves pública e privada no pc_mario para deixar no pc_fortaleza, já que não terá acesso frequente a ele para ficar digitando a senha; já no pc_mario, é opcional deixar a chave do pc_fortaleza. Então, execute o seguinte comando no(s) computadore(s):

ssh-keygen -t ed25519

O parâmetro “-t” indica o algoritmo utilizado. Ao executar o comando, será pedido o nome do arquivo para gravar as chaves (digite pc_mario ou pc_fortaleza, conforme onde estiver) e então poderá ser digitada uma senha (dê ENTER duas vezes sem escrever nada). São gerados dois arquivos: a chave privada e a chave pública (termina com “.pub”). Copie o arquivo da chave pública para o outro computador

Você pode incluir todo o seu conteúdo no final do arquivo de computadores autorizados. Veja esse exemplo de uma chave criada no pc_mario incluída na lista do pc_fortaleza, este acessado com o usuário “princesa”:

cat pc_mario.pub >> ~/.ssh/authorized_keys

Para manter a conexão, pode-se criar esse script no pc_fortaleza, com o comando SSH definido na variável COMMAND:

#!/bin/bash
COMMAND="ssh -N -f -R 5555:localhost:22 mario@pc_mario -i pc_mario.pub"
pgrep -f -x "$COMMAND" > /dev/null 2>&1 || $COMMAND

Note que foram adicionados três parâmetros ao comando principal: “-N” serve para apenas redirecionar portas (sem executar comandos), “-f” executa o comando em background e “-i” serve para entrar o nome do arquivo contendo a chave pública.

Já o comando “pgrep” examina os processos atualmente em execução e lista as IDs do processo que correspondem aos critérios de seleção para stdout. Nesse caso, é o comando SSH, com os parâmetros “-f” (procura somente pelo nome do processo) e “-x” (nome exato). A saída (tanto normal quanto de erros) é direcionada para /dev/null, sendo portanto negligenciada. O “double pipe” serve para, se o comando antes do “||” falhar, então executar o que vem depois do “||”.

Supondo que o script acima tenha o nome “tunel.ssh” e será executado a cada 5 minutos, icnlua a seguinte linha no crontab ddo usuário “princesa” através do comando “crontab -e” no pc_fortaleza:

*/5 * * * * /bin/bash /home/princesa/tunel.sh

Desse modo, o túnel é recriado automaticamente caso ele seja destruído e o acesso do pc_fortaleza a partir do pc_mario fica garantido. Outra opção é usar o autossh – veja mais clicando no link.

Mario e seu IP/domínio público

Como o Mario vive mudando de fantasia, pode ser que a princesa não o reconheça – mas mesmo assim não deixa de ser o Mario. Além disso, podem haver um ou mais “paragoomba” (roteadores) pelo caminho, que podem ser derrotados usando uma “Invincible Stars” (IPv6).

Assim, se o pc_mario tiver IP dinâmico, é preciso criar um domínio para localizar seu PC na internet (veja mais no post Como acessar pc remoto com IP dinâmico). Os comandos continuam iguais, mas em vez de usar o número de IP ou o hostname, use o domínio cadastrado (pcmario.duckdns.org, por exemplo).

Também será necessário configurar um ou mais roteadores entre o seu computador e a internet (mais detalhes no post) ou usar um IPv6 (cada computador tem um), mas é preciso ver se o serviço de nomes (no-ip, duckDNS, etc) tem suporte a IPv6 e também verificar as portas liberadas do(s) roteadore(s).

Caso não tenha acesso à página do roteador, o protocolo “upnp” permite abrir portas no roteador a partir do terminal com o programa upnpc – veja mais clicando no link.

Fontes

Leave a Reply

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Esse site utiliza o Akismet para reduzir spam. Aprenda como seus dados de comentários são processados.