Мне не ясно, каково ваше (неправильное) понимание. Я думаю, что путаница может быть из-за слова "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", где "локальный хост" означает клиента.