Знакомился с пробросом портов через SSH.
Есть удаленный сервер на Ubuntu 20.04, есть Windows 10 в локальной сети.
В нете полно инфы описывающей опции -R, -L и -D у ssh, однако далеко не везде есть упоминание о необходимости внесения изменений в конфиг на сервере.
Собственно с прокси (-D) и пробросом удаленного порта на локальный (-L) проблем не возникло - все работало как и описывается во многочисленных инструкциях и т.д.
Однако на пробросе локального порта на удаленный (-R) возникает проблема.
Команда в целом:
ssh -R 8000:localhost:3000 remoteserv
На винде в
~/.ssh/config лежит алиас remoteserv с IP, пользователем и ключом
Соединение проходит успешно - никаких сообщений об ошибке не вылезает. У меня открывается терминальная сессия на сервере.
Запускаю команду
ss -tunl
и вижу что слушается
TCP на
0.0.0.0:8000
На винде запускаю веб-сервер на 3000 порту. Веб-сервер крутится на 0.0.0.0:3000 - проблем с доступом к нему с других устройств в локальной сети не наблюдается. Обращаюсь к серверу по IP:8000 - по логике запрос должен проброситься через ssh на локальный 3000 порт, ну и соответственно вернуть ответ от 3000 порта винды на 8000 порт сервера.
Однако, к сожалению этого не происходит и в браузере я получаю
ERR_EMPTY_RESPONSE
В той же терминальной сессии на сервере запускаю
curl 0.0.0.0:8000
и получаю след. результат:
curl: (52) Empty reply from server
UPD: от одного из знакомых получил замечание, что
curl 0.0.0.0:8000
не работает потому что 0.0.0.0 - мета-адрес. В связи с этим уточнение - locahost вместо него дал тот же самый результат.
Уточнение: при запросе с другого устройства локальной сети, локальный веб-сервер фиксирует приходящий запрос. Когда совершается попытка достучаться по проброшенному порту (удаленный сервер и 8000 порт) никаких запросов на локальном сервере не фиксируется.
Пока листал все эти интро, в нескольких случаях натыкался на инфу о конфиге, в частности про параметры:
- GatewayPorts
- AllowTcpForwarding
Оба параметра имеют значение
yes, после внесения изменений сервис ssh рестартился через
systemctl
Уточнения:
- Порты на Ubuntu не блочатся. Т.е. если я зайду на сервер и там подниму веб-сервер на рандомном порту - он корректно работает при обращении по ip:port
- По сути в сети есть сервис https://localhost.run, который выполняет практически тот же функционал. Разве что проброс идет для веба и на 80й порт, а в рез-те подключения выводится нечто вроде motd и адреса на котором можно увидеть проброшенный веб-сервер.
На основе этого делаю
(возможно ошибочное) предположение о том, что проблема где-то в конфигурации ssh-сервера, но где и в чем именно - пока, к сожалению, не знаю. Заранее спасибо всем, кто откликнется и подскажет что к чему.