Как SSH к серверу, который я не могу напрямую связаться?


17

контекст

Я использую Ubuntu Desktop в качестве основного компьютера, который я назову D. Я хочу подключиться к серверу S через ssh, но брандмауэр блокирует меня.

У меня есть доступ к серверу S по очень громоздкому пути с использованием виртуальной машины Windows и PuTTY . Это делает работу с этим сервером чрезвычайно раздражающей: совершенно другая среда, копирование / вставка не работает, я не могу правильно использовать свой рабочий стол, когда он подключен к нему (Alt-Tab нарушается виртуальной машиной) и т. Д.

Я проверил, что я могу ssh с сервера S на мой настольный компьютер D (в противоположность тому, что мне нужно).

Могу ли я каким-либо образом инициировать «переадресацию портов» или подобное с сервера, чтобы я мог ssh на сервер с моего рабочего стола?


2
Хозяева прыжков ... должен любить их !!!
— RonJohn

Возможный дубликат туннельного SSH из A-> B-> C
— muru

@muru это другой сценарий, но, конечно, связанный (в конце концов, это туннелирование!). В этом случае я хочу фальсифицировать D->S, злоупотребляяS->D
— dangonfast

Ответы:


32

Вы можете использовать следующую команду для настройки SSH-туннеля от удаленного сервера до локального компьютера:

$ ssh -f -N -R 1234:localhost:22 user@your_machine_ip

Когда туннель настроен, вы можете просто подключиться к удаленному серверу с помощью следующей команды:

$ ssh -p 1234 user@localhost

Обратите внимание, что вам нужно настроить ssh-ключи для автоматического входа (без запроса пароля). Если вы хотите создать SSH-туннель в интерактивном режиме, вы можете удалить опции -f -N. Для получения дополнительной информации man ssh.


Как проходит этот туннель через Windows VM? (Там, где я работаю, есть несколько уровней межсетевых экранов, и открыты только несколько портов.)
— RonJohn

@RonJohn Я полагаю, что это использует тот факт, что (для OP) ssh-синг с сервера на рабочий стол работает, поэтому это устанавливает туннель от сервера (порт 22) непосредственно к настольному компьютеру (порт 1234), который может быть использован подключиться к ssh на сервере (который использует порт 22). Windows VM используется только для настройки туннеля. (поправьте меня, если я ошибаюсь)
— pizzapants184

@dangonfast В дополнение к ответу вы можете найти следующий документ значения: spencerstirling.com/computergeek/sshtunnel.html
— Pryftan

@RonJohn Документ, на который я только что ссылался, мог бы помочь ответить и на этот вопрос, по крайней мере, в том, что касается нескольких слоев брандмауэров и т. Д. (Если память мне не изменяет - я очень долго читал ее… Я просто вспомнил наличие ссылки из лет назад).
— Прифтан

1
@ pizzapants184 действительно, это была моя отправная точка: ssh из S -> D, поэтому я хочу злоупотребить этим, чтобы эффективно выполнять D -> S, даже если это не работает напрямую. Почему сеть настроена так, это то, что ускользает от меня. Это может быть преднамеренным или неправильной конфигурацией, но пока это работает для меня ...
— dangonfast

5

Если вы работаете с более новой версией OpenSSH (7.3+), вы можете использовать тот, ProxyJumpкоторый объединяет все магическим образом:

ssh -J windows_machine remote_server

Который по вашему ~/.ssh/configвыглядит:

Host remote_server
        HostName remote_server
        ProxyJump windows_machine
        User myname

ProxyJumpподдерживает полный синтаксис SSH, так что если вы jimна windows_serverи использует порт 2222для SSH. remote_serverна IP 192.168.0.110с того, что windows_serverвы можете написать:

Host remote_server
        HostName 192.168.0.110
        ProxyJump jim@windows_machine:2222
        User myname

И все же просто беги, ssh remote_serverчтобы добраться туда.


