プロキシシステムを介してSSH接続を傍受し、別の(リモート)システムに転送します。

プロキシシステムを介してSSH接続を傍受し、別の(リモート)システムに転送します。

IPアドレスが公開されたプロキシを設計したいと思います。クライアントはプロキシのIPアドレスを知っており、SSH経由で接続できます。ただし、クライアントがIPアドレスを知らないホストが1つあります。プロキシの目的は、クライアントでSSHを「傍​​受」し、リダイレクトそのプライベートホストに移動します。下の画像はこの問題を示しています。

ここに画像の説明を入力してください。

サーバーBは私が設計したいプロキシです。クライアントCはサーバーAのIPアドレスを知りません。クライアントCはSSHを介してサーバーB(プロキシ)に接続できます。その後、プロキシ(サーバーB)はSSH接続をサーバーAに転送する必要があります。これ答え、以下を試しました。

  1. サーバーAで次のコマンドを実行します。

    ssh userB@serverB -R clientC:1234:serverA:22

  2. クライアントCで次のコマンドを実行します。

    ssh userA@serverB -p 1234

ただし、クライアントCはサーバーAとの接続を確立できず、次のメッセージが表示されます。

ssh: connect to host server B (192.168.2.122) port 1234: Operation timed out

プロキシ(サーバーB)の動作方法を教えてください。


解決済み:

sshd_config私のアプローチは正しいです。サーバーAとサーバーB(プロキシ)を再構成する必要があります。

AllowAgentForwarding yes
AllowTcpForwarding yes
GatewayPorts yes
X11Forwarding yes

詳細を確認可能ここ

ベストアンサー1

clientCからserverBSSHserverB経由で接続できますかserverA?もしそうなら、より簡単な解決策があります。でclientC以下を実行します。

ssh -J userB@serverB userA@serverA

これは最初にsshに接続しuserB@serverB、sshで自動的にポート転送を設定しserverA、転送されたポートを介してに接続しますuserA@serverA

これが不可能な場合は、ファイアウォールやその他のネットワーク制限が邪魔にならないという前提で、いくつかの修正を使用して方法を使用できます。

以下で実行するリバースフォワードコマンドを調整する必要がありますserverA

ssh userB@serverB -R "*:1234:localhost:22"

ここで*設定するのは、bind_address逆方向転送を監視するためのアドレスです。 SSHのマニュアルページから:

デフォルトでは、サーバーのTCPリスニングソケットはループバックインターフェイスにのみバインドされます。これはバインドアドレスを指定することで無視できます。空のバインド・アドレスまたはアドレス「*」は、リモート・ソケットがすべてのインターフェースでリッスンする必要があることを示します。リモートバインドアドレッシングは、サーバーのGatewayPortsオプションが有効になっている場合にのみ成功します(sshd_config(5)を参照)。

したがって、設定により、bind_addressすべてのインターフェイスで接続を受信できます。 (に設定したバージョンでは、IPアドレスがのネットワークインターフェースを参照していないclientCため機能しません。clientCserverB

GatewayPorts clientspecified設定も必要です/etc/ssh/sshd_config。これはssh -R非ループバックインターフェイスにバインドする権限を与えます。

これで、以下からSSH経由で接続できますclientC

ssh userA@serverB -p 1234

このタイプのBポート転送は、A高速で汚れた作業に適しています。もっとプロダクションフレンドリーなものが必要な場合は、SSH転送を使用する代わりに、HAProxy、nginx、またはiptables / nftablesなどのものを使用してTCP転送を処理することを検討してください。

おすすめ記事