Recentemente me deparei com um problema para criar um servidor web em casa usando um computador velho, então resolvi escrever sobre o Carrier Grade NAT (CGNAT), que é o que impossibilita o roteamento de portas e o acesso externo a servidores/serviços web caseiros. Felizmente existe uma maneira de contornar essa situação utilizando o protocolo SSH para encaminhar portas para um servidor com acesso externo para web, chamamos isso de SSH Tunnel.

Pré-requisitos

Começando…

Você tem um servidor web no seu computador da sua casa e você gostaria de conseguir acessar ele fora da sua rede local, para isso você vai precisar ter alguma máquina que possua acesso externo, por exemplo, um droplet básico na digitalocean (5 doletas mensais) que já vem com SSH instalado e habilitado por padrão, você pode consultar também os serviços da Amazon e Google cloud, eles oferecem alguns limites gratuitos e até um crédito inicial para usar.

Para não causar confusão, nesse tutorial sempre que eu me referir a servidor, estou falando da máquina que tem um IP com acesso externo, ou seja, a máquina criada em algum provedor cloud como citamos acima.

Configurando o servidor SSH

Supondo que você está utilizando um servidor linux, Ubuntu por exemplo, precisaremos editar algumas configurações no arquivo /etc/ssh/sshd_config, procure pela linha contendo as propriedades AllowTcpForwarding e GatewayPorts para yes. E então você precisará restartar o servidor SSH:

sudo systemctl restart sshd
sudo service sshd restart

Encaminhando Portas Remotas

Imagine que você tem um servidor em sua casa e você precisa acessar ele externamente, fora da sua rede local. Para isso vamos usar a funcionalidade de “Encaminhamento de Porta Remota”, basicamente vamos criar um túnel, uma conexão com o computador que queremos que tenha acesso externo no servidor que tem acesso externo, esse servidor vai atuar com o que chamamos de proxy, ele apenas vai receber e rotear por esse túnel as requisições. Para isso vamos usar o seguinte comando:

$ ssh -R porta_remota:endereco_local:porta_local [email protected]

Então, supondo que temos o nosso servidor web rodando na porta 6060 e deixar esse servidor acessível pela porta 8080 do servidor externo, usaríamos o seguinte comando:

$ ssh -R 8080:localhost:6060 [email protected]

Se tudo der certo, agora quando a gente acessar o servidor pela URL marquesfernandes.com:8080 (poderia ser um IP também), a requisição vai ser roteada para a porta 6060 da máquina local e a resposta devolvida para o usuário.

Encaminhando Portas Locais

Imagine que você tem um banco de dados MySQL na rede de seu escritório que só permite conexões locais, e você deseja acessar esse banco por uma porta local em seu computador. Usamos o seguinte comando:

ssh -L 4000:127.0.0.1:3306 [email protected]

Isso fará um ligação para a porta 4000 no seu computador. Qualquer requisição que chegar nessa porta será encaminhada para a porta 3306 do servidor externo, agora você pode conectar seu cliente MySQL localmente na porta 4000.

Auto SSH

Se você deseja manter o seu SSH Tunnel sempre ativo, restartando em caso de desconexão, use o programa Auto SSH. Ele permite que você monitore túneis SSH e cuida de todo o trabalho de reiniciar em caso de queda, você pode inclusive deixar ele rodando como um serviço da sua máquina para máxima persistência.

Author

Um nerd nada tradicional… Desenvolvedor web full-stack, escritor amador e inventor nas horas vagas. Apaixonado por tecnologia e entusiasmado por projetos de código aberto!