物事をテストするために、ラップトップからssh-server
を介してサイトへのローカルsshトンネルを確立し、サイトのページをダウンロード(またはブラウザーで表示)しようとしています。
トンネルは次のように作成されます。
$ ssh -L 9999:www.gnu.org:80 ssh-server
トンネルがサーバー上のnc
プログラムと~#
文字で機能することを確認します。サーバーでwget
とlynx
を実行することにより、ssh-serverでhttpリクエストを実行できることを確認します。どちらもエラーなしで実行されます。
しかし、ラップトップでwget --no-proxy localhost:9999
を実行すると、エラー403が発生します。
ssh ssh-server 'wget -O - http://www.gnu.org/' >> whatever
を使用して同じことができます。しかし、なぜトンネルが機能しないのですか?
だから私は何が起こっているのか、そしてプロキシがどのようなことを許可していないのかを明らかにしたいと思います。
私の推測では、プロキシは特にssh-clientがhttpリクエストを実行するのを防ぎます。そうですか?
もしそうなら–プロキシはssh-clientを他のプログラムからどのように区別しますか? ssh-clientから送信されたリクエストと別のプログラムからのリクエストを区別できますか?
そして、「ssh-clientを別のプログラムにマスキングする」ための一般的な方法(またはプロキシを渡す他の方法)は何ですか?
[〜#〜] ps [〜#〜]誰かがsshトンネリングやその他のものをテストするために開いている無料のsshサーバーのアドレスをコメントに書き込んだら素晴らしいでしょう。 (通常、sshサーバーは無料でトンネリングを許可しません。)
HTTPプロキシもsshトンネルも設定(または使用しようとした)していません。代わりに、sshを介したポート転送を使用しました。
転送TCPポートはHTTPでは機能しません。HTTPURLにアクセスすると、2つの異なるポイントでURLのドメインが使用されます。1-メッセージの送信先のIPアドレスを検索します。2- HTTPメッセージのホストヘッダー。これにより、1つのIPアドレスで複数ドメインのWebサイトにサービスを提供できます。
したがって、http://localhost:9999/
にアクセスすると、HTTPメッセージにはヘッダー行Host: localhost:9999
が含まれます。 GNU Webサーバーはlocalhost:9999
というWebサイトを提供せず、アクセスを拒否します(403)。
(403は仕様に準拠しています。理論的には、403は少し不親切なので、メッセージ付きで400を選択する必要があります。個人的には些細なDynDNSサイトで403を使用しました。仕様によるセキュリティのためではありませんが、FORBIDDENは非常に優れているためです。トラブルシューティングのための強力なシグナル。うまくいけば、私のWebサーバーがそれらを傍受したという印象を否定するのに十分なほど強力です(たとえば、古いDNSキャッシュの場合)。
便利なアプローチは、SSHの「動的ポート転送」オプション-D
を使用することです。これにより、SOCKSプロキシが設定されます。残念ながら、wgetにはSOCKSプロキシのオプションがありません(ただし、curl
にはあります)。