SSH-шлюз: как понять ssh -L, когда удаленный приходит первым?

Я понимаю некоторые основы пересылки по 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или сокет Unix remote_socket, с удаленной машины.

1 ответ

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

Другие вопросы по тегам