1

Я давно использую ssh -L в следующем формате для подключения локально работающего веб-интерфейса к удаленной службе RPC или HTTP.

ssh -L <local port>:localhost:<remote port> <remote host> # Format 1

Недавно я обнаружил, что использую туннель другого типа для подключения к базе данных SQL, к которой я мог получить доступ только с другого сервера в его частной сети, отформатированный следующим образом.

ssh -L <local port>:<final target host>:<remote port> <intermediate remote host> # Format 2

Хотя я понимаю, какие функции выполняют эти две формы, у меня нет хорошей ментальной модели того, как обе могут работать. Когда я только знал о первом, я предположил , что ssh -L означает «передавать трафик на порт local port на remote port на remote host , а затем перенаправить трафик ответа обратно на localhost Это указывает на то, что remote host является получателем перенаправленного трафика.

Формат 2 и страница руководства ssh (в частности, этот отрывок [1]) заставляют меня поверить в обратное. Оба обрабатывают хост, указанный между аргументом « -L» в аргументе -L , а не remote host в конце команды, как конечный получатель перенаправленного трафика. Кроме того, формат 2 использует хост, переданный в конце команды SSH, в качестве промежуточного перехода для трафика, в дополнение к инициализации сеанса удаленной оболочки.

Подводя итог, можно сказать, что второй тип команды ssh -L заставляет меня поверить, что первый тип не должен работать так, как работает. Почему формат 1 может использоваться для пересылки трафика через local port на remote port если формат 2 рассматривает remote host как промежуточную остановку для трафика?

[1]

-L [bind_address:] порт:remote_socket Всякий раз , когда соединение с локального порта или сокета, соединение передается по защищенному каналу, а соединение с хост - порт либо HostPort или сокет Unix remote_socket, с пульта дистанционного управления машина.

Обратите внимание, что в этом отрывке никогда не упоминается параметр имени хоста , передаваемый в качестве последнего аргумента любой команде SSH (например, ssh -L <local port>:<...>:<remote port> <hostname>).

1 ответ1

0

Я думаю, что вы очень близки к пониманию, есть только пара вещей, чтобы уточнить. Итак, с учетом следующей команды SSH, выполненной на клиентском компьютере:

ssh -L [bind_address:]port:host:hostport user@server

Эта команда собирается установить соединение SSH с server и установить это прямое соединение. -L указывает клиенту SSH открыть порт (номер порта - это port , связанный с сетевым интерфейсом клиента, указанным в bind_address) на клиентском компьютере. Это позволяет еще один кусок программного обеспечения на стороне клиента (например , веб - браузер или DB инструмент управления) для подключения к этому порту и любому трафику , передаваемому будет проходить через SSH туннель и на компьютере server на сервер SSH будет открыть подключение к host:hostport и отправлять трафик через это соединение на host компьютер.

В вашем примере Format # 1 ваш веб-сервер и ваш SSH-сервер - это один и тот же компьютер, и поэтому host это просто localhost , то есть localhost сервера SSH. Во втором примере вы используете SSH-сервер в качестве посредника для доступа к другому удаленному компьютеру, но главное, чтобы SSH-сервер мог подключиться к этому компьютеру (host). Таким образом, на самом деле обе команды выполняют одно и то же, единственное отличие состоит в том, что одно устанавливает окончательное соединение со службой на том же компьютере, что и сервер SSH, а вторая - с удаленным сервером.

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