SSH-туннель из Windows через Linux в Windows

SSH-туннель из Windows через Linux в Windows

Я хотел бы создать 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'
    

Связанный контент