Desmistificando o Encaminhamento de Porta SSH: Explicação dos Túneis Local, Remoto e Dinâmico

Aprenda encaminhamento de portas SSH local, remoto e dinâmico com comandos práticos para bancos de dados, aplicações web e proxies SOCKS.

Desmistificando o Encaminhamento de Portas SSH: Túneis Local, Remoto e Dinâmico Explicados

O encaminhamento de portas SSH permite que você alcance um serviço de rede através de uma conexão SSH criptografada, em vez de expor esse serviço diretamente. Você geralmente o usará quando um banco de dados, painel ou servidor de desenvolvimento estiver acessível a partir de um host SSH, mas não do seu laptop.

As três formas comuns são encaminhamento local, encaminhamento remoto e encaminhamento dinâmico. Elas usam sintaxe semelhante, mas a porta de escuta fica em um local diferente.

O que o Encaminhamento de Portas SSH Faz

O encaminhamento de portas SSH, também conhecido como tunelamento SSH, redireciona o tráfego de um host e porta para outro host e porta através da sua sessão SSH. O destino é resolvido do lado que faz a conexão final. Para encaminhamento local, o servidor SSH se conecta ao destino. Para encaminhamento remoto, seu cliente SSH se conecta ao destino.

Isso oferece várias vantagens:

  • Segurança: Criptografa o tráfego que, de outra forma, seria não criptografado entre seu cliente e o serviço de destino.
  • Controle de Acesso: Permite acesso a serviços executados em redes privadas ou atrás de firewalls que não são diretamente acessíveis da sua localização atual.
  • Pontes de Rede: Conecta diferentes segmentos de rede de forma segura.

Encaminhamento de Porta Local (-L)

O encaminhamento de porta local é o tipo mais comum. Ele permite encaminhar conexões de uma porta na sua máquina local para uma porta em uma máquina remota, através de um servidor SSH. Essencialmente, você faz um serviço executado na rede remota parecer como se estivesse sendo executado na sua máquina local.

Como funciona:

  1. Você inicia um cliente SSH na sua máquina local.
  2. Você especifica uma porta local (local_port) na qual o SSH escutará.
  3. Qualquer conexão feita a local_port na sua máquina local é encaminhada através da conexão SSH para o remote_host e remote_port.

Sintaxe:

ssh -L [local_bind_address:]local_port:remote_host:remote_port [user@]ssh_server_host
  • local_bind_address: Endereço opcional na sua máquina local para vincular. Se omitido, o OpenSSH normalmente vincula a endereços de loopback, a menos que sua configuração de cliente diga o contrário.
  • local_port: A porta na sua máquina local na qual o SSH escutará.
  • remote_host: O nome do host ou endereço IP da máquina de destino à qual o servidor SSH se conectará.
  • remote_port: A porta no remote_host para a qual o tráfego será direcionado.
  • user@ssh_server_host: Seu nome de usuário e o nome do host/endereço IP do servidor SSH ao qual você está se conectando.

Caso de Uso Prático: Acessar um servidor de banco de dados executado no endereço IP privado de um servidor remoto.

Imagine um servidor de banco de dados (ex.: PostgreSQL em 192.168.1.100:5432) que só é acessível a partir da rede interna da sua empresa. Você pode usar o encaminhamento de porta local para acessá-lo do seu laptop em casa:

ssh -L 5433:192.168.1.100:5432 seu_usuario@seu_servidor_ssh.com
  • Este comando conecta você a seu_servidor_ssh.com.
  • Ele abre a porta 5433 na sua máquina local (localhost por padrão).
  • Qualquer conexão a localhost:5433 será encaminhada através de seu_servidor_ssh.com para 192.168.1.100:5432.

Agora, você pode configurar seu cliente de banco de dados local para conectar a localhost:5433, e o tráfego será tunelado com segurança para o servidor de banco de dados remoto.

Dica: Use ssh -N para criar um túnel sem executar um comando remoto. Isso é útil para túneis em segundo plano.

ssh -N -L 5433:192.168.1.100:5432 seu_usuario@seu_servidor_ssh.com

Encaminhamento de Porta Remoto (-R)

O encaminhamento de porta remoto permite encaminhar conexões de uma porta no servidor SSH remoto para uma porta na sua máquina local ou em outra máquina acessível a partir da sua máquina local. Isso é útil para tornar um serviço executado na sua máquina local acessível ao servidor remoto ou à sua rede.

Como funciona:

  1. Você inicia um cliente SSH na sua máquina local.
  2. Você especifica uma porta remota (remote_port) no servidor SSH na qual o SSH escutará.
  3. Qualquer conexão feita a remote_port no servidor SSH é encaminhada de volta através da conexão SSH para sua máquina local e, em seguida, para um destination_host e destination_port especificados.

Sintaxe:

ssh -R [remote_bind_address:]remote_port:destination_host:destination_port [user@]ssh_server_host
  • remote_bind_address: (Opcional) O endereço no servidor SSH para vincular a porta de escuta. O padrão é localhost (significando que apenas o próprio servidor SSH pode conectar a esta porta). Use 0.0.0.0 ou * para permitir que outras máquinas na rede remota se conectem.
  • remote_port: A porta no servidor SSH na qual o SSH escutará.
  • destination_host: O nome do host ou endereço IP da máquina de destino à qual seu cliente SSH se conectará (geralmente localhost se o serviço estiver na sua máquina local).
  • destination_port: A porta no destination_host para a qual o tráfego será direcionado.
  • user@ssh_server_host: Seu nome de usuário e o nome do host/endereço IP do servidor SSH ao qual você está se conectando.