Если вы используете более старую версию SSH, используйте ProxyCommand - это позволяет вам указать SSH сначала выполнить команду для установки прокси-соединения, прежде чем выполнять настоящую команду SSH.

ssh -o ProxyCommand='ssh -W %h:%p windows_machine' remote_server

При этом используется опция SSH -W , которая является сокращением для более загадочного синтаксиса netcat .

Обратите внимание, что, поскольку при запуске ssh remote_serverвы работаете, windows_machineвам нужно убедиться, что вы используете IP-адрес remove_server из поля перехода, а не IP-адрес вашего компьютера - они вполне могут быть одинаковыми.

Затем вы можете добавить эту директиву в ваш ~/.ssh/configфайл:

Host remote_server
  HostName remote_server
  User myname
  ProxyCommand ssh -W %h:%p windows_machine

Это означает , что если remote_server есть другая машина , как видно из , windows_machineто вы можете положить , что в конфигурации и до сих пор просто использовать ssh remote_server.


1
Это гораздо лучший ответ.
— Роберт Ридл

Хотя это полезно, это не отвечает на задаваемый вопрос. OP заявляет, что они не могут SSH из D-> S (что они хотят), но они могут SSH из S-> D. Между ними нет прокси-серверов ssh (вместо этого есть виртуальная машина Windows, вероятно доступ к которой осуществляется через RDP).
— Мбриг

@mbrig действительно. Я не пробовал это решение, но я был бы удивлен, если бы оно
— работало

Но вы говорите, что можете добраться до машины с Windows - из этого я понял, что она может выступать в качестве переключателя между вами и другой машиной.
— Борис Паук

1
Я могу войти в систему Windows с помощью специального инструмента (VMWare Horizon). Я никогда не говорил, что могу с ним сшиться. Я даже проверил это, прежде чем опубликовать этот вопрос, установив ssh-сервер Putty companion (я забыл имя), но мои тесты не прошли. Я полагаю, что ssh тоже защищен сетью Windows.
— dangonfast

1

Вместо того, чтобы пытаться обойти вещи и создать запутанный путь, разве вы не можете просто попросить SSH с вашего рабочего стола на сервер, который будет разрешен? Если вам это нужно и вам нужен доступ к серверу, я не понимаю, почему вы отклонили запрос.


Не хочешь объяснить отрицательный голос? Вопрос "Как подключиться к серверу ssh, к которому я не могу напрямую связаться?" поэтому мой ответ, чтобы установить правило брандмауэра, чтобы оно действовало. Это также правильный способ обойти это в соответствии с хорошей практикой безопасности.
— Солнечная вспышка

У меня первая неделя трехмесячного контракта с крупным корпоративным клиентом. Мне не дали ноутбук (я использую мой), и только стол. Я получил десятки учетных данных, чтобы использовать различные сервисы, и мне едва удается совмещать все это. То, что я хочу сделать, не является жестким требованием для выполнения моей работы: я могу работать в ВМ, и это то, что мой босс скажет мне, если я начну задавать забавные вопросы. Или он укажет мне на справочную службу, которая пойдет по дороге в течение следующих нескольких недель / месяцев.
— dangonfast

Для меня работа на виртуальной машине легко будет означать 50% -ную потерю производительности, поэтому я хочу как можно больше ее избежать. Тем не менее, я люблю этот концерт!
— dangonfast

1
Я могу понять, что. По моему опыту, «крупные корпоративные клиенты», как правило, расстраиваются, когда подрядчики обходят межсетевые экраны и политики для выполнения своей работы, даже если это делается для альтруистических целей. Тот факт, что вы можете использовать SSH с сервера на свой рабочий стол, говорит мне, что вы либо не в состоянии сделать обратное, - это упущение или что-то, что было введено для определенной цели.
— Solarflare

4
Это единственное реальное решение, если вы хотите избежать риска быть уволенным за обход политик ... По крайней мере, поговорите с ответственными лицами, прежде чем использовать решение Khaleds, чтобы они знали, что вы делаете.
— Свен
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.