
Я хотел бы создать SSH-туннель через Linux-хост следующим образом:
Хост A работает на базе Windows и имеет закрытый ключ для аутентификации на хосте перехода (хост B). Хост B работает на базе Linux и имеет другого пользователя с закрытым ключом для аутентификации на хостах в DMZ. Хост C работает на базе Windows и доступен с хоста B только по SSH (или физически). Я попробовал, ssh -v -N user2@HostC -J user1@HostB -L [port]:HostC:[remote_port]
и это работает, но только с паролем, он продолжает запрашивать его, несмотря на наличие ключей на всех необходимых хостах.
Может ли кто-нибудь помочь по этой теме?
P.S. Это работает, если я использую одну и ту же пару ключей на всех трех хостах, но из соображений безопасности я хотел бы использовать разных пользователей с разными парами ключей.
решение1
Предварительные заметки
- Я не пользуюсь Windows, но надеюсь, это не будет иметь большого значения.
- Часто, когда я говорю "A", "B", "C", я на самом деле имею в виду "пользователя на A", "пользователя 1 на B", "пользователя 2 на C" соответственно. Например, "ключ B" означает "ключ пользователя 1, доступный на B". Это для краткости.
Анализ
Этокак -J
работает:
-J destination
Подключитесь к целевому хосту, сначала установив SSH-соединение с хостом перехода, описанным выше,destination
а затем установив оттуда TCP-пересылку к конечному пункту назначения.
Это означает ssh -J user1@B user2@C
, чтонетэквивалентно подключению из A в B, а затем из B в C. Это эквивалентно подключению из A в B, а затем из A в C (используя пакеты, пересылаемые через B). На B не вызывается клиент SSH, поэтому ключ, позволяющий подключиться из B в C, никогда не используется.
Решение
Самый элегантный способ решения общей проблемы — заставить C принять ключ (или ключ) A. Вы сказали:
Это работает, если я использую одну и ту же пару ключей на всех трех хостах, но из соображений безопасности я хотел бы использовать разных пользователей с разными парами ключей.
Вы можете использовать разные пары. Я понимаю, что в настоящее время есть пара ключей, которая позволяет вам подключаться из A в B, и отдельная пара, которая позволяет из B в C. Последнее не имеет значения. На C авторизуйте любой ключ, который A использует для аутентификации. Это может быть старый ключ (тот, который уже авторизован на B); но это может быть и новый ключ, созданный исключительно для этого соединения.
Затем, когда вы это делаете ssh -J user1@B user2@C
на A, вам нужно использовать ключ, который позволяет A подключиться к B.иключ, который позволяет A подключаться к C. Если это разные ключи, вам нужно использовать их оба. Используйте-i
один или даже два раза, если необходимо.
Альтернативное решение
Вы можете использовать уже зарегистрированные ключи, если вы действительно подключитесь из B в C после подключения из A в B. Если вы хотите войти из A в C, то это будет выглядеть так:
# from A
ssh -t user1@B 'ssh user2@C'
(по крайней мере в Linux; я не уверен, как кавычки работают в Windows).
Эта команда запускается ssh
на B для подключения к C, поэтому она будет использовать ключ B.
О переадресации портов
Ваша исходная команда использовала -N
и -L
, поэтому я понимаю, что единственная цель — переслать порт. Вы переслали порт, используя соединение A-to-C, и пунктом назначения также был C; поэтому последний этап пересылаемых пакетов был с сервера SSH на C на C.Может бытьдостижим [remote_port]
из B. Если это так, то вам не нужно ни одно из вышеперечисленных решений; все, что вам нужно, это:
ssh -NL [port]:C:[remote_port] user1@B
Это сделает последний этап пересылаемых пакетов пролегающим от сервера SSH на B к C.
Если последний отрезок должен проходить от C до C, то ход действий зависит от выбранного вами решения.
Решение с ключом A, авторизованным на C, позволит вам использовать исходную команду без паролей.
Решение с запуском
ssh
на B потребует переадресации порта с A на B и отдельно с B на C. Что-то вроде:ssh -L [port]:localhost:[relay_port] user1@B 'ssh -NL [relay_port]:C:[remote_port] user2@C'