web-dev-qa-db-ja.com

`curl <this machine's IP>`の動作が `curl localhost`と異なるのはなぜですか?

networkengineering.stackexchange から転送)

私のネットワークには2つのRaspberry Piがあります-それらをPiとRhoと呼びましょう。

アプリケーションがRhoのポートに接続して、Piのポートでリッスンしているサーバーから結果を取得できるように、それらの間のsshトンネルを介してポート転送を設定しようとしています(私の最終的な目標は、実際にそのようなポート転送を設定することです)別のネットワーク上のホストが、Rhoへのssh接続を介してPi上のSamba共有にアクセスでき、Piへのファイアウォールポートを完全に開く必要がないことに注意してください。

私のLANでのPiのIPは192.168.42.69で、RhoのIPは192.168.42.112です。これらは、ローカルネットワークから接続して接続するIPです。

これをテストするために、Piのポート8000​​で最小限のPythonサーバー(SimpleHTTPServerを使用)]を起動し、RhoでSudo ssh -L 140:localhost:8000 [email protected] -Nを実行します。Rhoでcurl localhost:140またはcurl 127.0.0.1:140を実行すると、期待どおりの応答が得られますが、Rhoでcurl 192.168.42.112:140を実行すると、接続が拒否され、以下の詳細な出力が表示されます。

$ curl -vvv 192.168.42.112:140
* Expire in 0 ms for 6 (transfer 0x2cd880)
*   Trying 192.168.42.112...
* TCP_NODELAY set
* Expire in 200 ms for 4 (transfer 0x2cd880)
* connect to 192.168.42.112 port 140 failed: Connection refused
* Failed to connect to 192.168.42.112 port 140: Connection refused
* Closing connection 0
curl: (7) Failed to connect to 192.168.42.112 port 140: Connection refused

この不一致の理由は何ですか?

この他の質問をチェックした があるため、Rhoに環境変数HTTP_PROXYが設定されておらず、NO_PROXYも設定されていないことを確認しました。

6
scubbo

Sshコマンドでは、bind_addressオプションに-Lを指定していません。

man ssh によると

デフォルトでは、ローカルポートはGatewayPorts設定に従ってバインドされます。ただし、明示的なbind_addressを使用して、接続を特定のアドレスにバインドできます。 bind_address of localhostは、リスニングポートがローカルでの使用のみにバインドされることを示し、空のアドレスまたは*は、ポートがすべてのインターフェースから利用可能であることを示します。

localhost127.0.0.1のエイリアスである ループバックインターフェイス のエイリアス)だけでなく、すべてのインターフェイスで接続を許可するには、bind_address of 0.0.0.0-Lオプションに含めます。例:.

Sudo ssh -L 0.0.0.0:140:localhost:8000 [email protected] -N

特定のIPでリッスンしたい場合は、0.0.0.0の代わりに指定できます。

7
gnubeard

これが _man 1 ssh_ の状態です:

_-L [bind_address:]port:Host:hostport
-L [bind_address:]port:remote_socket
-L local_socket:Host:hostport
-L local_socket:remote_socket
_

ローカル(クライアント)ホスト上の指定されたTCPポートまたはUnixソケットへの接続が、リモート側の指定されたホストおよびポート、またはUnixソケットに転送されることを指定します。[…]

デフォルトでは、ローカルポートはGatewayPorts設定に従ってバインドされます。ただし、明示的なbind_addressを使用して、接続を特定のアドレスにバインドできます。 bind_addressのlocalhostは、リスニングポートがローカルでの使用のみにバインドされることを示し、空のアドレスまたは_*_は、ポートがすべてのインターフェースから利用可能であることを示します。

言及されているGatewayPortsは_ssh_config_からのものです(_sshd_config_からのものではなく、これは_-R_用です)。から _man 5 ssh_config_

_GatewayPorts
_

リモートホストがローカル転送ポートへの接続を許可されるかどうかを指定します。デフォルトでは、ssh(1)はローカルポート転送をループバックアドレスにバインドします。これにより、他のリモートホストが転送ポートに接続できなくなります。 GatewayPortsを使用して、sshがローカルポート転送をワイルドカードアドレスにバインドし、リモートホストが転送ポートに接続できるようにすることを指定できます。引数はyesまたはno(デフォルト)でなければなりません。

あなたの命令

_ssh -L 140:localhost:8000 [email protected] -N
_

_bind_address_を指定しない場合、「デフォルト」に該当します。 GatewayPortssshnoのようです。

「空のアドレス」は別様に見えます:_-L :140:localhost:8000_。余分な結腸が重要です。このバリアントdoesは_bind_address_を空の文字列として指定しますが、使用した_-L 140:localhost:8000_は_bind_address_をまったく指定しません。

すべてのインターフェースにバインドするには、空のアドレス(_-L :140:localhost:8000_)または_*_を使用します(シェルでは、引用符で囲む必要があります(例:_-L '*':140:localhost:8000_))。

5