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