Обратное туннелирование портов
Мне нужно показать кому-нибудь сайт, работающий на моей локальной машине завтра. Обычно я выполняю это путем переадресации портов на моем локальном маршрутизаторе, но из-за сбоя оборудования и его замены, являющейся ужасной, мой текущий маршрутизатор не позволяет мне переадресовывать порты.
Так что, застряв в этой задержке и не желая перенести все это на надлежащий сервер, у меня возникла безумная идея: могу ли я просто перенаправить свой порт на внешний сервер через SSH?
Я уже делал туннелирование портов, но обычно делаю это правильно:
- Я подключаюсь к удаленной коробке и спрашиваю, что порт 12345 отображается на моей локальной машине через порт 12345.
- Я запускаю что-то на P12345 на удаленной машине
- Я могу получить к нему доступ через localhost:12345
Что я хочу сделать:
- Подключитесь к удаленному ПК и попросите, чтобы его локальный P12345 получил данные из моего локального P12345 (через туннель)
- Я запускаю что-то на своем локальном компьютере на P12345
- Другие люди могут получить доступ к удаленному: 12345 и увидеть мой локальный: 12345
2 ответа
Команда для переадресации порта 80 с вашего локального компьютера (localhost
) к удаленному хосту на порту 8000 есть:
ssh -R 8000:localhost:80 oli@remote-machine
Это требует дополнительной настройки на сервере SSH, добавьте строки в /etc/ssh/sshd_config
:
Match User oli
GatewayPorts yes
Затем перезагрузите конфигурацию, выполнив сервер sudo reload ssh
,
Настройки GatewayPorts yes
заставляет SSH связывать порт 8000 с подстановочным адресом, поэтому он становится доступным для публичного адреса remote-machine
(remote-machine:8000
).
Если вам нужно иметь возможность не связывать все по адресу подстановочного знака, измените GatewayPorts yes
в GatewayPorts clientspecified
, Так как ssh
привязывается к адресу обратной связи по умолчанию, необходимо указать пустой bind_address
для привязки подстановочного адреса:
ssh -R :8000:localhost:80 oli@remote-machine
:
до 8000
обязательно, если GatewayPorts
установлен в clientspecified
и вы хотите разрешить публичный доступ к remote-machine:8000
,
Соответствующие ручные выдержки:
-R [bind_address:] порт: хост: хост
Указывает, что данный порт на удаленном (серверном) хосте должен быть перенаправлен на данный хост и порт на локальной стороне. Это работает путем выделения сокета для прослушивания порта на удаленной стороне, и всякий раз, когда устанавливается соединение с этим портом, соединение перенаправляется по безопасному каналу, и устанавливается соединение с хост-портом хоста с локальной машины. По умолчанию прослушивающий сокет на сервере будет связан только с интерфейсом обратной связи. Это можно переопределить, указав bind_address. Пустой адрес bind_address или адрес "*" указывает, что удаленный сокет должен прослушивать все интерфейсы. Задание удаленного bind_address будет успешным, только если включена опция GatewayPorts на сервере (см. Sshd_config (5)).
GatewayPorts
Указывает, разрешено ли удаленным узлам подключаться к портам, перенаправленным для клиента. GatewayPorts можно использовать для указания того, что sshd должен позволять перенаправлениям удаленных портов связываться с адресами без обратной связи, что позволяет другим хостам подключаться. Аргумент может быть "нет", чтобы заставить перенаправления удаленных портов быть доступными только для локального хоста, "да", чтобы принудительно перенаправлять удаленные порты для привязки к подстановочному адресу, или "заданный клиентами", чтобы позволить клиенту выбрать адрес, по которому пересылка связана. По умолчанию "нет".
Смотрите также:
Если сервер имеет GatewayPorts no
, вы можете достичь того же результата, выполнив ssh -g -L 8001:localhost:8000 oli@remote-machine
на сервере, как только вы выполнили ssh -R
команда на клиенте. Это сделает петлевой порт 8000 на сервере доступным для всех интерфейсов на порте 8001.