リモート マシンでポート SSH ローカル転送を作成しました:
ssh -N -L 127.0.0.1:3388:127.0.0.1:22 localhost
リモートマシン自体で動作します:
telnet localhost 3388
戻り値
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
SSH-2.0-OpenSSH_7.4
ただし、ローカル マシンからこの転送を使用すると、次のようになります。
telnet remote.ip 3388
失敗します:
Trying remote.ip...
telnet: Unable to connect to remote host: Connection refused
リモート マシンの 3388 ポートがファイアウォールまたはネットワークの何かによってブロックされていると思われるので、SSH 転送をオフにして、リモート マシンのポート 3388 でリッスンしている http サーバーをテストしました。
python3 -m http.server 3388
次に、ローカル マシンからこのポートに接続します。
telnet remote.ip 3388
その結果は
Trying remote.ip...
Connected to remote.ip.
Escape character is '^]'.
quit
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8">
<title>Error response</title>
</head>
<body>
<h1>Error response</h1>
<p>Error code: 400</p>
<p>Message: Bad request syntax ('quit ').</p>
<p>Error code explanation: HTTPStatus.BAD_REQUEST - Bad request syntax or unsupported method.</p>
</body>
</html>
Connection closed by foreign host.
つまり、リモート マシンのポート 3388 はローカル マシンからアクセスできます。では、SSH 転送とネットワークは個別には正常に機能するのに、組み合わせると失敗するのはなぜでしょうか。誰かこれを修正する方法を知っていますか。よろしくお願いします。
答え1
SSH ローカル転送を設定して、localhost ポート 3388 のみをリッスンするようにしました。localhost はネットワーク上の他のデバイスからアクセスできないため、リモートで接続を確立できませんでした。
転送ポートをネットワーク上の他のマシンに公開するには、192.168.1.5 や 0.0.0.0 (すべてのインターフェース) などの到達可能なアドレスにバインドする必要があります。
例えばssh -N -L 0.0.0.0:3388:127.0.0.1:22 localhost