149

Ну, возвращаясь к этому вопросу, я запускаю команду

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

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

РЕДАКТИРОВАТЬ: Кажется, что удаленная сторона привязывается только на локальный хост, а не ко всем интерфейсам.

РЕДАКТИРОВАТЬ 2: клиент Mac OS X 10.6 и сервер Linux Mint, но оба они OpenSSH.

6 ответов6

310

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

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

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

36

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

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

То, что вы хотите, это.

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

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

Используйте опцию -g. Со страницы руководства ssh:

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

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

В конечном итоге я использовал 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

9

Вы также можете использовать двойную переадресацию, если вы не хотите или можете изменить /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"
8

Используйте опцию "порты шлюза".

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

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

0

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

Host REMOTE_HOST_NAME RemoteForward \*:8080 127.0.0.1:80

Помните, что брандмауэр удаленного хоста разрешает подключения к 8080 и гарантирует, что для параметра GatewayPorts в вашем /etc/ssh/sshd config не задано значение no

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .