Мне не ясно, каково ваше (неправильное) понимание. Я думаю, что путаница может быть из-за слова "localhost".
Localhost - относительный термин. По определению, в контексте любой машины localhost
должен ссылаться на эту машину точно. Практически каждый Linux разрешает localhost
как IP-адрес 127.0.0.1
(я отложил в сторону IPv6) благодаря правильной записи в /etc/hosts
. 127.0.0.1
должен быть назначен на петлевой интерфейс.
В связанном ответе большинство вхождений слова localhost
относятся к машине (из трех), которая не является ни host1
ни host2
; это локальный компьютер, на котором вызываются команды. Точно так же, когда вы говорите "localhost", вы, вероятно, имеете в виду ни A
ни B
Отныне будем называть этот локальный компьютер клиентом.
В основном вы запускаете это на клиенте:
ssh -L bind_address:port:host:hostport user@server
Здесь задействованы два компьютера: клиент и сервер. Определенные части команды действительны в контексте клиента или сервера.
ssh -L
- это исполняемый файл с опцией, которую понимает клиент (на сервере может вообще не быть ssh
).
server
- это адрес сервера с точки зрения клиента (сервер может даже не знать, что у него есть такой-то адрес или имя).
user
- это имя пользователя, существующее на сервере (оно может не существовать на клиенте).
bind_address
и port
- это соответственно адрес (интерфейс) и TCP-порт, на котором будет прослушиваться ssh
клиента (я не знаю, передаются ли эти параметры вообще серверу, они не нужны серверу). В вашем случае 0.0.0.0
означает "любой доступный интерфейс".
host
и hostport
- это соответственно адрес и порт TCP, на которые сервер должен отправлять пакеты, туннелированные от клиента. Эти параметры для сервера; host
разрешен на сервере. С точки зрения клиента, host
может быть недопустимым адресом или может разрешить что-то совершенно другое - это не имеет значения, потому что клиент вообще не разрешает его; host
- это просто символьная строка, передаваемая на сервер, это ничего не значит на стороне клиента.
Это означает, что если в качестве этого параметра localhost
указан буквальный host
, то это "localhost" с точки зрения сервера, то есть самого сервера. Это не значит "клиент".
С этим знанием давайте проанализируем ваши примеры.
ssh -L 0.0.0.0:10022:localhost:22 root@A
Это захватывает все, что входит в TCP-порт 10022
клиента; захваченные пакеты будут воссозданы на сервере A
и предназначены для localhost:22
, но localhost
на сервере означает «интерфейс обратной связи самого сервера A
».
ssh -L 0.0.0.0:10022:A:22 root@B
Это захватывает все, что входит в TCP-порт 10022
клиента; захваченные пакеты будут воссозданы на сервере B
и оттуда будут направлены в A:22
.
На самом деле это можно описать как "локальный хост к A через B", где "локальный хост" означает клиента.