Gateway SSH: como entender o ssh -L quando o remoto vem primeiro?

0

Eu entendo algumas noções básicas de encaminhamento ssh, mas essa postagem do SuperUser parece atrasada para mim. Em outras palavras, com 2 hosts, isso…

ssh -L 0.0.0.0:10022:localhost:22 root@A

… parece permitir uma conexão de localhost para A. Mas com 3 hosts, isso…

ssh -L 0.0.0.0:10022:A:22 root@B

… permite localhost para A embora B? Por que não localhost de B até A?

A página man do ssh parece descrever a opção 2-hosts, não a opção 3-hosts:

-L [bind_address:]port:host:hostport

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.

    
por mellow-yellow 12.01.2018 / 20:53

1 resposta

1

Não está claro para mim qual é o seu (mal) entendimento. Eu acho que a confusão pode ser por causa da palavra "localhost".

Localhost é um termo relativo. Por definição, no contexto de qualquer máquina localhost deve referir-se exatamente a esta máquina. Praticamente todo Linux resolve localhost como endereço IP 127.0.0.1 (eu coloquei o IPv6 de lado) graças a uma entrada apropriada no arquivo /etc/hosts . 127.0.0.1 deve ser atribuído a uma interface de loopback.

Na resposta vinculada, a maioria das ocorrências da palavra localhost refere-se à máquina (de três) que não é host1 nem host2 ; esta é a máquina local onde os comandos são chamados. Da mesma forma, quando você diz "localhost" você provavelmente não quer dizer A nem B . De agora em diante, vamos chamar este computador local o cliente .

Basicamente, você executa isso no cliente:

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

Existem dois computadores envolvidos: o cliente e o servidor. Certas partes do comando são válidas no contexto do cliente ou do servidor.

  • ssh -L é o executável com a opção que o cliente entende (o servidor pode não ter ssh ).
  • server é o endereço do servidor do ponto de vista do cliente (o servidor pode nem estar ciente de que tem tal e tal endereço ou nome).
  • user é um nome de usuário existente no servidor (pode não existir no cliente).
  • bind_address e port são respectivamente o endereço (interface) e a porta TCP na qual o ssh do cliente escutará (não sei se esses parâmetros são transmitidos para o servidor, o servidor não precisa eles). No seu caso 0.0.0.0 significa "todas as interfaces disponíveis".
  • host e hostport são respectivamente o endereço e a porta TCP para a qual o servidor deve enviar pacotes encapsulados do cliente. Esses parâmetros são para o servidor; host é resolvido no servidor . Do ponto de vista do cliente host pode ser um endereço inválido ou pode ser resolvido para algo completamente diferente - não importa porque o cliente não resolve nada; host é apenas uma cadeia de caracteres passada para o servidor, não significa mais nada do lado do cliente.

Isto significa que se houver um% literallocalhost como este parâmetro host , é "localhost" do ponto de vista do servidor, ou seja, o próprio servidor. Não significa "o cliente ".

Com esse conhecimento, vamos analisar seus exemplos.

ssh -L 0.0.0.0:10022:localhost:22 root@A

Isso captura tudo o que entra na porta TCP 10022 do cliente; pacotes capturados serão recriados no servidor A e destinados a localhost:22 , mas localhost no servidor significa "a interface de loopback do servidor A em si".

ssh -L 0.0.0.0:10022:A:22 root@B

Isso captura tudo o que entra na porta TCP 10022 do cliente; pacotes capturados serão recriados no servidor B e destinados a A:22 de lá.

De fato, ele pode ser descrito como "localhost para A though B", onde "localhost" significa o cliente.

    
por 13.01.2018 / 01:21