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_address
eport
são respectivamente o endereço (interface) e a porta TCP na qual ossh
do 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.0
significa "todas as interfaces disponíveis". -
host
ehostport
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 clientehost
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.