Как мне SSH обрабатывать A через B одной командой?

59

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

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

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

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

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

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

    
задан nikosdi 22.06.2013 в 17:03
источник

6 ответов

64

Да, используя 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 broker
User myusername         # Change this default user accordingly 
                        # ('[email protected]' can overwrite it)

Host internalmachine    # Machine A definition (the target host)
ProxyCommand ssh -q unibroker nc -q0 hostname.or.IP.address.internal.machine 22

Теперь вы можете напрямую связаться с Machine A, используя

ssh [email protected]

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

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

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

    используйте sftp://[email protected]/ в качестве места для просмотра на компьютере.

    На основе KDE (Dolphin): используйте fish://[email protected]/

Примечания

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

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

Объяснение

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

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

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

Убедитесь, что в брокере установлен netcat (обычно он доступен по умолчанию на Ubuntu) - netcat-openbsd < img src="https://hostmar.co/software-small"> или netcat-традиционный < img src="https://hostmar.co/software-small"> .

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

    
ответ дан gertvdijk 22.06.2013 в 17:24
источник
31

Хоп за один раз

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

ssh -t [email protected] ssh [email protected]

Обратите внимание на -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

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

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

ответ дан gertvdijk 22.06.2013 в 17:47
9

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

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

    
ответ дан SSH Help 29.07.2014 в 15:49
5

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

ssh -J [email protected] [email protected]

Из man ssh :

-J [[email protected]]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 и более поздних версиях.

    
ответ дан Erik Sjölund 16.01.2018 в 17:19
1

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

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

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

#!/bin/sh   # this is essential to avoid Exec format error
ssh [email protected]

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

ssh [email protected]

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

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

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

    
ответ дан Sunthar 08.06.2016 в 20:27
0

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

например: [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. (Например, удаленный machineC может ping MachineA, но не MachineB.) Предостережение: я тестировал с Fedora и WindowsXP, MachineA - это XP-box, на котором работает ICS (общий доступ к подключению к Интернету), в то время как MachineB и remote machineC - это коробки Fedora-Linux. Это предложение решило для меня ключевую проблему - т.е. ограниченный, контролируемый удаленный доступ к моему удаленному языку сайта. Также обратите внимание, что когда вы выходите из MachineB, вы должны увидеть два «Соединение с xxx.xxx.xxx.xxx закрыто». сообщения.

    
ответ дан Mcl 17.04.2014 в 00:34