Túneis SSH e Redirecionamento de Portas
Nota: Este é o sétimo tutorial da série sobre SSH. Se você perdeu o anterior sobre transferência segura de arquivos, pode encontrá-lo aqui: Transferência Segura de Arquivos com SCP, SFTP e Rsync.
Além do acesso ao shell e da transferência de arquivos, o SSH possui um dos recursos mais flexíveis e poderosos: a capacidade de criar túneis seguros e redirecionar o tráfego de rede entre portas. Isso é conhecido como Port Forwarding ou Tunelamento SSH.
Essa funcionalidade permite acessar serviços de rede em máquinas remotas como se estivessem rodando localmente, expor serviços locais para acesso remoto de forma segura, ou até mesmo rotear todo o seu tráfego de navegação através de um servidor remoto. Vamos explorar os três tipos principais de port forwarding.
1. Local Port Forwarding (ssh -L
)
Conceito: Permite que você acesse um serviço que está rodando em uma máquina remota (ou em uma máquina acessível a partir da máquina remota) conectando-se a uma porta na sua máquina local. O SSH cria um túnel seguro até a máquina remota e redireciona o tráfego da sua porta local para o destino final.
Sintaxe:
1
ssh -L <porta_local>:<host_destino>:<porta_destino> <usuario>@<servidor_ssh_intermediario>
<porta_local>
: A porta na sua máquina local (localhost) que você usará para acessar o serviço. Escolha uma porta livre (acima de 1024 se não for root).<host_destino>
: O endereço IP ou hostname da máquina onde o serviço real está rodando, do ponto de vista do<servidor_ssh_intermediario>
. Pode serlocalhost
se o serviço estiver rodando no próprio servidor intermediário, ou outro IP/hostname acessível por ele.<porta_destino>
: A porta na qual o serviço real está escutando no<host_destino>
.<usuario>@<servidor_ssh_intermediario>
: A máquina SSH à qual você se conecta para estabelecer o túnel.
Exemplo Prático (Arquitetura de Referência):
Queremos acessar um serviço web rodando na VM EVE-NG (IP 192.168.122.50
na rede KVM, porta 80
) a partir da nossa Estação de Trabalho (192.168.0.10
). Não podemos acessar a rede 192.168.122.0/24
diretamente, mas podemos acessar o Servidor KVM (192.168.0.254
), que pode acessar a VM EVE-NG.
Execute o seguinte comando na Estação de Trabalho:
1
2
3
ssh -L 8080:192.168.122.50:80 user_kvm@192.168.0.254
# Ou usando o alias do ~/.ssh/config:
# ssh -L 8080:192.168.122.50:80 kvm-server
-L 8080
: Escutaremos na porta 8080 da nossa máquina local (Estação de Trabalho).192.168.122.50
: O IP da VM EVE-NG (o host de destino final).80
: A porta onde o serviço web está rodando na VM EVE-NG.kvm-server
: O servidor SSH intermediário que usaremos para criar o túnel.
O comando ssh
ficará ativo no terminal (você pode adicionar -N
para não executar um shell remoto e -f
para rodar em background, se quiser). Enquanto ele estiver rodando, abra seu navegador na Estação de Trabalho e acesse:
1
http://localhost:8080
O SSH interceptará a conexão na porta 8080 local, a enviará pelo túnel seguro até o kvm-server
, e o kvm-server
a redirecionará para 192.168.122.50:80
. Você verá a página web da VM EVE-NG!
Casos de Uso Comuns para -L
:
- Acessar interfaces web de administração internas (roteadores, firewalls, aplicações).
- Conectar a bancos de dados remotos (MySQL, PostgreSQL) que não estão expostos publicamente, usando ferramentas de cliente locais (DBeaver, pgAdmin) conectadas a
localhost:<porta_local>
. - Acessar serviços em redes privadas ou atrás de firewalls.
2. Remote Port Forwarding (ssh -R
)
Conceito: É o oposto do Local Port Forwarding. Permite que um serviço rodando na sua máquina local (ou acessível por ela) seja acessado através de uma porta no servidor SSH remoto.
Sintaxe:
1
ssh -R <porta_remota>:<host_local>:<porta_local> <usuario>@<servidor_ssh_remoto>
<porta_remota>
: A porta no<servidor_ssh_remoto>
que escutará por conexões.<host_local>
: O endereço IP ou hostname da máquina onde o serviço local está rodando (geralmentelocalhost
se estiver na mesma máquina que executa o comandossh
).<porta_local>
: A porta onde o serviço local está escutando.<usuario>@<servidor_ssh_remoto>
: O servidor SSH onde a porta remota será aberta.
Exemplo Prático (Arquitetura de Referência):
Temos um servidor web de desenvolvimento rodando na nossa Estação de Trabalho (192.168.0.10
) na porta 3000
. Queremos que colegas na mesma rede (192.168.0.0/24
) possam acessá-lo temporariamente através do Servidor KVM (192.168.0.254
), usando a porta 9090
no KVM.
Execute o seguinte comando na Estação de Trabalho:
1
2
3
ssh -R 9090:localhost:3000 user_kvm@192.168.0.254
# Ou usando o alias:
# ssh -R 9090:localhost:3000 kvm-server
-R 9090
: Abrirá a porta 9090 nokvm-server
.localhost
: O serviço de destino está na máquina local (Estação de Trabalho).3000
: A porta onde o serviço web local está rodando.kvm-server
: O servidor SSH remoto onde a porta 9090 será aberta.
Agora, qualquer conexão feita à porta 9090
no kvm-server
será redirecionada pelo túnel SSH seguro de volta para a porta 3000
na sua Estação de Trabalho.
Importante: GatewayPorts
Por padrão, por segurança, a porta aberta pelo -R
no servidor remoto (9090
no exemplo) só aceita conexões originadas do próprio servidor remoto (localhost
no KVM). Para permitir que outras máquinas na rede do servidor remoto (ex: outros colegas na rede 192.168.0.0/24
) se conectem a essa porta, a diretiva GatewayPorts
no arquivo /etc/ssh/sshd_config
do servidor remoto (o kvm-server
no exemplo) precisa estar configurada como yes
ou clientspecified
.
GatewayPorts no
(Padrão): A porta remota só aceita conexões de localhost no servidor.GatewayPorts yes
: A porta remota aceita conexões de qualquer endereço IP.GatewayPorts clientspecified
: Permite que o cliente SSH (com-R [bind_address:]porta_remota:...
) especifique de qual endereço IP a porta remota deve aceitar conexões.
Se GatewayPorts yes
estiver habilitado no sshd_config
do kvm-server
(e o serviço sshd
reiniciado), seus colegas poderão acessar seu servidor web de desenvolvimento em http://192.168.0.254:9090
.
Casos de Uso Comuns para -R
:
- Expor temporariamente um serviço local (web, API) para demonstração ou teste por terceiros.
- Permitir que um serviço externo acesse um recurso na sua rede local (ex: um webhook).
- Criar “túneis reversos” para acessar máquinas atrás de NAT ou firewalls que bloqueiam conexões de entrada (a máquina interna inicia a conexão
-R
para um servidor externo acessível).
3. Dynamic Port Forwarding (ssh -D
)
Conceito: Transforma seu cliente SSH em um proxy SOCKS local. Qualquer aplicação que suporte proxy SOCKS (a maioria dos navegadores, muitas outras ferramentas) pode ser configurada para enviar seu tráfego através deste proxy local. O cliente SSH então encaminha esse tráfego pelo túnel seguro até o servidor SSH remoto, e o tráfego sairá para a internet (ou rede remota) a partir do servidor SSH.
Sintaxe:
1
ssh -D <porta_local_socks> <usuario>@<servidor_ssh_remoto>
<porta_local_socks>
: A porta na sua máquina local onde o proxy SOCKS será criado (ex:1080
,8080
,9050
).<usuario>@<servidor_ssh_remoto>
: O servidor SSH que atuará como ponto de saída para o tráfego.
Exemplo Prático (Arquitetura de Referência):
Queremos navegar na internet a partir da nossa Estação de Trabalho (192.168.0.10
), mas queremos que todo o tráfego pareça estar saindo do Servidor KVM (192.168.0.254
).
Execute o seguinte comando na Estação de Trabalho:
1
2
3
ssh -D 1080 user_kvm@192.168.0.254
# Ou usando o alias:
# ssh -D 1080 kvm-server
-D 1080
: Cria um proxy SOCKS na porta 1080 local.kvm-server
: O servidor SSH através do qual o tráfego será roteado.
Agora, você precisa configurar sua aplicação (ex: navegador Firefox, Chrome, ou as configurações de proxy do sistema operacional) para usar um proxy SOCKS (versão 4 ou 5) no endereço localhost
(ou 127.0.0.1
) e porta 1080
.
Uma vez configurado, todo o tráfego da sua aplicação passará pelo túnel SSH até o kvm-server
e sairá para a internet a partir do IP do kvm-server
. Se você verificar seu endereço IP público (ex: em sites como ifconfig.me
), verá o IP do kvm-server
, não o da sua Estação de Trabalho.
Casos de Uso Comuns para -D
:
- Bypass de Censura/Restrições Geográficas: Acessar conteúdo como se estivesse na localização do servidor SSH remoto.
- Segurança em Redes Wi-Fi Públicas: Criptografar todo o seu tráfego de navegação através do túnel SSH até um servidor confiável, protegendo-o de bisbilhoteiros na rede local insegura.
- Acesso a Recursos Internos: Usar o proxy SOCKS para acessar múltiplos serviços na rede remota sem precisar criar um túnel
-L
para cada um.
Considerações Adicionais
- Múltiplos Túneis: Você pode especificar múltiplas flags
-L
,-R
ou-D
no mesmo comandossh
para criar vários túneis simultaneamente. - Background e Sem Shell: Use as flags
-f
(fork para background após autenticação) e-N
(não execute um comando remoto, útil apenas para forwarding) para manter os túneis ativos sem ocupar um terminal.1
ssh -f -N -L 8080:host:80 -R 9090:localhost:3000 -D 1080 user@server
~/.ssh/config
: Você também pode definir port forwarding diretamente no seu arquivo de configuração usando as diretivasLocalForward
,RemoteForward
eDynamicForward
.- Segurança: Esteja ciente das implicações de segurança, especialmente com
RemoteForwarding
eGatewayPorts yes
, pois você está expondo serviços. Use autenticação forte e firewalls adequados.
Conclusão
O tunelamento SSH (Port Forwarding) é uma ferramenta extraordinariamente versátil que expande enormemente as capacidades do SSH além do simples acesso ao shell. Seja para acessar serviços remotos de forma segura (-L
), expor serviços locais (-R
) ou criar um proxy SOCKS seguro (-D
), o port forwarding oferece soluções elegantes para uma variedade de desafios de rede.
Compreender e utilizar esses três tipos de túneis abre um leque de possibilidades para administradores de sistemas, desenvolvedores e usuários preocupados com a segurança e a flexibilidade no acesso a recursos de rede.
No próximo tutorial, abordaremos o gerenciamento de chaves SSH de forma mais eficiente usando o ssh-agent
e o keychain
.