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 terssh). -
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_addresseportsão respectivamente o endereço (interface) e a porta TCP na qual osshdo cliente escutará (não sei se esses parâmetros são transmitidos para o servidor, o servidor não precisa eles). No seu caso0.0.0.0significa "todas as interfaces disponíveis". -
hostehostportsã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 clientehostpode 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.