Guia prático de túneis SSH: encaminhamento de portas local e remoto
(labs.iximiuz.com)Visão geral resumida
- Túneis SSH são uma técnica para acessar com segurança serviços que não podem ser acessados diretamente de fora, ou para expor temporariamente serviços internos ao exterior.
- O encaminhamento de portas no SSH se divide principalmente em encaminhamento local, encaminhamento remoto, encaminhamento local dinâmico e encaminhamento remoto dinâmico.
-Lfaz o cliente SSH local abrir uma porta, e-Rfaz o servidor SSH remoto abrir uma porta.- Com um Bastion Host, é possível se conectar não só ao próprio servidor SSH, mas também a outros serviços de rede privada que esse servidor consegue acessar.
- O encaminhamento dinâmico não fixa um destino específico; ele cria um proxy SOCKS para permitir acesso a vários hosts e portas.
- Para expor o encaminhamento remoto à rede externa, é preciso revisar a configuração
GatewayPortsdo servidor SSH.
Introdução
Objetivo dos túneis SSH
-
O SSH, além de executar comandos remotos, também oferece a função de túnel para transmitir tráfego de rede de forma criptografada.
-
Sem VPN separada nem programa de proxy dedicado, é possível acessar redes privadas e expor serviços usando apenas o comando padrão do SSH.
-
Casos de uso típicos incluem:
- acessar serviços internos de uma VPC por meio de um servidor público
- abrir no navegador do PC do usuário uma porta local de um servidor de desenvolvimento remoto
- expor temporariamente ao exterior um serviço residencial ou de rede privada
- conectar a porta de depuração do navegador local a um agente de desenvolvimento remoto
-
Ao entender túneis SSH, é preciso distinguir duas coisas:
- qual máquina abre uma nova porta e fica aguardando conexões
- de qual máquina, na prática, o tráfego que passou pelo túnel acessa o destino
Desenvolvimento
O encaminhamento local conecta um serviço remoto ao ambiente local
- O encaminhamento de porta local conecta um servidor remoto, ou um serviço acessível a partir dele, a uma porta local no PC do usuário.
- A estrutura básica do comando é a seguinte.
ssh -L [local_addr:]local_port:remote_addr:remote_port [user@]sshd_addr
-
O cliente SSH fica aguardando conexões em
local_portno PC do usuário. -
O tráfego que entra nessa porta é enviado por meio do túnel SSH para
remote_addr:remote_port. -
O acesso ao destino final ocorre da perspectiva da rede onde está o servidor SSH.
-
Casos de uso comuns incluem:
- conexão com MySQL, PostgreSQL e Redis remotos
- acesso a aplicações web abertas apenas dentro de uma rede privada
- acesso a portas de contêineres não expostas na interface externa do servidor
Bastion Host intermedeia o acesso à rede privada
-
remote_addresshd_addr, que é o alvo da conexão SSH, não precisam ser a mesma máquina. -
Se o servidor SSH conseguir acessar outros serviços internos, ele pode ser usado como ponto de intermediação.
-
Esse tipo de servidor intermediário é chamado de Bastion Host ou Jump Host.
-
A estrutura de conexão mais comum é a seguinte:
- o PC do usuário se conecta por SSH a um Bastion Host público
- o Bastion Host encaminha o tráfego para serviços internos da VPC aos quais ele tem acesso
-
Isso permite acessar bancos de dados, clusters de busca e APIs internas que não estão expostos publicamente.
O encaminhamento remoto expõe um serviço local no lado remoto
- O encaminhamento de porta remoto conecta um serviço do PC do usuário ou da rede interna a uma porta em um servidor SSH externo.
- A estrutura básica do comando é a seguinte.
ssh -R [remote_addr:]remote_port:local_addr:local_port [user@]gateway_addr
-
O servidor SSH remoto abre
remote_porte fica aguardando conexões. -
O tráfego que entra nessa porta é encaminhado pelo túnel SSH para
local_addr:local_portno lado do cliente SSH. -
Casos de uso comuns incluem:
- expor um servidor de desenvolvimento em execução no notebook para demos externas
- disponibilizar um serviço de homelab para acesso pela internet
- oferecer a porta de depuração do navegador local a um ambiente remoto de desenvolvimento
A exposição externa exige configuração de GatewayPorts
- Na configuração padrão, a porta de encaminhamento remoto pode ficar vinculada apenas ao
localhostdo servidor SSH. - Nesse caso, o serviço pode ser acessado dentro do servidor remoto, mas não de fora.
- Para permitir acesso via IP público do servidor remoto, é preciso revisar a seguinte configuração em
sshd_config.
GatewayPorts yes
- Como essa configuração pode expor a porta em interfaces externas, ela deve ser usada junto com firewall e controle de acesso.
- Expor um serviço de desenvolvimento diretamente à internet pública pode aumentar o risco de acesso não autenticado ou de ataques.
A máquina local pode se tornar um Jump Host da rede privada
-
O destino do encaminhamento remoto não se limita à própria máquina onde o cliente SSH está em execução.
-
Se o PC do usuário conseguir acessar outro servidor da rede doméstica, a porta desse servidor interno também poderá ser exposta por meio do servidor SSH remoto.
-
Nesse caso, o PC do usuário se torna um equipamento intermediário que conecta as duas redes abaixo:
- a rede doméstica ou rede privada de desenvolvimento
- o servidor público de gateway SSH
-
Com isso, é possível acessar de fora serviços de um servidor doméstico ou de um servidor interno de desenvolvimento que não estejam conectados diretamente à internet.
O encaminhamento local dinâmico cria um proxy SOCKS local
- O encaminhamento local comum fixa uma porta local a um único destino.
- O encaminhamento local dinâmico cria um proxy SOCKS no cliente SSH.
- A estrutura básica do comando é a seguinte.
ssh -D [local_addr:]local_port [user@]sshd_addr
-
Um proxy SOCKS é executado na porta especificada do PC do usuário.
-
Aplicações com suporte a SOCKS podem informar, a cada conexão, endereços e portas de destino diferentes.
-
A conexão com o destino real ocorre da perspectiva da rede do servidor SSH remoto.
-
A diferença em relação ao encaminhamento local fixo é que uma única conexão SSH pode acessar vários serviços da rede privada remota.
-
Casos de uso comuns incluem:
- chamadas a várias APIs internas por meio de um Bastion Host
- navegação em aplicações web dentro de uma rede privada
- acesso a vários endpoints de VPC por meio de uma única instância EC2
O encaminhamento remoto dinâmico cria um proxy SOCKS remoto
- Ao omitir o destino fixo na opção
-R, é possível criar um proxy SOCKS no servidor SSH remoto. - A estrutura básica do comando é a seguinte.
ssh -R [bind_address:]port [user@]gateway_addr
- O servidor de gateway remoto aguarda conexões SOCKS na porta especificada.
- As requisições que entram no proxy são encaminhadas pelo túnel SSH para o lado do cliente.
- O destino final é acessado da perspectiva da rede onde está o cliente SSH.
- Com isso, o servidor remoto pode acessar toda a rede doméstica ou privada que o PC do usuário consegue alcançar.
- O encaminhamento remoto dinâmico exige OpenSSH 7.6 ou superior no cliente.
- Para expor o proxy SOCKS remoto em interfaces externas, também é necessário configurar
GatewayPorts, assim como no encaminhamento remoto comum.
Opções de execução em segundo plano mantêm apenas o túnel ativo
- Para manter apenas o encaminhamento de portas, sem executar um comando após a conexão SSH, use a opção
-N. - Para enviar o túnel para segundo plano, é possível usar a opção
-fjunto. - Exemplos por tipo:
ssh -f -N -L ...
ssh -f -N -R ...
ssh -f -N -D ...
- Em automações ou ambientes de longa duração, também é preciso definir separadamente como o túnel será encerrado, reconectado e monitorado em caso de falha.
Os comandos se distinguem pelo lado em que a porta é aberta
ssh -Lfaz o cliente SSH local abrir uma nova porta.ssh -Rfaz o servidor SSH remoto abrir uma nova porta.ssh -Dcria um proxy SOCKS no cliente SSH local.ssh -Rsem destino cria um proxy SOCKS no servidor SSH remoto.- A regra básica para memorizar os comandos é a seguinte.
-L = local:remote
-R = remote:local
- O endereço e a porta à esquerda dos dois-pontos são o novo ponto de escuta que será aberto.
localpode significar o próprio cliente SSH ou uma máquina interna acessível por ele.remotepode significar o próprio servidor SSH ou outra máquina interna acessível por ele.
Conclusão
O túnel SSH deve ser escolhido conforme a direção do acesso
-
Para usar um serviço remoto no seu PC, use o encaminhamento local
-L. -
Para expor seu PC ou um serviço interno no lado do servidor remoto, use o encaminhamento remoto
-R. -
Para acessar dinamicamente vários destinos na rede remota, use o encaminhamento local dinâmico
-D. -
Para permitir que todo o lado de rede do cliente seja acessado dinamicamente a partir de um gateway remoto, use o encaminhamento remoto dinâmico
-Rsem destino. -
Ao projetar um túnel SSH, os seguintes pontos devem ser verificados primeiro:
- onde a nova porta precisa ser aberta
- qual máquina consegue acessar o destino final
- configurações de
GatewayPorts, firewall e permissões de acesso SSH - riscos de segurança que podem surgir ao expor algo externamente
-
O principal critério é em qual lado o serviço deve ficar visível e qual máquina realmente consegue alcançar o destino.
Ainda não há comentários.