1

Я понимаю некоторые основы пересылки по ssh, но этот пост SuperUser кажется мне задом наперед. Другими словами, с 2 хозяевами это…

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

... кажется, что позволяет подключение от localhost к A. Но с 3 хостами, это ...

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

... позволяет localhost A, хотя B? Почему не локальный хост от B до A?

Страница man ssh, кажется, описывает параметр 2-hosts, а не параметр 3-hosts:

-L [bind_address:]port:host:hostport

Всякий раз , когда соединение с локального порта или сокета, соединение передается по защищенному каналу, а соединение с host - порт либо hostport или сокет remote_socket Unix, с удаленной машины.

1 ответ1

2

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .