Skip to main content

SSH Tunnel | Solyd One

  • SSH Tunnel | Solyd One

O que é um túnel SSH

Um túnel SSH é um mecanismo de port forwarding criptografado implementado pelo protocolo SSH (Secure Shell). Ele permite encapsular conexões TCP dentro de uma sessão SSH autenticada e cifrada.

Tecnicamente, o cliente SSH:

  1. Abre uma conexão TCP com o servidor SSH (porta 22 por padrão)
  2. Estabelece autenticação
  3. Cria canais internos multiplexados
  4. Encaminha tráfego TCP através desses canais

O tráfego transportado dentro do túnel fica protegido por:

  • Criptografia simétrica
  • Troca de chaves segura
  • Autenticação do servidor
  • Opcionalmente autenticação por chave pública

Estrutura Geral do Comando SSH

Sintaxe base:

ssh [OPÇÕES] usuario@host

Quando usamos túnel:

ssh -L [bind_address:]porta_local:destino:porta_destino usuario@host
ssh -R [bind_address:]porta_remota:destino:porta_destino usuario@host
ssh -D [bind_address:]porta_local usuario@host

Principais parâmetros relacionados a túnel:

ParâmetroFunção
-LLocal Port Forwarding
-RRemote Port Forwarding
-DDynamic Port Forwarding (SOCKS)
-NNão executa shell remoto
-fExecuta em background
-TDesativa pseudo-terminal
-iDefine chave privada
-pPorta SSH customizada
-oOpções avançadas do SSH

1. Túnel Local (Local Port Forwarding)

Sintaxe detalhada

ssh -L [bind_address:]porta_local:destino:porta_destino usuario@servidor

Explicação dos campos

  • bind_address → Interface local onde a porta será aberta (opcional)
  • porta_local → Porta no seu computador
  • destino → Host acessível a partir do servidor SSH
  • porta_destino → Porta do serviço remoto
  • usuario@servidor → Servidor que intermedia o túnel

Exemplo técnico

ssh -L 3307:localhost:3306 user@server.example.com

Interpretação:

  • Abre localhost:3307 na sua máquina
  • Encaminha para localhost:3306 visto do servidor remoto
  • O MySQL roda no servidor remoto
  • Comunicação é criptografada pelo SSH

Conexão local:

mysql -h 127.0.0.1 -P 3307 -u root -p

Usando parâmetros adicionais

ssh -N -f -L 3307:localhost:3306 user@server.example.com
  • -N → Não executa shell
  • -f → Envia processo para background
  • Ideal para uso apenas como túnel

2. Túnel Remoto (Remote Port Forwarding)

Sintaxe detalhada

ssh -R [bind_address:]porta_remota:destino:porta_destino usuario@servidor

Interpretação

  • porta_remota → Porta aberta no servidor remoto
  • destino → Host acessível a partir do cliente
  • porta_destino → Porta no cliente

Exemplo prático

ssh -R 9090:localhost:8080 user@server.example.com

Significado:

  • Abre localhost:9090 no servidor remoto
  • Encaminha para localhost:8080 na sua máquina local

Agora, no servidor remoto:

curl http://localhost:9090

Isso acessará seu servidor local.

Parâmetro bind_address

ssh -R 0.0.0.0:9090:localhost:8080 user@server.example.com
  • 0.0.0.0 permite acesso externo
  • Necessário configurar no servidor:
GatewayPorts yes

Caso contrário, a porta ficará disponível apenas em localhost remoto.


3. Túnel Dinâmico (SOCKS Proxy)

Sintaxe

ssh -D [bind_address:]porta_local usuario@servidor

Funcionamento

  • Cria um proxy SOCKS5 local
  • O cliente decide dinamicamente o destino
  • Ideal para navegação segura

Exemplo

ssh -D 1080 user@server.example.com

Configuração no navegador:

  • Proxy SOCKS5
  • Host: 127.0.0.1
  • Porta: 1080

Todo tráfego TCP suportado pelo SOCKS passa pelo servidor SSH.


Parâmetros Avançados Importantes

-N

ssh -N -L 8080:intranet:80 user@gateway
  • Não abre shell remoto
  • Reduz superfície de ataque

-f

ssh -f -N -L 8080:intranet:80 user@gateway
  • Executa em background
  • Requer autenticação sem senha

-T

Desativa pseudo-terminal.

Útil para automação:

ssh -T -N -L 8080:intranet:80 user@gateway

-i

Define chave privada específica:

ssh -i ~/.ssh/id_ed25519 -L 8080:intranet:80 user@gateway

-p

Define porta SSH customizada:

ssh -p 2222 -L 8080:intranet:80 user@gateway

-o (Opções avançadas)

Exemplo:

ssh -o ServerAliveInterval=60 -o ExitOnForwardFailure=yes \
-L 8080:intranet:80 user@gateway

Principais opções:

OpçãoFunção
ServerAliveIntervalEnvia keepalive
ExitOnForwardFailureFecha se túnel falhar
StrictHostKeyCheckingValidação da chave do host
ConnectTimeoutTimeout de conexão

Arquivo ~/.ssh/config

Configuração estruturada:

Host tunnel-db
HostName server.example.com
User user
LocalForward 3307 localhost:3306
ServerAliveInterval 60
ExitOnForwardFailure yes

Uso:

ssh -N tunnel-db

Vantagens:

  • Reutilização
  • Padronização
  • Redução de erro humano

Fluxo de Encaminhamento (Visão Técnica)

Túnel Local

Cliente → (porta_local) → SSH → Servidor → destino:porta_destino

Túnel Remoto

Servidor → (porta_remota) → SSH → Cliente → destino:porta_destino

Túnel Dinâmico

Cliente → SOCKS Proxy → SSH → Destino arbitrário