Как я могу SSH к машине A через B в одной команде?

Я хочу получить доступ к компьютеру, скажем, машина A , которая основана в сети моего университета. Однако этот компьютер доступен только через внутреннюю сеть университета, поэтому я не могу напрямую использовать SSH для этого компьютера из дома.

Вот что я делаю сейчас:

  1. Войдите в систему другого университетского компьютера, скажем, машина B

    (Этот компьютер B доступен через SSH с моего домашнего компьютера.)

  2. Используйте SSH на B для подключения к A.

Есть ли способ сделать это быстрее? Использование только одной команды ssh.

141
задан 22 June 2013 в 19:57

8 ответов

Использование ProxyCommand в вашей конфигурации SSH.

Создайте файл конфигурации SSH в вашем домашнем каталоге (если вы не хотите сделать его общесистемным), ~ /.ssh/config:[12155 impression Теперь вы можете напрямую связаться с машиной A, используя

ssh user@internalmachine

. Также обратите внимание, что теперь у вас есть одно целевое имя хоста SSH для него, вы также можете использовать его в других приложениях. Например: [

  • SCP для копирования файлов.

     scp somefile user @ internalmachine: ~ /
     
  • В ваших приложениях с графическим интерфейсом:

    используйте sftp: // user @ internalmachine / в качестве места для просмотра на машине.

    На основе KDE (Dolphin): используйте fish : // user @ internalmachine /

Примечания

Измените hostname.or.IP.address.internal.machine и порт ( 22 ) на компьютер, который вам нравится получить доступ, как если бы вы это делали с машины unibroker .

В зависимости от версий netcat на хосте unibroker, параметр -q0 должен быть опущен.Что касается аутентификации; вы в основном настраиваете два SSH-соединения со своей рабочей станции. Это означает, что и хост юниброкера, и хост внутренней машины проверяются / аутентифицируются друг за другом (как для пары ключей / пароля, так и для проверки ключа хоста).

Объяснение

Этот подход к использованию ProxyCommand и netcat - лишь один из способов сделать это. Мне это нравится, потому что мой SSH-клиент напрямую общается с целевой машиной, так что я могу проверить ключ хоста от моего клиента, и я могу использовать свою аутентификацию с открытым ключом без использования другого ключа на брокере.

Каждый Host определяет начало нового раздела хоста. Имя хоста - это целевое имя хоста или IP-адрес этого хоста. Пользователь - это то, что вы должны предоставить, поскольку пользовательская часть в ssh (скрыта) будет использоваться в качестве канала к целевой машине. Используя SSH для первой машины и напрямую настраивая простой 'netcat' ( nc ) для цели оттуда, это в основном просто открытый текст, пересылаемый на внутреннюю машину от посредника между ними. Параметры -q предназначены для отключения любого вывода (только личное предпочтение).

Убедитесь, что у вас установлен netcat на брокере (обычно доступно по умолчанию в Ubuntu) - либо netcat-openbsd Install netcat-openbsd или netcat-Traditional Install netcat-traditional.

Обратите внимание, что здесь вы по-прежнему дважды используете SSH с шифрованием. Пока канал netcat является открытым текстом, ваш SSH-клиент на вашем ПК настроит другой зашифрованный канал с конечной целевой машиной.

120
ответ дан 22 June 2013 в 19:57

Вы можете использовать параметр командной строки -J :

ssh -J user@machineB user@machineA

Из man ssh :

-J [user@]host[:port]
     Connect to the target host by first making a ssh connection to
     the jump host and then establishing a TCP forwarding to the
     ultimate destination from there.  Multiple jump hops may be
     specified separated by comma characters.  This is a shortcut to
     specify a ProxyJump configuration directive.

Он был представлен в OpenSSH версии 7.3 (выпущен в августе 2016 г.) ). Он доступен в Ubuntu 16.10 и более поздних версиях.

58
ответ дан 22 June 2013 в 19:57

Переход за один раз

Очевидной альтернативой подходу ProxyCommand, который я предоставил в , мой другой ответ будет «переходить» непосредственно к целевой машине:

ssh -t user@machineB ssh user@machineA

Обратите внимание на -t в первой команде ssh . Без него произойдет сбой:

Pseudo-terminal will not be allocated because stdin is not a terminal.
ssh_askpass: exec(/usr/bin/ssh-askpass): No such file or directory
Permission denied, please try again.
[...]

Это заставит выделить настоящий TTY.

Обратной стороной этого является то, что теперь вся конфигурация, проверка и аутентификация происходит на компьютере B, что мне очень не нравится в моей ситуации по соображениям безопасности. Мне нравится моя пара ключей на моем собственном ПК, и я проверяю и проверяю конечную целевую машину на моем собственном ПК. Кроме того, вы можете использовать только интерактивную оболочку для SSH, так что это не будет иметь дело с другими инструментами, такими как SCP или с помощью файлового менеджера графического интерфейса.

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

60
ответ дан 22 June 2013 в 19:57

То есть вам нужно несколько перемычек: )

Недавно я столкнулся с этой проблемой с jumper1 jumper2 и моей последней машиной, что касается моего локального сценария sol

