Производственные серверы моей компании (FOO, BAR ...) расположены за двумя шлюзовыми серверами (A, B). Чтобы подключиться к серверу FOO, мне нужно открыть ssh-соединение с сервером A или B с моим именем пользователя JOHNDOE, затем из A (или B) я могу получить доступ к любому производственному серверу, открывающему соединение SSH со стандартным именем пользователя (назовем его Webby).
Итак, каждый раз, когда я должен сделать что-то вроде:
ssh johndoe@a
...
ssh webby@foo
...
# now I can work on the server
Как вы можете себе представить, это хлопотно, когда мне нужно использовать scp
или если мне нужно быстро открыть несколько соединений.
Я настроил ключ ssh, а также я использую .ssh / config для некоторых ярлыков.
Мне было интересно, могу ли я создать какую-то конфигурацию ssh для того, чтобы напечатать
ssh foo
и пусть SSH открывает / пересылает все соединения для меня. Является ли это возможным?
редактировать
Ответ womble - именно то, что я искал, но, похоже, сейчас я не могу использовать netcat, потому что он не установлен на сервере шлюза.
weppos:~ weppos$ ssh foo -vv
OpenSSH_5.1p1, OpenSSL 0.9.7l 28 Sep 2006
debug1: Reading configuration data /Users/xyz/.ssh/config
debug1: Applying options for foo
debug1: Reading configuration data /etc/ssh_config
debug2: ssh_connect: needpriv 0
debug1: Executing proxy command: exec ssh a nc -w 3 foo 22
debug1: permanently_drop_suid: 501
debug1: identity file /Users/xyz/.ssh/identity type -1
debug2: key_type_from_name: unknown key type '-----BEGIN'
debug2: key_type_from_name: unknown key type 'Proc-Type:'
debug2: key_type_from_name: unknown key type 'DEK-Info:'
debug2: key_type_from_name: unknown key type '-----END'
debug1: identity file /Users/xyz/.ssh/id_rsa type 1
debug2: key_type_from_name: unknown key type '-----BEGIN'
debug2: key_type_from_name: unknown key type 'Proc-Type:'
debug2: key_type_from_name: unknown key type 'DEK-Info:'
debug2: key_type_from_name: unknown key type '-----END'
debug1: identity file /Users/xyz/.ssh/id_dsa type 2
bash: nc: command not found
ssh_exchange_identification: Connection closed by remote host
источник
Вы можете использовать директиву ProxyCommand в вашем файле ~ / .ssh / config, например, для использования netcat в качестве реле:
Вы бы просто использовать 'ssh server2'. Информация man-страницы для этой директивы находится в man ssh_config
источник
Я предпочитаю другой подход, который поддерживает предварительно аутентифицированный туннель к серверу шлюза. В
~/.ssh/config
:Тогда в
.bashrc
:Итак, чтобы подключиться к foo:
При первом подключении он аутентифицирует вас по «а» и открывает постоянный фоновый туннель ssh. Последующие вызовы «s» будут открываться практически мгновенно через предварительно авторизованный туннель.
Работает отлично.
источник
Этот тип функциональности существует в более новых версиях OpenSSH и может использоваться
Где
server2
ваш пункт назначения иserver1
ваш прокси-сервер. Вы можете сделать это проще, используяProxyCommand
опцию в вашей конфигурации ssh, например:источник
Когда
netcat
недоступен на прокси, попробуйте этот трюк:Тогда вы должны быть в состоянии
ssh foo
.Также, если у вас есть последняя версия ssh на (то есть, с
-W
командой для переадресации стандартного ввода и вывода), вы можете использовать:Наконец, просто потому, что я нахожу это классным (а не потому, что он будет работать в вашем конкретном случае из-за различий в именах пользователей), сообщение в блоге друга указывает, как сделать такие вещи динамическими и рекурсивно связывать прокси-серверы SSH (наряду с некоторыми вещами это плохо работает)
А потом
ssh machine1/machine2
должен дать вам скорлупуmachine2
, проложенную через туннельmachine1
.Интересно, если использовать пользовательские
sed
команды вместоdirname
иbasename
не может решить проблему с разными именами пользователей?источник
Это может быть достигнуто, делая
ssh -At johndoe@a ssh webby@foo
. Команда-A
пересылает ваш ssh-агент (так что вы можете избежать повторной аутентификации на прокси-сервере), в то время-t
как на прокси-сервере существует терминал. Следующая функция bash может быть полезна:источник
Netcat не установлен на
a
. Когда вы запускаетеssh host "command arg"
,command
выполняется наhost
, а не на локальном компьютере.источник
Начиная с OpenSSH 7.3 (2016-08-01),
ProxyJump
опция и соответствующий-J
флаг командной строки были доступны, чтобы позволить более простое косвенное обращение через один или несколько бастионов SSH или «переход хостов».Это устраняет зависимость от внешней
nc
команды, найденной в решении Womble .установит SSH-соединение с вашей рабочей станции на сервер шлюза
a
как пользователь johndoe и туннелирует сеанс SSH для размещения foo для пользователя Webby через него.Чтобы упростить создание определений хостов для вашего
~/.ssh/config
и для вас, вы можете просто выполнитьssh foo
источник