Як зробити тунель 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.