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

17

контекст

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

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

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

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

dangonfast
источник
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, чтобы они знали, что вы делаете.
Свен