Tutoriel Linux

Túnel SSH: Encaminhe uma porta sem expor seu servidor.

Débutant6 min de lecture
À retenirLinux n'est pas réservé aux experts. Le bon point de départ : une distribution accessible, une sauvegarde propre et quelques commandes comprises.

Você precisa de acesso a uma interface web, um banco de dados PostgreSQL ou um serviço de administração que só escute na porta 8080. 127.0.0.1Abrir a porta no firewall do servidor seria rápido, mas esse serviço ficaria acessível a partir de uma rede onde não deveria estar.

UM Túnel SSH Isso leva a conexão para sua sessão SSH. Para acesso ocasional, prefiro este método: o serviço permanece fechado publicamente e somente a máquina que abre o túnel pode usá-lo. No entanto, você deve escolher o redirecionamento correto e verificar o endereço de escuta, especialmente com -R.

Ilustração de Tux no centro de um túnel SSH seguro entre uma máquina local e um servidor Linux.
O túnel SSH transporta uma porta em uma conexão criptografada sem expor diretamente o serviço na rede.

Encaminhe uma porta para sua máquina usando -L

Redirecionamento local -EU Abre uma porta em sua máquina e, em seguida, encaminha as conexões para um destino acessível a partir do servidor SSH. Sua forma geral é a seguinte:

ssh -L endereço_local:porta_local:host_destino:porta_destino usuário@servidor_ssh

Para acessar uma interface HTTP que escuta apenas na porta 80 do servidor remoto:

ssh -N -T -o ExitOnForwardFailure=yes 
  -L 127.0.0.1:8080:127.0.0.1:80 
  [email protected]
  • -EU cria o redirecionamento local;
  • 127.0.0.1:8080 é a porta aberta no seu computador;
  • 127.0.0.1:80 é o destino conforme visto pelo servidor SSH;
  • -N evita o envio de um comando remoto;
  • -T evita a alocação de um terminal;
  • SaídaEmCasoFalhaNoEncaminhamento=sim A sessão será encerrada se o SSH não conseguir criar o redirecionamento solicitado.

Esta última opção confirma a criação da porta de escuta. Não comprova que o serviço final esteja respondendo. Sempre teste o destino após abrir o túnel.

Enquanto o pedido permanecer em aberto, você poderá testar o serviço a partir do seu computador:

curl http://127.0.0.1:8080/

O endereço localizado à direita de -EU Merece sua atenção. No exemplo anterior, 127.0.0.1 Isso se refere ao servidor SSH, não ao seu computador. Se o destino estiver em outra máquina na rede privada, especifique o endereço privado dela:

ssh -N -T -o ExitOnForwardFailure=yes 
  -L 127.0.0.1:15432:10.20.0.15:5432 
  [email protected]

Seu cliente PostgreSQL então se conecta a 127.0.0.1:15432O bastião abre a conexão real com 10.20.0.15:5432A base não precisa estar conectada à internet.

Verifique se o túnel está realmente escutando.

No seu computador, controle a porta local com ss :

ss -ltnp | grep ':8080'
ss -ltnp | grep ':15432'

Você precisa assistir a uma sessão de escuta sobre 127.0.0.1associado ao processo sshSe você ver 0.0.0.0 Ou A porta pode estar acessível a partir de outras interfaces na máquina. Feche o túnel e recrie-o, especificando-o explicitamente. 127.0.0.1.

O guia para Abrir portas no Linux com ss Detalha a leitura dos endereços de escuta. Verifique também se o servidor SSH consegue alcançar o destino final:

curl -I http://127.0.0.1:80/
nc -vz 10.20.0.15 5432

Se o túnel for criado, mas isso enrolar ou seu cliente SQL recebe Ligação recusadaProvavelmente o SSH está funcionando. O problema está no destino final, que não está escutando no endereço ou porta especificados.

Usar -R sem publicar um serviço por engano

Redirecionamento remoto -R Faz o inverso. Abre uma porta no servidor SSH e a encaminha para um serviço acessível a partir da sua máquina. Exemplo: tornar uma aplicação local na porta 3000 acessível apenas a partir do servidor remoto:

ssh -N -T -o ExitOnForwardFailure=yes 
  -R 127.0.0.1:9000:127.0.0.1:3000 
  [email protected]

