Как мне подключиться по SSH к машине A через B одной командой?

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

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

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

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

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

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

С помощью ProxyCommand в вашей конфигурации SSH.

Создайте файл конфигурации SSH в вашем домашнем каталоге (если вы не хотите сделать это общесистемным), ~/.ssh/config:

Host unibroker          # Machine B definition (the broker)Hostname 12.34.45.56    # Change this IP address to the address of the brokerUser myusername         # Change this default user accordingly                         # (`user@unibroker` can overwrite it)Host internalmachine    # Machine A definition (the target host)ProxyCommand ssh -q unibroker nc hostname.or.IP.address.internal.machine 22

Теперь вы можете напрямую связаться с машиной А с помощью

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-соединения со своей рабочей станции. Это означает, что как хост unibroker, так и хост internalmachine проверяются / аутентифицируются друг против друга (как для пары ключей / пароля, так и для проверки ключа хоста).

Объяснение

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

Каждый Host определяет начало нового раздела хоста. Hostname является целевым именем хоста или IP-адресом этого хоста. User это то, что вы бы предоставили в качестве пользовательской части в ssh user@hostname.

ProxyCommand будет использоваться в качестве канала к целевой машине. Используя SSH для подключения к первой машине и непосредственно настраивая простой "netcat" (nc) к цели оттуда, это в основном просто пересылка открытого текста на внутреннюю машину от посредника между ними. То -q варианты заключаются в том, чтобы отключить любой вывод (просто личные предпочтения).

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

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

Вы могли бы использовать -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 и более поздних версиях.

Прыгайте на одном дыхании

Очевидная альтернатива подходу 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 directoryPermission denied, please try again.[...]

Это приведет к выделению реального TTY

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

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

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

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

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 machineBHost 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 usernameA@machineA.

Заключительные замечания

Этот ответ объединяет ответы Гертвдейка и Эрика Сьелунда с руководством по адресу https://en.wikibooks.org/wiki/OpenSSH/Cookbook/Proxies_and_Jump_Hosts#cite_note-ProxyJump-1.

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

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

"-t" имеет решающее значение, ssh завершается сбоем, если его нет.Вам дважды будет предложено ввести пароль, сначала для machineA, а затем во второй раз для MachineB. Также обратите внимание, что это предполагает, что у вас есть пользователь "xuser", определенный на всех трех машинах. Если нет, просто используйте синтаксис ssh: "yuser@machineA ...". Также обратите внимание, что вы можете использовать dotted quad raw IP#s, если хотите. Это полезно, если вы подключаетесь к частной локальной сети, которая использует IP-адреса, не доступные миру, т.е. ни в вашем локальном файле хоста, ни в каком-либо DNS. Чтобы получить файл из MachineB в удаленный MachineC, вы можете выполнить scp из MachineB в machineA, а затем из machineA в удаленный MachineC. (Например. theremote MachineC может пинговать machineA, но не MachineB.) Предостережение: я тестировал с Fedora и WindowsXP, machineA - это XP-box, работающий под управлением ICS (общий доступ к интернет-соединению), в то время как MachineB и remote MachineC - это Fedora-Linux-боксы. Это предложение решило ключевую проблему для меня - ie. ограниченный, контролируемый удаленный доступ к локальной сети моего удаленного сайта. Обратите также внимание, что при "выходе" из MachineB вы должны увидеть два сообщения "Подключение к xxx.xxx.xxx.xxx закрыто".

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

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

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

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

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

ssh extuser@B

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

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

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

Вы имеете в виду, что вам нужно несколько перемычек :)

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

локальный скрипт:

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

затем на 1-й перемычке (которая является моим маршрутизатором) я разместил скрипт с именем Y00.sh:

ssh -tt jumper2@jumper2 -i ~/.ssh/id_rsa sshpass -p finalPassWord ssh -tt final@final

Вы можете заменить их своим IP-адресом и паролями, удачи!

по теме: ssh через несколько хостов