Вопрос Как сделать туннель ssh открытым для публики?


Ну, вернемся к это вопрос, я выполняю команду

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

на Mac. Тем не менее, порт, который туннелируется, не работает публично. Я запускаю такую ​​команду, чтобы сделать так, чтобы локальный порт можно было открыть на удаленном компьютере. И он работает при открытии порта на локальном хосте на удаленном компьютере, но когда я пытаюсь получить доступ к общедоступному IP-адресу удаленного компьютера с моего локального компьютера, порт не кажется открытым. Как я могу сделать общедоступным туннель для IP-адреса для доступа?

EDIT: Кажется, что удаленная сторона связывается только с localhost, а не со всеми интерфейсами.

EDIT 2: клиент Mac OS X 10.6, а сервер - Linux Mint, но оба они - OpenSSH.


137
2018-04-27 22:14


происхождения


Что означает общедоступный IP-адрес? Если вы пытаетесь подключиться к локальному компьютеру через маршрутизатор и через Интернет, большинство маршрутизаторов не разрешат такой loopback. - harrymc


ответы:


Если вы проверите man-страницу для ssh, вы увидите, что синтаксис для -R гласит:

-Р [bind_address:]порт:хозяин:HostPort

когда bind_address (как в вашем примере), порт привязан только к интерфейсу loopback. Чтобы привязать его ко всем интерфейсам, используйте

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). (Вам нужны цитаты, потому что [::] может быть интерпретировано как glob в противном случае.)

Обратите внимание, что если вы используете OpenSSH sshd сервер, сервер GatewayPorts необходимо включить параметр (установлен в yes или clientspecified), чтобы это работало (проверьте файл /etc/ssh/sshd_config на сервере). В противном случае (значение по умолчанию для этой опции равно no), сервер всегда будет принудительно привязывать порт к интерфейсу loopback.


281
2018-05-06 06:11



ОН МОЙ БОГ ЭТО РАБОТАЕТ !!!!! Я сделал именно это 1 миллион раз! Я просто забыл, что * в bash дадут файлы, и мне нужно \* - Trevor Rudolph
Да, именно поэтому я всегда предпочитаю 0.0.0.0 - это только IPv4, но он будет делать большую часть времени :) - Stefan Seidel
GatewayPorts да решила мою проблему. - Sunry
GatewayPorts = yes (в удаленной конфигурации sshd) исправил это для меня тоже - Phil_1984_
«GatewayPorts yes» сделал мой день, спасибо @StefanSeidel - karser


Редактировать:

-g работает для локальных переадресованных портов, но то, что вы хотите, это обратный / удаленный переадресованный порт, который отличается.

Что вы хотите это,

По существу, на example.com, задавать GatewayPorts=clientspecified в /etc/ssh/sshd_config,

--- предыдущий (неверный) ответ ---

Используйте параметр -g. Из справочной страницы ssh:

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

32
2018-04-28 03:34



похоже, не работает ... он запускается, но я не могу подключиться удаленно - Trevor Rudolph
Попробуйте запустить netstat -elnpt из отдельного tty, чтобы выяснить, какие порты связаны с каким адресом. Без -g, порт должен быть связан с 127.0.0.1:PORT, С -g, он должен быть связан с 0.0.0.0:PORT, что делает его доступным удаленно. - snapshoe
pastebin.com/q6f4kJyd - Trevor Rudolph
GatewayPorts=clientspecified или GatewayPorts clientspecified - Trevor Rudolph
и добавить это к клиенту или удаленному? - Trevor Rudolph


Вот мой ответ для завершения:

Я закончил тем, что использовал ssh -R ... для туннелирования и использования socat Кроме того, для перенаправления сетевого трафика на 127.0.0.1:

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

Сокат: mitm$ socat TCP-LISTEN:9090,fork TCP:127.0.0.1:9999

Другой вариант - сделать локальный туннель поверх этого, но я нахожу это много помедленнее

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


10
2017-10-29 12:09



Мне нравится, что мне не нужно иметь дело с конфигурацией sshd и что я могу сделать все это без sudo. Плюс я узнаю, что существует общество. Благодаря! - BrutusCat


Вы также можете использовать двойной форвард, если вы не можете или можете изменить / etc / ssh / sshd_config.

Сначала перейдите на временный порт (например, 10080) на устройстве loopback на удаленном компьютере, затем используйте локальный адрес для перенаправления портов 10080 на 80 на всех интерфейсах:

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

8
2017-08-01 22:37



Это действительно работает, чтобы обойти правила пересылки! - Michael Schubert
Любите это решение. Большой обходной путь, когда вы не хотите изменять конфигурацию на машине - Grezzo


Используйте опцию «шлюзовые порты».

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

Чтобы использовать это, вам, вероятно, нужно добавить "GatewayPorts yes"на ваш сервер /etc/ssh/sshd_config,


6
2018-04-28 13:58



На самом деле это сработало. Что я делаю, так это то, что я использую экземпляр EC2 в качестве пересылки для моего сервера REST. Таким образом, мне не нужно вставлять свой сервер в DMZ, и мне не нужен публичный IP-адрес. Забавно, что с первым экземпляром EC2, который я создал, ssh -R remote_port: localhost: port xxx @ ec2xxx работал отлично, но потом мне пришлось создать другой экземпляр позже по какой-то причине и с этого момента я всегда получал: соединение отказалась. Использовал tcpdump, чтобы посмотреть, что я получаю, и информации было мало. -g плюс GatewayPorts да трюк. - E.T