Qual é a diferença entre essas duas formas de comandos de túnel SSH?

1

Estou usando ssh -L no formato a seguir por um longo tempo para conectar um frontend da Web em execução local a um serviço RPC ou HTTP remoto.

ssh -L <local port>:localhost:<remote port> <remote host> # Format 1

Recentemente, encontrei-me usando um tipo diferente de túnel para conectar-me a um banco de dados SQL que eu só podia acessar de outro servidor em sua rede privada, formatado da seguinte maneira.

ssh -L <local port>:<final target host>:<remote port> <intermediate remote host> # Format 2

Embora eu entenda quais funções essas duas formas servem, não tenho um bom modelo mental de como ambas podem funcionar. Quando eu sabia apenas sobre o primeiro, assumi que ssh -L significava "passar tráfego na porta local port para remote port on remote host e redirecionar o tráfego de resposta de volta para localhost ". Isso indicaria que remote host é o destinatário do tráfego encaminhado.

O formato 2 e a página ssh man (em particular esta passagem [1]) me levam a acreditar no contrário. Ambos tratam o host listado entre os ":" s no argumento -L , não o remote host no final do comando, como o destinatário final do tráfego encaminhado. Além disso, o formato 2 usa o host passado no final do comando SSH como uma junção intermediária para o tráfego, além de inicializar uma sessão de shell remota.

Para resumir, o segundo tipo de comando ssh -L me leva a acreditar que o primeiro tipo não deve funcionar como funciona. Por que o formato 1 funciona como uma forma de encaminhar o tráfego em local port para remote port se o formato 2 tratar remote host como uma parada intermediária para o tráfego?

[1]

-L [bind_address:]port:remote_socket Whenever a connection is made to the local port or socket, the connection is forwarded over the secure channel, and a connection is made to either host port hostport, or the Unix socket remote_socket, from the remote machine.

Observe como essa passagem nunca menciona o parâmetro nome do host , passado como o argumento final para qualquer comando SSH (por exemplo, ssh -L <local port>:<...>:<remote port> <hostname> ).

    
por an1lam 22.09.2017 / 16:21

1 resposta

0

Eu acho que você está muito perto de entender, há apenas algumas coisas para esclarecer. Então, dado o seguinte comando SSH emitido em um computador cliente:

ssh -L [bind_address:]port:host:hostport user@server

Este comando vai iniciar uma conexão SSH com server e estabelecer essa conexão direta. O -L direciona o cliente SSH para abrir uma porta (o número da porta é port , ligado à interface de rede do cliente especificada por bind_address ) no computador cliente. Isso permite que outro software no cliente (como um navegador da Web ou ferramenta de gerenciamento de banco de dados) se conecte a essa porta e qualquer tráfego enviado percorra o túnel SSH e, no computador server , o servidor SSH abrirá uma conexão com host:hostport e envie o tráfego por meio dessa conexão para o computador host .

Em seu exemplo do Formato # 1, seu servidor da Web e seu servidor SSH são o mesmo computador e, portanto, host é apenas localhost , significando o localhost do servidor SSH. Em seu segundo exemplo, você está usando o servidor SSH como intermediário para acessar um computador remoto diferente, mas a chave é que o servidor SSH é capaz de estabelecer a conexão com esse computador ( host ). Então, na realidade, ambos os comandos estão fazendo a mesma coisa, a única diferença é que um está fazendo a conexão final com um serviço no mesmo computador que o servidor SSH e o segundo está fazendo uma conexão com um servidor remoto.

    
por 22.09.2017 / 16:41