Как обойти брандмауэр и NAT с помощью обратного SSH-туннеля

Я пытаюсь создать SSH-сервер в машине за маршрутизатором.

Сначала я попытался связать SSH с моим общедоступным IP-адресом:

ssh -R 10002:localhost:22 <ip_address>

Затем мне будет предложено ввести пароль, однако мой пароль пользователя не работает.

Очевидно, что я знаю свой пароль пользователя, поэтому мне кажется, что он пытается аутентифицироваться на другом компьютере в той же сети.

Любые предложения по исправлению этого вопроса?

Это также поможет мне в любой альтернативе, как создать SSH-сервер за маршрутизатором, когда у вас нет доступа к маршрутизатору.

Все порты в iptables открыты.

UPDATE

Как было предложено Thomas Oster, я пробовал следующее.

В машине за маршрутизатором я выполнил следующую команду:

$ ssh -R10002:localhost:22 <remote_public_ip_address> -l <my_remote_server_username>

<remote_ip_address> - это remote_ip_address сервера с общедоступным IP-сервером и SSH-сервером, на котором у меня есть полный контроль.

<my_remote_server_username> является именем пользователя удаленного сервера.

После этого я попытался подключиться с удаленного сервера к серверу за маршрутизатором следующим образом:

$ ssh -p 10002 <remote_public_ip_address>

Однако эта команда отображает следующий вывод:

ssh: connect to host <remote_public_ip_address> port 10002: Connection refused

Итак, я открыл порт 10002 в брандмауэре iptables, используя следующую команду:

sudo iptables -A INPUT -p tcp --dport 10002 -j ACCEPT

После этого я снова выполнил команду, но он отображает одно и то же сообщение об ошибке.

В моей машине за маршрутизатором у меня все порты открыты в iptables.

ОБНОВЛЕНИЕ 2

Вы должны разрешить переадресацию портов в файле /etc/ssh/sshd _config remove_public_ip_address сервер

Я попытался разрешить перенос портов в файле sshd_config, добавив эту команду:

LocalForward 10002 <my_remote_public_server_ip>:22

Но он дал мне это сообщение об ошибке:

Bad configuration option: LocalForward

После "ssh -R...." вы оставили окно открытым?

После выполнения этой команды он подключается к удаленному общедоступному компьютеру, и да, я оставил окно открытым.

Можете ли вы использовать локальный хост ssh -p 10002 на общедоступном сервере после туннель создается?

Да, если я запустил эту команду на общедоступном сервере, она подключится после запроса мне учетных данных.

Попробуйте "ssh localhost" на машине за маршрутизатором, чтобы проверить, работает ли sshd и работает.

Это также работает.

ОБНОВЛЕНИЕ 3

Наконец-то я смог заставить его работать (еще раз спасибо Thomas Oster)

Мы будем работать с тремя машинами:

Целевая машина: к которой мы хотим подключиться.

Средняя машина: сервер, действующий как посредник для подключения (Linode в моем случае)

Домашний компьютер: где мы будем обращаться к машине назначения.

Это шаги, которые я выполнил

Шаг 1:

[destination computer]$ vi /etc/ssh/sshd_config

Добавьте параметр GatewayPorts:

GatewayPorts yes

Перезапустите ssh.

Шаг 2:

[destination computer]$ ssh -R 4040:localhost:22 [email protected]

Это свяжет ваш общедоступный компьютер с компьютером назначения через порт 4040

Он подключится к среднему компьютеру и запросит терминал, вы должны оставить эту вкладку открытой.

Шаг 3:

Подключение из дома:

ssh [email protected] -p4040

Или подключитесь к средней машине:

[home computer]$ ssh [email protected]

[middle computer]$ ssh [email protected] -p4040

Источник

Ответ 1

Есть ли ssh-сервер, запущенный на общедоступном "ip_address"? То, что вы пытаетесь сделать, это "открыть ssh-соединение с" ip_address ", а затем туннелировать любой входящий запрос на порт 10002 на localhost: 22".

Если "ip-address" является общедоступным IP-адресом вашего dsl-маршрутизатора, вам необходимо создать переадресацию портов в конфигурации маршрутизатора на ваш хост: 22.

Если у вас нет доступа к маршрутизатору, единственная возможная вещь была бы, если бы вы имели доступ к другому серверу, на котором запущен ssh в Интернете, из которого вы можете туннелировать.

# open a session to the public available machine and create a tunnel from port 10002 back  to your local sshd (22)
ssh -R 10002:localhost:22 ip_of_public_server
# as long as this session is open, all calls to the public available machine on port 10002 will be tunneled to your local machine (make sure sshd is running on port 22)
ssh -p 10002 ip_of_public_server

Ответ 2

Как вы сказали, у нас есть "машина назначения" (где мы хотим подключиться к использованию ssh), "средняя машина" (публичный сервер, работающий в качестве пересылки), "другие компьютеры" (любой другой компьютер в сети)

Как сказал @thomas-oster, вы должны использовать

[destination computer] $ ssh -R 2222:localhost:22 ip_of_public_server

Однако для того, чтобы туннель связывался с 0.0.0.0 вместо localhost, вы должны использовать GatewayPorts в /etc/ssh/sshd _config на "средней машине" (общий сервер):

GatewayPorts yes

Конечно, вы должны перезапустить sshd после добавления этой опции.

Прочтите http://www.snailbook.com/faq/gatewayports.auto.html для объяснения: "по умолчанию SSH только прослушивает подключения к переадресованному порту на кольцевом адресе"

Это позволит вам подключиться с любого компьютера в сети до конечного компьютера, используя ip средней машины (общедоступный сервер):

[any computer on the net] $ ssh -p 2222 ip_of_public_server

Убедитесь, что ваш брандмауэр на общедоступном сервере позволяет подключаться к порту 2222/tcp.

Ответ 3

Недавно я наткнулся на ту же проблему, но без привилегий root на сервере SSH.

Как упомянуто GatewayPorts yes, так что клиенты из сети могут подключиться к удаленному порту пересылки на сервере SSH. По умолчанию установлено значение no. Таким образом, если у вас нет прав root, вы не можете изменить настройки SSHD, чтобы установить опцию GatewayPorts на true. Но в этом случае вы можете использовать следующее обходное решение:

ssh -R 4041:localhost:22 myserver.com 'socat TCP-LISTEN:4040,fork TCP:127.0.0.1:4041'

socat - отличная сетевая утилита, которая связывает TCP-порт 4040 с интерфейсом 0.0.0.0, поэтому он отображается из сети и перенаправляет весь трафик на 127.0.0.1:4041, где SSHD прослушивает и перенаправляет его на ваш клиентский порт 22.

Таким образом, если кто-то хочет подключить ваш локальный SSH на порт 22, как вы описали (на клиенте), он:

ssh -p 4040 myserver.com 

и он работает следующим образом:

SSH client --> myserver.com:4040 (socat) --> 127.0.0.1:4041 (myserver.com, SSHD) --> SSH client port 22

socat может быть либо построено из источников, либо уже установлено в системе. Он присутствует в репозиториях RPMForge для RHEL/CentOS (однако, если у вас нет прав root, вы не можете его установить).