No servidor remoto, um processo local agora pode chamar:

curl http://127.0.0.1:9000/

Por padrão, sshd Vincula esta porta remota à interface de loopback. Não substitua. 127.0.0.1 por 0.0.0.0 Ou * sem ter decidido quem deveria poder participar do serviço. O parâmetro do servidor Portas de gateway Isso permite a escuta em outras interfaces. Uma simples demonstração local pode então se tornar um serviço exposto à rede.

Evite também a opção -g com um redirecionamento local se você não quiser que outras máquinas se conectem à porta encaminhada. Para minimizar o uso de recursos, vincule seus túneis a 127.0.0.1 em ambos os lados.

Controle as restrições do servidor SSH

Se o SSH responder proibido administrativamente Caso o redirecionamento seja recusado, consulte a configuração atual do servidor:

sudo /usr/sbin/sshd -T | grep -E '^(allowtcpforwarding|gatewayports|permitopen|permitlisten)'

Permitir encaminhamento TCP Pode permitir redirecionamentos locais, redirecionamentos remotos, ambos ou nenhum. Permitir abrir E Permitir ouvir Essas restrições são usadas para limitar os destinos e portas permitidos. Em um servidor compartilhado, essas restrições são preferíveis a conceder autorização global a todas as contas.

Antes de qualquer modificação /etc/ssh/sshd_config ou um arquivo em /etc/ssh/sshd_config.d/Mantenha sua sessão atual aberta e teste a sintaxe:

sudo /usr/sbin/sshd -t

Reinicie o SSH somente após um retorno bem-sucedido, sem erros. O procedimento completo é explicado no artigo sobre Reiniciando o serviço SSH no UbuntuSe você ainda estiver usando uma senha para esta conta, comece por Configure uma chave SSH..

Salve um túnel recorrente em ~/.ssh/config

Para um banco de dados usado regularmente, evite copiar comandos longos. Adicione um host dedicado em ~/.ssh/config :

Host túnel-db
    Nome do host: bastion.example.net
    Administrador de usuário
    LocalForward 127.0.0.1:15432 10.20.0.15:5432
    SaídaEmFalhaDeEncaminhamento sim
    ServerAliveInterval 30
    ServerAliveCountMax 3

Proteja o arquivo e, em seguida, abra o túnel para o primeiro plano:

chmod 600 ~/.ssh/config
ssh -N -T túnel-db

Recomendo manter a primeira execução em primeiro plano. Você verá imediatamente quaisquer erros de chave, porta local ou redirecionamento, e Ctrl + C Feche o túnel corretamente. Se você então o iniciar em segundo plano com -fIdentifique o processo correto antes de interrompê-lo:

pgrep -af 'ssh.*15432'
matar PID

Evitar matar -9 Por reflexo. Um sinal normal geralmente é suficiente para encerrar a sessão e liberar a porta.

Diagnóstico de um túnel que não passa

  • Endereço já em uso Outro processo é usar a porta local. Verifique com ss -ltnp ou escolha outra porta.
  • Ligação recusada O serviço de destino não está em execução ou o endereço de destino está incorreto do ponto de vista do servidor SSH.
  • Administrativamente proibido A configuração SSH bloqueia o redirecionamento ou limita o destino solicitado.
  • Tempo esgotado O servidor SSH não consegue alcançar o destino devido a restrições de roteamento ou a um firewall intermediário.
  • Túnel caindo Verifique a estabilidade da conexão e utilize Intervalo de atividade do servidor em vez de um loop que reinicia o SSH sem qualquer diagnóstico.

Para obter detalhes da negociação e redirecionamentos, adicione temporariamente -v :

ssh -v -N -T -L 127.0.0.1:8080:127.0.0.1:80 [email protected]

Um túnel SSH protege o tráfego, mas não corrige os direitos de acesso do serviço de destino. Mantenha a escuta na porta de loopback local, utilize uma conta SSH com privilégios limitados, controle as chaves autorizadas e encerre a sessão assim que o acesso não for mais necessário.

As sintaxes de -EU, -R, -N E -g estão detalhados no Documentação oficial do cliente OpenSSHOs controles Permitir encaminhamento TCP, Portas de gateway, Permitir abrir E Permitir ouvir são descritos em sshd_config(5).

sudo apt update && sudo apt upgrade