Caso de Uso Prático: Expor um servidor web local a uma rede remota.

Suponha que você esteja desenvolvendo uma aplicação web no seu laptop e queira demonstrá-la a um colega que só tem acesso à rede interna da sua empresa, e você tem um servidor SSH (seu_servidor_ssh.com) acessível a partir dessa rede.

No seu laptop, você executaria:

ssh -R 8080:localhost:3000 seu_usuario@seu_servidor_ssh.com
  • Este comando conecta você a seu_servidor_ssh.com.
  • Ele instrui seu_servidor_ssh.com a escutar na porta 8080.
  • Qualquer conexão a seu_servidor_ssh.com:8080 será encaminhada de volta através do túnel SSH para seu laptop (localhost) na porta 3000 (onde seu servidor web está sendo executado).

Agora, seu colega pode acessar sua aplicação web navegando para http://seu_servidor_ssh.com:8080 no navegador dele. O tráfego vai do navegador dele para o servidor SSH, através do túnel para seu laptop e, em seguida, para seu servidor web.

Aviso: Em configurações típicas do OpenSSH, a remote_port é acessível apenas a partir do próprio servidor SSH. Para permitir que outras máquinas na rede remota acessem a porta encaminhada, defina explicitamente remote_bind_address como 0.0.0.0 ou * e certifique-se de que o servidor SSH permita isso com uma configuração GatewayPorts como clientspecified ou yes.

ssh -R 0.0.0.0:8080:localhost:3000 seu_usuario@seu_servidor_ssh.com

Encaminhamento de Porta Dinâmico (-D)

O encaminhamento de porta dinâmico cria um proxy SOCKS na sua máquina local. Este é, sem dúvida, o tipo mais flexível, pois permite tunelar qualquer aplicação que suporte proxies SOCKS através da sua conexão SSH. Em vez de encaminhar uma porta específica, o SSH escuta em uma porta local e atua como um servidor proxy SOCKS.

Como funciona:

  1. Você inicia um cliente SSH na sua máquina local.
  2. Você especifica uma porta local (local_port) na qual o SSH escutará como um proxy SOCKS.
  3. Você configura suas aplicações (navegador web, etc.) para usar localhost:local_port como seu proxy SOCKS.
  4. Quando uma aplicação faz uma solicitação através deste proxy, o SSH encaminha o tráfego para o servidor SSH, que então faz a conexão com o destino final em nome da sua aplicação.

Sintaxe:

ssh -D [local_bind_address:]local_port [user@]ssh_server_host
  • local_bind_address: (Opcional) O endereço na sua máquina local para vincular a porta de escuta do proxy SOCKS. O padrão é localhost.
  • local_port: A porta na sua máquina local na qual o SSH escutará como um proxy SOCKS.
  • user@ssh_server_host: Seu nome de usuário e o nome do host/endereço IP do servidor SSH ao qual você está se conectando.

Caso de Uso Prático: Navegar na web com segurança a partir de um Wi-Fi público.

Ao se conectar a uma rede Wi-Fi pública não confiável, seu tráfego fica vulnerável. Você pode usar o encaminhamento de porta dinâmico para tunelar todo o tráfego de navegação da web através de uma conexão SSH criptografada para um servidor confiável.

No seu laptop, execute:

ssh -D 1080 seu_usuario@seu_servidor_confiavel.com
  • Este comando conecta você a seu_servidor_confiavel.com.
  • Ele abre a porta 1080 na sua máquina local, atuando como um proxy SOCKS.

Em seguida, configure seu navegador web ou outra aplicação para usar um proxy SOCKS em localhost na porta 1080. Se a aplicação tiver uma opção de DNS remoto SOCKS5, use-a quando não quiser que as consultas DNS ocorram na sua rede local.

O tráfego do seu navegador é enviado para seu servidor SSH, que então se conecta ao site de destino. HTTPS ainda importa; o túnel SSH protege o caminho até seu servidor SSH, não cada salto após ele.

Dica: Você pode combinar -D com -C para compressão, o que pode ser benéfico em links de rede mais lentos.

ssh -C -D 1080 seu_usuario@seu_servidor_confiavel.com

Considerações Avançadas e Melhores Práticas

  • Configuração do Servidor SSH (sshd_config): Alguns recursos de encaminhamento exigem permissão no lado do servidor. Verifique AllowTcpForwarding, PermitOpen, PermitListen e GatewayPorts antes de assumir que um túnel pode escutar ou conectar em qualquer lugar.
  • Firewalls: Lembre-se de que firewalls no cliente, servidor ou redes intermediárias podem bloquear conexões SSH ou as portas usadas para encaminhamento. Certifique-se de que as portas necessárias (geralmente 22 para o próprio SSH) estejam abertas.
  • Segurança: Embora o encaminhamento de portas criptografe o tráfego, a segurança do túnel depende da segurança do seu servidor SSH. Use chaves SSH fortes, desabilite a autenticação por senha e mantenha seu servidor SSH atualizado.
  • Confiabilidade: Para scripts, adicione -o ExitOnForwardFailure=yes para que o SSH saia se não conseguir criar o encaminhamento solicitado. Para túneis de longa duração, considere autossh ou um serviço supervisionado.

Conclusão

Use -L quando seu laptop precisar alcançar um serviço remoto privado. Use -R quando um host remoto precisar alcançar algo próximo ao seu laptop. Use -D quando você precisar de um proxy SOCKS através de um servidor SSH confiável. Mantenha os vínculos restritos, verifique a política do servidor e trate cada túnel como uma abertura de rede temporária.