( 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
も設定されていないことを確認しました。
Sshコマンドでは、bind_address
オプションに-L
を指定していません。
man ssh
: によると
デフォルトでは、ローカルポートは
GatewayPorts
設定に従ってバインドされます。ただし、明示的なbind_address
を使用して、接続を特定のアドレスにバインドできます。bind_address
oflocalhost
は、リスニングポートがローカルでの使用のみにバインドされることを示し、空のアドレスまたは*
は、ポートがすべてのインターフェースから利用可能であることを示します。
localhost
(127.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
の代わりに指定できます。
これが _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
_を指定しない場合、「デフォルト」に該当します。 GatewayPorts
はssh
はno
のようです。
「空のアドレス」は別様に見えます:_-L :140:localhost:8000
_。余分な結腸が重要です。このバリアントdoesは_bind_address
_を空の文字列として指定しますが、使用した_-L 140:localhost:8000
_は_bind_address
_をまったく指定しません。
すべてのインターフェースにバインドするには、空のアドレス(_-L :140:localhost:8000
_)または_*
_を使用します(シェルでは、引用符で囲む必要があります(例:_-L '*':140:localhost:8000
_))。