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:
- Abre uma conexão TCP com o servidor SSH (porta 22 por padrão)
- Estabelece autenticação
- Cria canais internos multiplexados
- 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âmetro | Função |
|---|---|
-L | Local Port Forwarding |
-R | Remote Port Forwarding |
-D | Dynamic Port Forwarding (SOCKS) |
-N | Não executa shell remoto |
-f | Executa em background |
-T | Desativa pseudo-terminal |
-i | Define chave privada |
-p | Porta SSH customizada |
-o | Opçõ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 computadordestino→ Host acessível a partir do servidor SSHporta_destino→ Porta do serviço remotousuario@servidor→ Servidor que intermedia o túnel
Exemplo técnico
ssh -L 3307:localhost:3306 user@server.example.com
Interpretação:
- Abre
localhost:3307na sua máquina - Encaminha para
localhost:3306visto 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 remotodestino→ Host acessível a partir do clienteporta_destino→ Porta no cliente
Exemplo prático
ssh -R 9090:localhost:8080 user@server.example.com
Significado:
- Abre
localhost:9090no servidor remoto - Encaminha para
localhost:8080na 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.0permite 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ção | Função |
|---|---|
ServerAliveInterval | Envia keepalive |
ExitOnForwardFailure | Fecha se túnel falhar |
StrictHostKeyChecking | Validação da chave do host |
ConnectTimeout | Timeout 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