Как обойти брандмауэр и NAT с обратным SSH-туннелем

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

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

ssh -R 10002:localhost:22 <ip_address>

затем появляется запрос пароля, но мой пароль не работает.

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

любые предложения, как исправить это?

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

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

обновление

как было предложено Томас Остера ответ я пробовал следующие.

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

$ 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 server

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

LocalForward 10002 <my_remote_public_server_ip>:22

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

Bad configuration option: LocalForward

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

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

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

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

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

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

обновление 3

я, наконец, смог заставить его работать (еще раз спасибо Томас Остера)

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

машина назначения: что мы хотим подключать.

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

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

вот шаги, которым я следовал

Шаг 1:

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

добавить опцию GatewayPorts:

GatewayPorts да

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

шаг 2:

[destination computer]$ ssh -R 4040:localhost:22 middle-machine-user@middle-machine-public-ip

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

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

Шаг 3:

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

ssh destination-user@destination-ip -p4040

или соединитесь от средней машины:

[home computer]$ ssh middle-machine-user@middle-machine-ip

[middle computer]$ ssh destination-user@localhost -p4040

источник

3 ответов


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

если" ip-адрес " является общедоступным 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

как вы сказали, у нас есть " машина назначения "(где мы хотим подключиться к 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.


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

как уже упоминалось GatewayPorts yes необходимо, чтобы клиенты из сети могли подключаться к удаленному порту пересылки на сервере SSH. По умолчанию установлено значение no. Таким образом, если у вас нет привилегий root, вы не можете изменить настройки SSHD, чтобы установить до 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, вы не можете его установить).