テスト目的のために、このポート転送ソリューションがあります。という名前のリモートサーバーがあります。箱そして名前の付いた機械トップ、2つの別々のネットワークにあります。箱インターネット経由でアクセスできます。
存在するトップ、次のコマンドを実行します。
ssh -R 80:localhost:80 box.sleblanc
これは以下に関連しています。箱Webサービスにアクセスするポート80にソケットを設定します。トップ、ポート80。いつボックス数:80、ログにあるWebサービスが次のようになります。127.0.0.1。私はこれが合法的にlocalhostから来る接続とプロキシから来る接続を間違いなく区別することができないので、これは迷惑だと思います。
BindAddress
オプションを別のものに設定する(例:192.168.0.100) プロキシへの接続は実際にそのアドレスに表示され、問題は解決されますが、サービスがlocalhost以外のネットワークアドレスで実行されるように強制します。
curl --interface 127.0.0.2 localhost:80
IPアドレスから生成された要求を実行すると、127.0.0.2
正当なローカル要求とプロキシ要求を区別できるという要件を満たすことがわかりましたBindAddress
。127.0.0.2、SSHに接続できなくなりました。箱、ように127.0.0.0/8ネットワークをルーティングできません。
最終的に私の質問は次のとおりです。クライアントがインターネットホストに接続し、リモートポートリダイレクトを削除できるように、SSHクライアントを複数の異なるアドレスにバインドするにはどうすればよいですか?127.0.0.1?つまり、リモート転送ポートの接続をローカルアドレスに厳密にバインドします。127.0.0.2?
遊ぶソカット、私はこの解決を見つけました:
% socat TCP4-Listen:1234,fork TCP:127.0.0.1:80,bind=127.0.0.2 &
% ssh -R 80:127.0.0.1:1234 box.sleblanc
これは、着信接続をポート1234でリッスンするソケットを確立し、ローカルアドレスにバインドし、それを127.0.0.1:80に転送します。127.0.0.2。期待どおりに正しく動作しますが、これをSSHコマンドで単純化する方法があるかどうか疑問に思います。