:

#!/bin/bash
sshpass -p jumper1Passwd ssh -t jumper1@jumper1IP ./Y00.sh

затем на 1-я перемычка (это мой маршрутизатор), я разместил скрипт с именем Y00.sh:[1221 impression Вы можете заменить их своим IP-адресом и паролями, удачи!

1
ответ дан 22 June 2013 в 19:57

Попробуйте использовать

Host <visible hostname alias>
        Controlmaster auto
        User <user>
        hostname <visible hostname>
        port <port>
        IdentityFile ~/.ssh/<id file>

Host <private LAN hostname alias>
     ProxyCommand ssh -q -W <private LAN hostname>:<private LAN port> <visible hostname alias>

в вашем ~ / .ssh / config и сделайте все сразу, используя ключи только на вашем компьютере.

19
ответ дан 22 June 2013 в 19:57

ProxyCommand - чистое решение для случая, когда вы разрешаете доступ к оболочке в обеих системах. Мы хотели предоставить удаленным пользователям доступ к внутренней машине (A) через брокера (B), но не разрешать пользователю доступ оболочки к B для повышения безопасности. Это сработало:

Замените оболочку входа в систему

Замените оболочку входа (используйте chsh ) для extuser на брокере следующим сценарием (хранится в файле):

#!/bin/sh   # this is essential to avoid Exec format error
ssh internaluser@A

При условии, что вход с паролем не был установлен в extuser @ B для удаленного пользователя и во internaluser @ A для extuser @ B, выполнение следующей команды приведет удаленного пользователя непосредственно к A

ssh extuser@B

Совет : Создать необходимая настройка авторизованных ключей без пароля в extuser @ B перед переходом к пользовательской оболочке входа. После изменения, поскольку эта учетная запись недоступна для кого-либо через оболочку, только sudoer @ B может вносить изменения в файл authorized_keys, редактируя его напрямую.

sudo vi ~extuser/.ssh/authorized_keys
sudo touch ~extuser/.hushlogin

Последняя строка предназначена для подавления отображения баннера входа из B, поэтому удаленный пользователь имеет прозрачный доступ к A.

1
ответ дан 22 June 2013 в 19:57

Это очень полезное предложение. После нескольких часов возни я нашел эту заметку и подтвердил, что она работает точно так, как задокументировано. Для подключения через MachineA к MachineB с удаленной машиныC:

например: [xuser @ machineC ~] ssh -t MachineA ssh MachineB

«-t» является критическим, ssh не работает, если его нет. Вам будет предложено дважды: сначала ввести пароль на MachineA, а затем второй раз для MachineB. Также обратите внимание, что это предполагает, что у вас есть пользователь "xuser", определенный для всех три машины. Если нет, просто используйте синтаксис ssh: «yuser @ MachineA ...». Также обратите внимание, что вы можете использовать четырехкратные необработанные IP-адреса с точками, если хотите. Это полезно, если вы связываете через частную локальную сеть, которая использует IP-адреса, не доступные миру, т.е. не в ваш локальный файл хоста или любой DNS. Чтобы получить файл с MachineB на удаленный machineC, вы можете scp с MachineB на MachineA, затем с MachineA на удаленную machineC. (Например, удаленный machineC может пинговать MachineA, но не MachineB.) Предостережение: я тестировал с Fedora и WindowsXP, MachineA - это XP-box, работающий под управлением ICS (Internet Connection Sharing), а MachineB и удаленный machineC - это Fedora-Linux. Это предложение решило для меня ключевую проблему - т.е. ограниченный контролируемый удаленный доступ к локальной сети моего удаленного сайта. Также обратите внимание, когда вы «выходите из системы» из MachineB, вы должны увидеть два «Соединение с xxx.xxx.xxx.xxx закрыто». сообщения.

1
ответ дан 22 June 2013 в 19:57

machineA - конечная цель. machineB является брокером.

Мы хотим легко сделать home - machineB - machineA через ssh.

В OpenSSH версии 7.3 (выпущен в августе 2016 г.) ) или более поздней версии , вы можете выполнить одно из следующих действий:

.ssh / config подход:

Добавьте следующие строки в свой .ssh / config :

Host machineB
    Hostname 12.12.12.12           # IP of machineB (w.r.t. home)
    User usernameB                 # username on machineB

Host machineA
    Hostname 34.34.34.34           # IP of machineA (w.r.t. machineB)
    ProxyJump usernameB@machineB   # PROXY MAGIC!
    User usernameA                 # username on machineA    

Затем введите ssh machineA . Также совместим с scp . Вы можете дополнить приведенную выше конфигурацию, чтобы также принудительно использовать определенный ключ, используя https://unix.stackexchange.com/a/494485 .

-J параметр флага:

Просто введите ssh -J usernameB @ machineB (скрытые) заметки

Этот ответ объединяет ответы gertvdijk и Erik Sjölund с руководством на https://en.wikibooks.org/wiki/OpenSSH/Cookbook/Proxies_and_Jump_Hosts#cite_note- ProxyJump-1 .

0
ответ дан 5 January 2021 в 23:22

Другие вопросы по тегам:

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