Como o trabalho de tunelamento SSH reverso funciona?

301

Pelo que entendi, os firewalls (assumindo configurações padrão) negam todo o tráfego de entrada que não tenha tráfego de saída correspondente anterior.

Baseado em Invertendo uma conexão ssh e SSH Tunneling Made Easy , o tunelamento reverso do SSH pode ser usado para contornar as restrições do firewall.

Eu gostaria de executar comandos shell em uma máquina remota. A máquina remota tem seu próprio firewall e está atrás de um firewall adicional (roteador). Tem um endereço IP como 192.168.1.126 (ou algo similar). Não estou atrás de um firewall e conheço o endereço IP da máquina remota visto da Internet (não o endereço 192.168.1.126). Além disso, posso pedir a alguém para executar ssh (something) como root na máquina remota primeiro.

Alguém poderia me explicar, passo a passo, como funciona o tunelamento SSH reverso para contornar os firewalls (firewalls de máquinas locais e remotas e o firewall adicional entre eles)?

Qual é a função das opções ( -R , -f , -L , -N )?

    
por Ali 24.08.2012 / 13:02

4 respostas

350

Adoro explicar esse tipo de coisa através da visualização. : -)

Pense nas suas conexões SSH como tubos. Grandes tubos. Normalmente, você alcançará esses tubos para executar um shell em um computador remoto. O shell é executado em um terminal virtual (tty). Mas você já conhece essa parte.

Pense no seu túnel como um tubo dentro de um tubo. Você ainda tem a grande conexão SSH, mas a opção -L ou -R permite que você configure um tubo menor dentro dela.

Cada tubo tem um começo e um fim. O big tube, sua conexão SSH, começou com o seu cliente SSH e acabou no servidor SSH que você conectou. Todos os tubos menores têm os mesmos endpoints, exceto que o papel de "start" ou "end" é determinado se você usou -L ou -R (respectivamente) para criá-los.

(Você não disse, mas vou assumir que a máquina "remota" que você mencionou, a que está por trás do firewall, pode acessar a Internet usando NAT (Network Address Translation). Isso é meio que importante, por favor, corrija esta suposição se for falsa.)

Quando você cria um túnel, você especifica um endereço e porta na qual ele irá responder, e um endereço e porta para o qual ele será entregue. A opção -L diz ao túnel para responder no lado local do túnel (o host que está executando o seu cliente). A opção -R diz ao túnel para responder no lado remoto (o servidor SSH).

Então...ParaconseguirSSHdaInternetemumamáquinaatrásdeumfirewall,vocêprecisadamáquinaemquestãoparaabrirumaconexãoSSHparaomundoexternoeincluirumtúnel-Rcujopontode"entrada" é o lado "remoto" de sua conexão.

Dos dois modelos mostrados acima, você quer o da direita.

Do host com firewall:

ssh -f -N -T -R22222:localhost:22 yourpublichost.example.com

Isto diz ao seu cliente para estabelecer um túnel com um ponto de entrada -R emote. Qualquer coisa que se conecte à porta 22222 na extremidade mais distante do túnel atingirá a "porta do host local 22", onde "localhost" é da perspectiva do ponto de saída do túnel (ou seja, seu cliente ssh).

As outras opções são:

  • -f diz ao ssh para se autenticar depois de autenticar, então você não precisa ficar sentado rodando alguma coisa no servidor remoto para o túnel permanecer vivo.
  • -N diz que você deseja uma conexão SSH, mas na verdade não quer executar comandos remotos. Se tudo o que você está criando é um túnel, a inclusão dessa opção economiza recursos.
  • -T desativa a alocação pseudo-tty, que é apropriada porque você não está tentando criar um shell interativo.

Haverá um desafio de senha, a menos que você tenha configurado chaves DSA ou RSA para um login sem senha.

Observe que é altamente recomendável usar uma conta descartável (não seu próprio login) configurada apenas para este túnel / cliente / servidor.

