2013-04-27 22:14:51 +0000 2013-04-27 22:14:51 +0000
189
189

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

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

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

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

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

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

Ответы (7)

368
368
368
2013-05-06 06:11:42 +0000

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

-R [_bind\_address_:]_port_:_host_:_hostport_

Когда `bindaddress`_ опущено (как в вашем примере), порт привязан только к интерфейсу обратной связи по циклу. Чтобы сделать его привязанным ко всем интерфейсам, используйте

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 natively и через IPv4 через IPv4-mapped IPv6 addresses (не работает на Windows, OpenBSD).   (Вам нужны кавычки, потому что [::] может быть интерпретирован как глобус в противном случае.)

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

40
40
40
2013-04-28 03:34:48 +0000

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

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

Вы хотите это .

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

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

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

-g Allows remote hosts to connect to local forwarded ports.
15
15
15
2013-10-29 12:09:40 +0000

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

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

10
10
10
2016-08-01 22:37:07 +0000

Вы также можете использовать двойной форвард, если не хотите или можете изменить /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
8
8
2013-04-28 13:58:50 +0000

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

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

Для того, чтобы использовать эту опцию, вам, вероятно, нужно добавить “GatewayPorts yes” к /etc/ssh/sshd_config вашего сервера.

2
2
2
2019-06-03 20:09:02 +0000

Jump hosts - довольно недавнее дополнение к OpenSSH. Для этого требуется доступ SSH к промежуточному, но он должен работать без дополнительной конфигурации.

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

Эта команда инструктирует SSH сначала подключиться к root@example.com, а затем, с этой машины, инициировать подключение к порту 8080 на localhost (т.е. порту, который туннелируется с прыгающего хоста на удаленный хост) под именем пользователя remoteuser.

0
0
0
2018-08-26 15:50:49 +0000

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

Host REMOTE_HOST_NAME RemoteForward \*:8080 127.0.0.1:80

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

Похожие вопросы

3
19
12
16
4