Як зробити тунель ssh відкритим для публіки?


174

Ну, повертаючись до цього питання, я виконую команду

ssh -R 8080:localhost:80 -N root@example.com

на Mac. Однак порт, який тунелюється, не працює публічно. Я виконую таку команду, щоб зробити так, щоб локальний порт можна було відкрити на віддаленому комп'ютері. І це працює, коли відкриваю порт на localhost на віддаленому комп'ютері, але коли я намагаюся отримати доступ до публічної IP-адреси віддаленого комп'ютера з мого локального комп'ютера, порт не здається відкритим. Як я можу зробити тунель загальнодоступним для IP для кожного, хто має доступ?

EDIT: Схоже, віддалена сторона прив'язується лише до localhost, а не до всіх інтерфейсів.

EDIT 2: Клієнт Mac OS X 10.6 і сервер Linux Mint, але вони обидва OpenSSH.


Що означає громадський ІР? Якщо ви намагаєтеся підключитися до локального комп'ютера через маршрутизатор та через Інтернет, більшість маршрутизаторів не дозволять такої петлі.
— harrymc

Відповіді:


351

Якщо ви перевірите сторінку man на ssh, то виявите, що синтаксис -Rчитає:

-R [ bind_address :] порт : host : hostport

Якщо bind_addressпропущено (як у вашому прикладі), порт прив'язується лише до інтерфейсу зворотного зв'язку. Для того, щоб зв'язати його з усіма інтерфейсами, використовуйте

ssh -R \*:8080:localhost:80 -N root@example.com

або

ssh -R 0.0.0.0:8080:localhost:80 -N root@example.com

або

ssh -R "[::]:8080:localhost:80" -N root@example.com

Перша версія пов'язується з усіма інтерфейсами окремо. Друга версія створює загальну прив'язку лише для IPv4, що означає, що порт доступний на всіх інтерфейсах через IPv4. Третя версія, ймовірно, технічно рівнозначна першій, але знову ж таки, вона створює лише одне прив'язування до цього ::, що означає, що порт доступний через IPv6 спочатку і через IPv4 через IPv4-відображені IPv6 адреси (не працює в Windows, OpenBSD) . (Цитати вам потрібні, оскільки [::]в іншому випадку їх можна інтерпретувати як глобус.)

Зауважте, що якщо ви використовуєте OpenSSH- sshdсервер, для цього GatewayPortsфункція повинна бути включена (встановлена yesабо clientspecified) (перевірити файл /etc/ssh/sshd_configна сервері). В іншому випадку (значення за замовчуванням для цієї опції є no), сервер завжди змусить порт обмежувати лише інтерфейс зворотного зв'язку.


12
О МОЙ БОГ БОГО РОБИТИ !!!!! Я зробив саме це 1 мільйон разів !! Я просто забув, що *в баші дадуть файли, і мені це потрібно\*
— Тревор Рудольф

4
Так, саме тому я завжди віддаю перевагу 0.0.0.0- це лише IPv4, але це робитиму більшу частину часу :)
— Стефан Зайдель

34
GatewayPorts так вирішив мою проблему.
— Сонник

4
GatewayPorts = так (на віддаленому конфігурації sshd) виправив це і для мене
— Phil_1984_

3
"GatewayPorts так" зробив свій день, дякую @StefanSeidel
— karser

37

Редагувати:

-g працює для локальних переадресованих портів, але те, що ви хочете, - це порт зворотного / віддаленого переадресації, який відрізняється.

Що ти хочеш, це і є .

За суті, на example.com, встановлений GatewayPorts=clientspecifiedв /etc/ssh/sshd_config.

--- попередня (неправильна) відповідь ---

Використовуйте опцію -g. Зі сторінки сторінки ssh:

-g     Allows remote hosts to connect to local forwarded ports.

здається, не працює ... він запускається, але я не можу підключитися віддалено
— Тревор Рудольф,

2
Спробуйте запустити netstat -elnptз окремої програми, щоб зрозуміти, які порти пов'язані з якою адресою. Без -gцього порт повинен бути прив’язаний 127.0.0.1:PORT. З -gцим слід пов'язати 0.0.0.0:PORT, що робить його доступним віддалено.
— знімок


2
GatewayPorts=clientspecifiedабоGatewayPorts clientspecified
— Тревор Рудольф

і чи можу я додати це до клієнта чи віддаленого?
— Тревор Рудольф

14

Ось моя відповідь на завершення:

Я в кінцевому підсумку використовував ssh -R ...для тунелювання та, socatкрім того, для перенаправлення мережевого трафіку на 127.0.0.1:

тунель прив’язаний до 127.0.0.1: ssh -R mitm:9999:<my.ip>:8084 me@mitm

socat: mitm$ socat TCP-LISTEN:9090,fork TCP:127.0.0.1:9999

Інший варіант - зробити тунель лише для місцевих послуг, але я вважаю це набагато повільніше

mitm$ ssh -L<mitm.ip.address>:9090:localhost:9999 localhost


Мені подобається те, що мені не доведеться мати справу з конфігурацією sshd і що я можу все це робити без sudo. Плюс я дізнаюся, що socat існує. Дякую!
— BrutusCat

+ вгору ви йдете добрий пане. Я намагався сказати ssh прив’язати до 0,0.0.0 без успіху. Потім побачив синтаксис *, спробував це, без кісток. Я думаю, що це може бути якась функція захисту на sshd config або щось, що не дозволяє. Нарешті побачив цю посаду і socatспрацював приголомшливо. Супер корисно, поклавши це до моєї задньої кишені;]
— Хайме

10

Ви також можете використовувати подвійний вперед, якщо ви не можете або можете змінити / etc / ssh / sshd_config.

Спочатку направляйте до тимчасового порту (наприклад, 10080) на пристрої зворотного зв'язку на віддаленій машині, а потім використовуйте локальний перехід туди, щоб перенаправити порт 10080 на 80 на всіх інтерфейсах:

ssh -A -R 10080:localhost_or_machine_from:80 user@remote.tld "ssh -g -N -L 80:localhost:10080 localhost"

1
Це насправді працює в обхід правил переадресації!
— Майкл Шуберт

Любіть це рішення. Чудове рішення, коли ви не хочете змінити конфігурацію машини
— Grezzo

8

Використовуйте опцію "порти шлюзу".

ssh -g -R REMOTE_PORT:HOST:PORT ...

Щоб скористатися цим, вам, ймовірно, потрібно " GatewayPorts yes" додати " " до свого сервера /etc/ssh/sshd_config.


Насправді це спрацювало. Що я роблю, це те, що я використовую екземпляр EC2 в якості експедитора на свій REST-сервер. Таким чином, мені не потрібно вставляти свій сервер у DMZ, і я не потребую відкритої IP-адреси. Досить смішно, коли я створив перший екземпляр EC2, ssh -R remote_port: localhost: port xxx @ ec2xxx працював чудово, але потім мені чомусь довелося створювати інший екземпляр, і з цього моменту я завжди отримував: з'єднання відмовився. Використовував tcpdump, щоб переглянути те, що я отримував, і інформації було не так багато. -g плюс GatewayPorts так зробив свою справу.
— ET

1

Хости стрибків - досить недавнє доповнення до OpenSSH. Це вимагає доступу SSH до проміжного, але має працювати без додаткової конфігурації.

ssh -J root@example.com remoteuser@localhost -p 8080

Ця команда дає команду SSH спочатку підключитися до root@example.comцієї машини, а потім із цієї машини ініціювати з'єднання з портом 8080 у localhost(тобто порт, який тунельований від хост-стрибків до віддаленого хоста) під remoteuserіменем користувача.


0

Якщо ви хочете вставити конфігурацію в себе ~/.ssh/configзамість використання параметрів командного рядка, ви можете спробувати щось на кшталт

Host REMOTE_HOST_NAME RemoteForward \*:8080 127.0.0.1:80

Пам’ятайте, що у вас брандмауер віддаленого хоста дозволяє підключення до 8080 і переконайтеся, що GatewayPortsпараметр /etc/ssh/sshdконфігурації не встановленийno

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