Agora, a partir do seu shell no yourpublichost , estabeleça uma conexão com o host com firewall através do túnel:

ssh -p 22222 username@localhost

Você receberá um desafio de host, já que provavelmente nunca atingiu esse host antes. Em seguida, você receberá um desafio de senha para a conta username (a menos que tenha configurado chaves para login sem senha).

Se você for acessar esse host regularmente, também poderá simplificar o acesso adicionando algumas linhas ao arquivo ~/.ssh/config :

host remotehostname
    User remoteusername
    Hostname localhost
    Port 22222

Ajuste remotehostname e remoteusername para adequar. O campo remoteusername deve corresponder ao seu nome de usuário no servidor remoto, mas remotehostname pode ser qualquer nome de host adequado para você, não precisa corresponder a nada que possa ser resolvido.

(Para expor o endpoint reverso em um IP não-localhost , confira este post )

    
por 24.08.2012 / 19:56
300

Eu desenhei alguns esboços

A máquina em que o comando ssh tunnel é digitado chama-se »seu host« .

Introdução

  1. local: -L Specifies that the given port on the local (client) host is to be forwarded to the given host and port on the remote side.

    ssh -L sourcePort:forwardToHost:onPort connectToHost significa: conecte-se com ssh a connectToHost e encaminhe todas as tentativas de conexão para o local sourcePort para a porta onPort na máquina chamada forwardToHost , que pode ser alcançado a partir da máquina connectToHost .

  2. remoto: -R Specifies that the given port on the remote (server) host is to be forwarded to the given host and port on the local side.

    ssh -R sourcePort:forwardToHost:onPort connectToHost significa: conecte-se com ssh a connectToHost e encaminhe todas as tentativas de conexão para o remoto sourcePort para a porta onPort na máquina chamada forwardToHost , que pode ser alcançado a partir de sua máquina local.

Opções adicionais

  • -f diz ao ssh para se autenticar depois de autenticar, então você não precisa ficar sentado rodando alguma coisa no servidor remoto para o túnel permanecer vivo.
  • -N diz que você deseja uma conexão SSH, mas na verdade não quer executar comandos remotos. Se tudo o que você está criando é um túnel, a inclusão dessa opção economiza recursos.
  • -T desativa a alocação pseudo-tty, que é apropriada porque você não está tentando criar um shell interativo.

Seu exemplo

A terceira imagem representa este túnel. Mas o computador azul chamado »seu host« representa o computador onde alguém inicia o túnel ssh, neste caso a máquina com firewall.

Então, peça a alguém que inicie uma conexão de túnel ssh com a sua máquina. O comando deve basicamente parecer com

ssh -R 12345:localhost:22 YOURIP

Agora o túnel está aberto. Agora você pode se conectar via ssh à máquina com firewall através do túnel com o comando

ssh -p 12345 localhost

que se conectará ao seu próprio localhost (sua máquina) na porta 12345 , mas a porta 12345 será encaminhada através do encapsulamento para a porta 22 do host local do computador com firewall (ou seja, o próprio computador com firewall).

    
por 07.03.2014 / 23:37
17

O tunelamento ssh funciona usando a conexão ssh já estabelecida para enviar tráfego adicional.

Quando você se conecta a um servidor remoto, normalmente você só tem 1 canal para a interação normal do usuário (ou 3 canais se você considerar STDIN / STDOUT / STDERR separado). A qualquer momento, o processo ssh local ou remoto pode abrir canais adicionais na conexão existente. Esses canais enviam / recebem o tráfego do túnel. Ao enviar ou receber qualquer tráfego, o processo ssh simplesmente diz "esse tráfego é para o canal foobar".

