web-dev-qa-db-ja.com

sshでSOCKSプロキシを作成する方法は?

コンピューターをSOCKSプロキシとして使用したい。あなたはただしなければなりませんかssh -D port_number hostname? Linuxユーザー名をhostnameにする必要がありますか?

5
Raffaele D'Arco

tl; dr-以下の太字のテキストを検索します。


注:目的の値に置き換える必要がある文字列には、$プレフィックスを使用します。この構文はではありませんシェルの変数と完全に互換性があることを意味します。

ssh -Dの使用法は、実際には次のようになります。

ssh -D $port_number $hostname

または

ssh -D $port_number $username@$hostname

ここで、$hostnameはいくつかのマシンを識別します。 IPアドレス、DNSまたは/etc/hostsファイルまたはssh_configファイルなどで解決可能なアドレスにすることができます。最初のコマンドは、ssh_configファイルで特に指定されていない限り、現在の(ローカル)ユーザー名を使用します(デフォルトではそうではありません)。 $usernameマシンに有効な認証情報(要求された場合の$hostnameおよびパスワードなど)を提供する必要があります。

これにより、$port_number TCPポートがlocalコンピュータに開かれ、その上にSOCKSサーバーが確立されます。一部のポートを開くことができない場合があります。通常のユーザーとして、特に1024よりも低い場合は、大きい番号を使用します。

一般に、sshによって提供されるSOCKSプロキシがない状況は次のとおりです。

A -> D

ここで、Aはクライアント(Webブラウザーなど)、Dはサーバー(Webサーバーなど)です。しかし、プロキシを使用すると、これは次のようになります。

A -> B -> C -> D

どこ:

  • Aは、SOCKSアドレスとしてB:$port_numberを使用する単一のクライアントを表します。多くのクライアントがあるかもしれません。
  • Bは、ssh -D $port_number Cが実行され、TCP $port_numberAからの着信接続をリッスンするマシンです。
  • C$hostnameであり、Bは接続先です。通常DからAへの通信は、DからCに到達します。
  • Dは任意のサーバーであり、Cからの通信を認識しており、AおよびBが関係していることに気付かない場合があります。多くのサーバーがあるかもしれません。

これらの文字の一部は、特定の使用例では同じマシンを指す場合があります。明らかに、A = Cの場合は単純なA -> D接続よりも直接的な利点はありませんが、他にも便利なケースがあります。

上記のsshコマンドを実行し、localブラウザーにlocalhost:$port_numberでSOCKSを使用するように指示するとします。これは、A = Bの場合です。ブラウザのトラフィックが転送され、アクセスしたサイト(D)には、$hostnameC)からの通信がブラウザで実行されているかのように表示されます。

他のコンピューターを開いているポート(AB、SOCKSサーバーアドレスとして$your_IP:$port_numberを使用)に接続する場合は、次の操作が必要です。

  • TCPポート$port_number;への着信接続を許可するようにファイアウォールを構成します。
  • -gオプションでssh -Dを使用します。

または

  • 各クライアントをトンネルします。独自の独立したssh接続を介して、それらの接続がローカルで(A = Bのように)実行中のssh -D ...にローカルに表示されるため、ファイアウォールは干渉せず、-gも必要ありません。これは、彼らの側で呼び出されるssh -L $some_port:localhost:$port_number $your_IPまたはあなたの側で呼び出されるssh -R $some_port:localhost:$port_number $their_IPによって行うことができます。クライアントは、ブラウザのSOCKSサーバーアドレスとしてlocalhost:$some_portを使用します。

$hostnameBlocalhostにできない理由はありません。できる。この場合、B = Cです。これは、ローカルブラウザー(A = B = C)でこのSOCKSプロキシを使用する場合は無意味ですが、外部からの接続を許可する場合は完全に意味があります。 これはあなたがやりたいことだと思います。コマンドは次のようになります:

ssh -g -f -N -D $port_number localhost

キーベースの認証 を確立したい場合があるので、sshからlocalhostへのこのlocalhost接続はパスワードを要求しません。ファイアウォールのスタンドに関する上記の発言。 SOCKSサーバーアドレスとして$your_IP:$port_numberを使用できる人は、アクセスするサーバーから、まるで自分のコンピューターにいるかのように見えます。


man 1 ssh の関連フラグメント:

-D [bind_address:]port
ローカルの「動的」アプリケーションレベルのポート転送を指定します。これは、ローカル側でportをリッスンするソケットを割り当てることで機能し、オプションで指定されたbind_addressにバインドされます。このポートへの接続が行われると、接続は安全なチャネルを介して転送され、アプリケーションプロトコルを使用して、リモートマシンから接続先を決定します。現在、SOCKS4およびSOCKS5プロトコルがサポートされており、sshはSOCKSサーバーとして機能します。 rootのみが特権ポートを転送できます。 [...]

-f
コマンド実行の直前にバックグラウンドに移動するようにsshに要求します。 [...]

-g
リモートホストがローカルの転送ポートに接続できるようにします。

-N
リモートコマンドを実行しないでください。これは、ポートを転送するだけの場合に役立ちます。 [...]

9