Я давно использую 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>).
