Зворотне портове тунелювання


59

Мені потрібно завтра показати комусь веб-сайт, який працює на моїй локальній машині. Як правило, я досягну цього шляхом переадресації портів на моєму локальному маршрутизаторі, але завдяки відмові обладнання та його заміни жахливим, мій поточний маршрутизатор не дозволяє мені здійснювати переадресацію портів.

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

Я робив тунелювання портів раніше, але зазвичай це роблю правильно:

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

Що я хочу зробити:

  • Підключіться до віддаленого ПК і попросіть, щоб його локальний P12345 взяв речі з мого локального P12345 (над тунелем)
  • Я запускаю щось на своєму локальному комп’ютері на P12345
  • Інші люди можуть отримати доступ до віддаленого: 12345 та побачити мій локальний господар: 12345

Відповіді:


96

Команда для пересилання порту 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 до адреси wildcard, тому він стає доступним для публічної адреси 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.

Відповідні ручні витяги:

ssh (1)

-R [bind_address:] port: host: hostport
Вказує, що даний порт на віддаленому (серверному) хості повинен бути пересланий на даний хост і порт на локальній стороні. Це працює, виділяючи сокет для прослуховування порту на віддаленій стороні, і кожного разу, коли з'єднання здійснюється з цим портом, з'єднання пересилається через захищений канал, і встановлюється з'єднання для розміщення порту хосту порту з локальної машини. За замовчуванням прослуховувальна розетка на сервері буде прив'язана лише до інтерфейсу зворотного зв'язку. Це може бути відмінено, вказавши адресу bind_address. Порожня bind_address або адреса "*" вказує на те, що віддалений сокет повинен слухати на всіх інтерфейсах. Визначення віддаленої bind_address вдасться лише в тому випадку, якщо параметр GatewayPorts сервера включений (див. Sshd_config (5)).

sshd_config (5)

GatewayPorts
Вказує, чи дозволяється віддаленим хостам підключатися до портів, пересланих для клієнта. GatewayPorts можна використовувати, щоб вказати, що sshd повинен дозволяти віддаленим пересиланням портів прив'язуватися до адрес, що не мають зворотного зв'язку, тим самим дозволяючи іншим хостам підключатися. Аргументом може бути "ні", щоб змусити віддалені переадресації портів бути доступними лише для локального хоста, "так", щоб змусити віддалені переадресації портів прив'язуватися до підстановочної адреси, або "визначено клієнтами", щоб клієнт міг вибрати адресу, до якої переадресація пов'язана. За замовчуванням - "ні".

Дивитися також:


7
GatewayPortsбула тут чарівна куля. Мені подобається, що ти знайшов версію, яка може дозволити мені обмежити цю досить потужну техніку певними користувачами.
Олі

1
Мене бентежить те, що GatewayPorts повинен бути встановлений на машині, яка виконує фактичну команду ssh, щоб ініціювати зворотний тунель (локальний). На моєму розумінні було якось більш логічно, що інший кінець (віддалений) буде мати справу з тим, звідки приймати з'єднання, оскільки саме там ви підключаєтесь і з яких перенаправляєтесь. Мені потрібні віки, щоб обійти це.
Ars Magika

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.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.