Обратное туннелирование портов

59

Мне нужно показать кому-нибудь сайт, работающий на моей локальной машине завтра. Обычно я выполняю это путем переадресации портов на моем локальном маршрутизаторе, но из-за сбоя оборудования и его замены, являющейся ужасной, мой текущий маршрутизатор не позволяет мне переадресовывать порты.

Так что, застряв в этой задержке и не желая перенести все это на надлежащий сервер, у меня возникла безумная идея: могу ли я просто перенаправить свой порт на внешний сервер через SSH?

Я уже делал туннелирование портов, но обычно делаю это правильно:

  • Я подключаюсь к удаленной коробке и спрашиваю, что порт 12345 отображается на моей локальной машине через порт 12345.
  • Я запускаю что-то на P12345 на удаленной машине
  • Я могу получить к нему доступ через localhost: 12345

Что я хочу сделать:

  • Подключитесь к удаленному ПК и попросите, чтобы его локальный P12345 получил данные из моего локального P12345 (через туннель)
  • Я запускаю что-то на своем локальном компьютере на P12345
  • Другие люди могут получить доступ к удаленному: 12345 и увидеть мой локальный: 12345
Оли
источник

Ответы:

97

Команда для переадресации порта 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

Значение :before 8000является обязательным, если GatewayPortsзадано значение clientspecifiedи вы хотите разрешить публичный доступ remote-machine:8000.

Соответствующие ручные выдержки:

SSH (1)

-R [bind_address:] port: host: hostport
Указывает, что данный порт на удаленном (серверном) хосте должен быть перенаправлен на данный хост и порт на локальной стороне. Это работает путем выделения сокета для прослушивания порта на удаленной стороне, и всякий раз, когда устанавливается соединение с этим портом, соединение перенаправляется по безопасному каналу, и устанавливается соединение с хост-портом хоста с локальной машины. По умолчанию прослушивающий сокет на сервере будет связан только с интерфейсом обратной связи. Это можно переопределить, указав bind_address. Пустой адрес bind_address или адрес «*» указывает, что удаленный сокет должен прослушивать все интерфейсы. Задание удаленного bind_address будет успешным, только если включена опция GatewayPorts на сервере (см. Sshd_config (5)).

sshd_config (5)

GatewayPorts
Указывает, разрешено ли удаленным узлам подключаться к портам, перенаправленным для клиента. GatewayPorts можно использовать для указания того, что sshd должен позволять перенаправлениям удаленных портов связываться с адресами без обратной связи, что позволяет другим хостам подключаться. Аргументом может быть «нет», чтобы принудительно сделать переадресацию удаленных портов доступным только локальному узлу, «да» для принудительной переадресации удаленных портов на привязку к подстановочному адресу или «указание клиента», чтобы клиент мог выбрать адрес, по которому пересылка связана. По умолчанию «нет».

Смотрите также:

Lekensteyn
источник
7
GatewayPortsбыла волшебная пуля здесь. Мне нравится, что вы нашли версию, которая может позволить мне ограничить эту довольно мощную технику для определенных пользователей.
Оли
1
Что меня смущало, так это то, что GatewayPorts должен быть установлен на машине, на которой выполняется настоящая команда ssh, чтобы инициировать обратный туннель (локальный). На мой взгляд, было более логично, что другой конец (удаленный) будет иметь дело с тем, где принимать соединения, поскольку именно туда вы подключаетесь и перенаправлены. Мне понадобилось много времени, чтобы обойти это.
Арс Магика
2
@ArsMagika Я не уверен, что я вас понимаю. GatewayPorts должен быть установлен на сервере SSH, а не на локальном компьютере, на котором выполняется sshкоманда. Он определяет, могут ли другие клиенты связываться с переадресованными портами на сервере.
Лекенштейн
Недостаток этого решения: вы теряете возможность определять IP-адрес клиента в журнале доступа веб-сервера. Есть ли способ решить эту неприятность?
Twonky
@Twonky Если вам не нужно знать точный IP-адрес клиента (только чтобы он был удаленным, а не «localhost»), и ваш локальный сервер прослушивает подстановочный адрес (то есть принимает соединения с любого адреса), тогда вы можете попробовать переадресовать на -R :8000:127.0.1.1:80(или любой другой 127.x.x.xадрес). В противном случае нет, вы не сможете узнать удаленный IP-адрес.
Лекенштейн
14

Если сервер имеет GatewayPorts no, вы можете достичь того же результата, выполнив ssh -g -L 8001:localhost:8000 oli@remote-machineна сервере, как только вы выполнили ssh -Rкоманду на клиенте. Это сделает петлевой порт 8000 на сервере доступным для всех интерфейсов на порте 8001.

FaST4
источник