Windows から Linux を経由して Windows へ SSH トンネル

Windows から Linux を経由して Windows へ SSH トンネル

次のようにして、Linux ジャンプ ホスト経由で SSH トンネルを確立したいと思います。

ホスト A は Windows ベースで、ジャンプ ホスト (ホスト B) で認証するための秘密キーを持っています。ホスト B は Linux ベースで、DMZ 内のホストで認証するための秘密キーを持つ別のユーザーがいます。ホスト C は Windows ベースで、SSH 経由で (または物理的に) ホスト B からのみアクセスできます。試してみましたがssh -v -N user2@HostC -J user1@HostB -L [port]:HostC:[remote_port]、機能していますが、パスワードのみで、必要なすべてのホストにキーがあるにもかかわらず、パスワードを要求し続けます。

この件に関して誰か助けてくれませんか?

PS 3 つのホストすべてで同じキー ペアを使用すると機能しますが、セキュリティ上の理由から、異なるキー ペアを持つ異なるユーザーを使用したいと思います。

答え1

予備的注釈

  • 私は Windows を使用していませんが、あまり問題にならないと思います。
  • 多くの場合、「A」、「B」、「C」と言う場合、実際にはそれぞれ「A のユーザー」、「B のユーザー 1」、「C のユーザー 2」を意味します。たとえば、「B のキー」は「B で使用可能なユーザー 1 のキー」を意味します。これは簡潔にするためです。

分析

これは仕組み-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 のキー (または 1 つのキー) を受け入れさせることです。次のように言いました。

3 つのホストすべてで同じキー ペアを使用すると機能しますが、セキュリティ上の理由から、異なるキー ペアを持つ異なるユーザーを使用したいと思います。

異なるペアを使用できます。現在、A から B への接続を許可するキー ペアと、B から C への接続を許可する別のペアがあると理解しています。後者は無関係です。C では、A が認証に使用する任意のキーを承認します。古いキー (B で既に承認されているキー) である場合もありますが、この接続専用に作成された新しいキーである場合もあります。

次に、Aでこれを行うときはssh -J user1@B user2@C、AがBに接続できるようにするキーを使用する必要があります。そしてAがCに接続できるようにするキー。異なるキーの場合は、両方を使用する必要があります。-i必要であれば 1 回または 2 回。


代替ソリューション

実際に A から B に接続した後、B から C に接続する場合は、すでに登録されているキーを使用できます。A から C にログインする場合は、次のようになります。

# from A
ssh -t user1@B 'ssh user2@C'

(少なくとも Linux ではそうです。Windows で引用符がどのように機能するかはわかりません)。

このコマンドはsshB 上で実行され、C に接続するため、B のキーが使用されます。


ポート転送について

元のコマンドでは と が使用されていた-Nので-L、唯一の目的はポートを転送することだと理解しています。ポートは A から C への接続を使用して転送され、宛先も C でした。そのため、転送されたパケットの最後の区間は、C 上の SSH サーバーから C へのものでした。多分[remote_port]B から到達可能です。そうであれば、上記の解決策は必要ありません。必要なのは以下のみです。

ssh -NL [port]:C:[remote_port] user1@B

これにより、転送されたパケットの最後の区間は、B 上の SSH サーバーから C へになります。

最後の区間が C から C までの場合、選択したソリューションに応じて対処方法が異なります。

  • A のキーを C で承認するソリューションを使用すると、パスワードなしで元のコマンドを使用できるようになります。

  • B で実行するソリューションでは、sshポートを A から B に転送し、さらに B から C に転送する必要があります。次のようになります。

    ssh -L [port]:localhost:[relay_port] user1@B 'ssh -NL [relay_port]:C:[remote_port] user2@C'
    

関連情報