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
или сокет Unixremote_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", где "локальный хост" означает клиента.