Como o cliente SSH se liga a um IP externo quando está fazendo o encaminhamento de porta SSH?

0

A partir do meu entendimento básico de encaminhamento de porta SSH, o software cliente SSH abre um soquete de escuta em um IP: PORT, digamos 185.68.93.141:80. Então, se eu for ao meu navegador e acessar somewebsite.com que resolve para 185.68.93.141, então meu navegador da Web abrirá um soquete para falar com 185.68.93.141:80.

Infelizmente, sem o conhecimento do navegador, ele não está falando com o servidor da Web, mas com o cliente SSH. O cliente SSH irá enviá-lo através da conexão SSH (através da porta 22, que é a única permitida através do NAT e firewall) e o servidor SSH irá retransmiti-lo para localhost: 80.

No entanto, como sei por experiência e algumas pesquisas no Google, não é possível vincular um soquete de escuta a um IP externo. Você obtém algum erro "IP inválido neste contexto".

Então, como isso funciona?

    
por freejuices 24.05.2018 / 17:35

3 respostas

1

Suposições:

  • Existe um servidor remoto por trás do NAT, o IP público é 185.68.93.141 , mas devido ao NAT, o servidor não está diretamente disponível.
  • O servidor executa sshd na porta 22 e httpd na porta 80 .
  • 185.68.93.141:22 é encaminhado para o servidor, então podemos ssh in (como ssh 185.68.93.141 ).
  • 185.68.93.141:80 é não encaminhado para o servidor.

Objetivo:

  • Alcance o controle remoto httpd do lado de fora.

Possíveis abordagens:

  1. ssh -L 5678:localhost:80 185.68.93.141

    (Nota: o localhost acima significa localhost no contexto do servidor remoto). Agora, todas as conexões com localhost:5678 no computador local atingirão localhost:80 ( 127.0.0.1:80 ) do servidor remoto. O controle remoto httpd "verá" a conexão do próprio servidor remoto. Seu navegador local deve visitar http://localhost:5678 . Existem alguns obstáculos:

    • O controle remoto httpd pode rejeitar a conexão porque o URL usado não é o que ele espera, digamos que ele espere http://example.com . Você pode corrigir isso redirecionando example.com para 127.0.0.1 no lado local fornecendo seu próprio serviço DNS ou modificando /etc/hosts . Mesmo assim, você precisa se conectar ao http://example.com:5678 .
    • Talvez você queira usar a porta 80 em vez de 5678 no lado local (portanto, com o truque acima, a URL a ser usada é a http://example.com desejada), mas provavelmente o sistema operacional local não permitirá que você abra portas com números menores que 1024 , a menos que você seja root (ou administrador etc.). A execução de ssh como root não é recomendada.
  2. ssh -D 5678 185.68.93.141

    Nesse caso, você precisa configurar seu navegador local para usar o proxy dinâmico SOCKS4 ou SOCKS5 em localhost:5678 ( 127.0.0.1:5678 ). As conexões para qualquer site visitado são estabelecidas pelo sshd no lado remoto em nome do navegador. Seu navegador é "visto" como se estivesse conectado a partir do servidor remoto. Agora tudo o que você precisa fazer é usar o URL que funciona ao conectar-se do servidor remoto ao seu próprio httpd (mas se for http://localhost ou semelhante, lembre-se de que seu navegador local pode ter uma opção como "não usar proxy para endereços locais ").

    Mais informações aqui .

Se você quiser usar 185.68.93.141 (ou somewebsite.com que resolve para 185.68.93.141 ) como a parte principal do URL em seu navegador local e ainda alcançar o controle remoto sshd apesar da falta da porta 80 encaminhando em 185.68.93.141 , então você precisa fazer o navegador se conectar de acordo com as regras acima de alguma forma. O único ssh não tem como interceptar tráfego do navegador que não coopera.

    
por 24.05.2018 / 19:10
1

O cliente SSH está vinculando a uma porta no host local. O navegador envia a solicitação ao cliente SSH. O cliente encaminha a solicitação ao servidor SSH (fora do firewall). O servidor SSH se conecta ao URL. O servidor SSH não precisa se ligar a uma porta (diferente de 22), porque, nesse contexto, está agindo como um cliente, e o servidor da Web remoto selecionará seu endereço IP padrão.

Além disso, o motivo pelo qual o navegador está se conectando ao localhost em vez do endereço IP no URL é devido às configurações de proxy do navegador. Quando você configura um proxy, o navegador sempre se conecta ao endereço IP do proxy (provavelmente localhost neste caso) e informa ao servidor proxy o endereço real ao qual você deseja se conectar.

    
por 24.05.2018 / 18:12
1

Responda a sua pergunta nos comentários:

If I have a remote host that supports SSH running a web server, but the port 80 is not exposed, can I configure the SSH client so that when someone opens a web browser on the local machine it can access the web server on the remote machine?

Se o SSH no host remoto estiver escutando 22 e você puder acessá-lo, o que você pode fazer é se conectar usando um encaminhamento de porta local. Por exemplo, considerando um cliente Linux:

ssh remotehost -L 81:localhost:80

Depois de executar o comando anterior, você deverá ver um novo soquete de escuta na porta 81 (você pode verificar com netstat -latn | grep 81 ).

Como resultado, a porta local 81 será encaminhada para o remotehost: 80.

Agora, você pode navegar pelo link da sua máquina cliente e verá o servidor da Web.

    
por 24.05.2018 / 18:18