Я хочу получить доступ к компьютеру, скажем, машина A , которая основана в сети моего университета. Однако этот компьютер доступен только через внутреннюю сеть университета, поэтому я не могу напрямую использовать SSH для этого компьютера из дома.
Вот что я делаю сейчас:
Войдите в систему другого университетского компьютера, скажем, машина B
(Этот компьютер B доступен через SSH с моего домашнего компьютера.)
Используйте SSH на B для подключения к A.
Есть ли способ сделать это быстрее? Использование только одной команды ssh.
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 или 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 directory
Permission denied, please try again.
[...]
Это заставит выделить настоящий TTY.
Обратной стороной этого является то, что теперь вся конфигурация, проверка и аутентификация происходит на компьютере B, что мне очень не нравится в моей ситуации по соображениям безопасности. Мне нравится моя пара ключей на моем собственном ПК, и я проверяю и проверяю конечную целевую машину на моем собственном ПК. Кроме того, вы можете использовать только интерактивную оболочку для SSH, так что это не будет иметь дело с другими инструментами, такими как SCP или с помощью файлового менеджера графического интерфейса.
По всем вышеупомянутым причинам я настоятельно рекомендую подход ProxyCommand , но для быстрого подключения это работает нормально.
То есть вам нужно несколько перемычек: )
Недавно я столкнулся с этой проблемой с jumper1 jumper2 и моей последней машиной, что касается моего локального сценария sol
:
#!/bin/bash
sshpass -p jumper1Passwd ssh -t jumper1@jumper1IP ./Y00.sh
затем на 1-я перемычка (это мой маршрутизатор), я разместил скрипт с именем Y00.sh:[1221 impression Вы можете заменить их своим IP-адресом и паролями, удачи!
Попробуйте использовать
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 и сделайте все сразу, используя ключи только на вашем компьютере.
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.
Это очень полезное предложение. После нескольких часов возни я нашел эту заметку и подтвердил, что она работает точно так, как задокументировано. Для подключения через 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 закрыто». сообщения.
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
параметр флага: Просто введите Этот ответ объединяет ответы gertvdijk и Erik Sjölund с руководством на https://en.wikibooks.org/wiki/OpenSSH/Cookbook/Proxies_and_Jump_Hosts#cite_note- ProxyJump-1 . ssh -J usernameB @ machineB (скрытые) заметки