Funciona essencialmente assim:

  1. Você diz ao ssh para começar a escutar na porta XXXX e que qualquer tráfego recebido deve ser encapsulado e, em seguida, configurado para Y.Y.Y.Y na porta ZZZZ.
  2. O ssh local começa a escutar na porta XXXX (geralmente em 127.0.0.1 , mas pode ser alterado).
  3. Alguns aplicativos abrem uma conexão para a porta XXXX na máquina local.
  4. O ssh local abre um canal para o ssh remoto e diz "qualquer tráfego nesse canal vai para Y.Y.Y.Y: ZZZZ
  5. O ssh remoto conecta-se a Y.Y.Y.Y: ZZZZ e envia de volta o "OK, o canal está aberto"
  6. Agora, qualquer tráfego enviado pela conexão para a porta XXXX na máquina local é intermediado por ssh para Y.Y.Y.Y: ZZZZ.

Este processo é exatamente o mesmo para tunelamento direto e reverso (basta trocar as palavras 'local' e 'remote' no procedimento acima). Qualquer um dos lados pode iniciar o túnel. Nem precisa ser quando você inicia o ssh pela primeira vez. Você pode abrir túneis enquanto o ssh já está rodando (veja ESCAPE CHARACTERS , especificamente ~C ).

Para o papel de -R , -f , -L e -N , você deve apenas consultar a página de manual, isso dá a melhor explicação possível. Mas vou mencionar -R e -L .
-R informa ao ssh remoto para escutar conexões, e que o ssh local deve se conectar ao destino real. -L informa ao ssh local para escutar conexões, e que o ssh remoto deve se conectar ao destino real.

Note que esta é uma descrição muito grosseira, mas deve lhe dar informações suficientes para saber o que está acontecendo

    
por 24.08.2012 / 14:31
11

Isso é explicado no manual do SSH, especialmente as diferenças entre -L (local) e -R (remoto).

-L

-L [bind_address:]port:host:hostport

Specifies that the given port on the local (client) host is to be forwarded to the given host and port on the remote side.

This works by allocating a socket to listen to port on the local side, optionally bound to the specified bind_address.

Whenever a connection is made to this port, the connection is forwarded over the secure channel, and a connection is made to host port hostport from the remote machine.

O exemplo a seguir canaliza uma sessão de IRC da máquina cliente 127.0.0.1 ( localhost ) usando a porta 1234 para o servidor remoto server.example.com :

$ ssh -f -L 1234:localhost:6667 server.example.com sleep 10

Nota: A -f opção fundos ssh e o comando remoto sleep 10 são especificados para permitir que um período de tempo inicie o serviço que deve ser sintonizado.

Exemplo:

ssh '-N' -L 22000:localhost:11000 remote.server.com
  • -N Depois de se conectar, apenas pendure lá (você não receberá um prompt de shell)

    Do not execute a remote command.

  • -L 22000 A conexão será originada na porta 22000 da sua máquina pessoal, L máquina ocal

  • localhost:11000 - remote.server.com irá certificar-se de que a outra extremidade do túnel é localhost , port 11000

Fonte: Um guia ilustrado, tutorial, como fazer, sobre tunelamento ssh .

-R

-R [bind_address:]port:host:hostport

Specifies that the given port on the remote (server) host is to be forwarded to the given host and port on the local side.

This works by allocating a socket to listen to port on the remote side, and whenever a connection is made to this port, the connection is forwarded over the secure channel, and a connection is made to host port hostport from the local machine.

Exemplo:

ssh -N -R 22000:localhost:11000 remote.server.com
  • -N Depois de se conectar, apenas pendure lá (você não receberá um prompt de shell)

    Do not execute a remote command.

  • -R 22000 A conexão será originada na porta 22000 do computador emote R (nesse caso, remote.server.com)

  • localhost:11000 do seu computador pessoal local garantirá que a outra extremidade do túnel seja localhost , porta 11000

Fonte: Um guia ilustrado, tutorial, como fazer, sobre tunelamento ssh .

    
por 15.09.2017 / 11:48