VPNなしでTLSを介してすべてのWebトラフィックをリダイレクトする


10

仮定:

サーバ:

  • 私は、静的IPv4アドレスを使用して、公衆インターネット上でルーティング可能なDebian Squeezeサーバーを持っています。
  • サーバー上のソフトウェアを変更するための無制限のアクセス権があります。
  • サーバーは任意のポートでリッスンし、ファイアウォールルールを再構成できます。基本的に、サーバーに実行できる操作に制限はありません。

クライアント:

  • Firefox、Javaプログラム、.NETプログラム、およびローカルシステム(管理者権限のないロックダウンされたWindowsデスクトップ)での管理者アクセスを必要としないいくつかのネイティブ実行可能ファイルを実行できます。
  • Firefoxにアドオンをインストールできます。
  • ループバック(localhost)インターフェイスのどのポートでもリッスンできます。したがって、前述のプログラム、プロキシを経由せずにローカルポートにバインドして任意のネットワークI / Oを実行できます。
  • すべてのパブリックインターネットアクセスは、多くのサイトをブロックする制限付きのHTTPプロキシを介してルーティングされ、慎重にステートフルな検査を行います。ポート80では、HTTPのみを許可します(TLS / SSLは不可)。ポート443では、CONNECTドメイン名/ IPアドレスによってブロックされていないリモートホストへのベースSSL / TLSを許可します。
  • 制限付きHTTPプロキシ、プロキシ経由で許可されているTLS接続の詳細なパケット検査を実行せず、それらの接続に対して中間者攻撃を実行しません
  • 私がアクセスできる上記のサーバーは、プロキシによってブロックされていません

ゴール:

上記のサーバーを介して、Firefoxによって発行されたすべての HTTPおよびHTTPSリクエストをSSL / TLS経由でルーティングたいと思います。

「目標」に関するその他の注意事項:

  • エンドポイントサイト(などhttp://superuser.com)がサーバーにSSL / TLSを使用していない場合でも、クライアントからサーバーにSSL / TLSを使用し、暗号化されているかどうかにかかわらず、サーバーにHTTPリクエストを実行させます- -私の希望の目的地へ。
  • 私のサーバーがSSLトラフィックを「平文で」見ているかどうかは気しません。言い換えると、リモートサーバーにがアクセスしている場合は、ローカルクライアントからリモートサーバーまでの完全なエンドツーエンドSSL暗号化は必要ありませんhttps://google.com。つまり、サーバーを信頼してデータの機密を保持します。
  • 私は、管理者権限を必要とせず、32ビットWindows 7で実行できるソフトウェアまたはFirefoxアドオンをインストールしてもかまいません。
  • オープンソースソフトウェアはプロプライエタリよりも優先され、フリーウェアはライセンス料が必要なソフトウェアよりも優先されます。
  • 新しいソフトウェアをコード化する必要があるよりも、既存のソフトウェアを使用することをお勧めしますが、それが唯一の方法である場合は、コードを記述してもかまいません。

私は大まかに説明された「解決策」を探しています:

  • クライアントで必要なソフトウェアは何ですか?知っている特定のソフトウェアパッケージがある場合は、それに名前を付けます。それ以外の場合は、クライアントソフトウェアが何をする必要があるかを説明します
  • サーバーにはどのソフトウェアが必要ですか?知っている特定のソフトウェアパッケージがある場合は、それに名前を付けます。それ以外の場合は、サーバーソフトウェアが何をする必要があるかを説明します
  • 上記の特定のソフトウェアパッケージに名前を付けた場合、私の目標を達成するために設定するために必要な構成パラメーターを説明してください。
  • 何らかの理由でこれが不可能であると思われる場合は、その理由を説明してください

試してみたが機能しないもの

  • squidサーバーにインストールして、自分のサーバーに標準のHTTPプロキシを設定しようとしました。通常のHTTP経由でFirefoxのWebサイトを要求すると、Firefoxも通常のHTTP 経由でサーバーにアクセスしようとするため、これはうまくいきませんでした私のローカルネットワーク上のプロキシはもちろん、クライアントとサーバー間の通常のHTTPトラフィックを監視および/またはブロックできるため、これは受け入れられません。
  • VPNは動作しません、私がインストールするには、ローカルコンピュータ上の権限を持っていないので、ポート443上のTLSリスニングオーバーではなく、さらにOpenVPNのをtunレイヤ3ルーティングを実行することができ、ネットワークアダプタを、また私は、レイヤ2ルーティングの任意の並べ替えを行うことができます(例tap)。つまり、OpenVPNをインストールするには管理者権限が必要です。一時的にそれらの管理者権限を持っていたとしても、会社がインストールされていることに気づいたとしても、会社はあまり喜ばないでしょう。Javaまたは.NETプログラムは、特に[プログラムの追加と削除]にインストールされておらず、OpenVPNのようなカーネルドライバーコンポーネントがない場合は、それほど目立ちません。

靴下を試しますか?サーバーのポート443で定義できます。
Ashian 2014

この記事で説明されているソリューション、貧乏人のHTTP VPNを使用できますか?HTTPTunnelへのリンクが正しくないことに注意してください。
harrymc 2014

1
delegate.orgが役立つかもしれません。
Arjan 2014

@Ashianいいえ、TLSでラップしない限り、SOCKSは機能しません。SOCKSはHTTPベースのプロトコルではないため、内部プロキシに到達するとブロックされます。私があればとした TLSを介して実行することができ、私はおそらく別のプロトコルを使用します。最初の問題は、Firefoxが使用できるようにTLSトンネルを設定することです。その方法の説明はまだ見ていません。
allquixotic 2014

@harrymc:質問のタイトルはTLSを通じて伝えますHTTPトンネルは、暗号化されておら、TLSを使用しないHTTP上でIPパケットをルーティングします。記事自体は、接続は暗号化されていないと述べています。私のプロキシがそれを通過させる方法はありません。さらに、私はWindowsクライアントボックスに対する管理者権限を持っていません。socat
allquixotic 2014

回答:


5

私はそれを考え出した。:Dこのソリューションは、すべての要件を満たし、すべての目標を完全に満たします。これを達成するために必要な間接参照のレベルを考慮すると、パフォーマンスもそれほど悪くありません。

したがって、一般的なアプローチは次のとおりです。

  1. ローカル認証局(CA)をセットアップし、RSAの「サーバーキー」と「クライアントキー」を生成します(私は256ビットの暗号化を使用しました)。これには、Easy-RSAバージョン3.0.0-rc2を使用しました。

  2. "Debian Box"(公衆インターネット上のサーバー)で任意のbog標準HTTPプロキシを実行し、localhostのみでリッスンするようにします(公衆インターネットに公開しないでください)。私の目的にはを使用しましPrivoxySquidが、同様に機能しました。それはlocalhostのみでリッスンしていますので、(あなたが信頼していないことを、あなたのボックス上で実行中のプロセスがある場合を除き、その場合には、認証は必要ありませんむ〜 ...)

  3. stunnelをダウンロードして、クライアントとサーバーの両方にインストールします。これを行うプロセスは、OS固有のものになります。私の場合、Windowsのソース(パラノイア...)からstunnelをコンパイルすることにしました。これは、ここでは詳しく説明しませんが、かなり複雑なプロセスでした。サーバー側では、パッケージマネージャーで使用できました:)

  4. Stunnelの設定は、最初は非常に困難でしたが、見た目よりも簡単です!基本的に、サーバーでは、以下の「サーバーのstunnel.conf」のようなものが必要です。クライアントでは、以下の「クライアントのstunnel.conf」のようなものが必要です。

  5. Privoxyを起動します。サーバーでstunnelを起動し、構成ファイルを指すようにします。クライアントでstunnelを開始し、構成ファイルを指すようにします。Privoxyの設定について特別なことは何もありません。デフォルトでは問題ありませんでした。

  6. クライアントサイドで選択したブラウザであるFirefoxで、HTTPおよびHTTPSプロキシを、クライアントのstunnelがリッスンしているポートと同じになるように設定します。おそらくlocalhost:8080のようになります。

ローカルネットワークのプロキシが何らかの認証を要求する場合は、stunnelに認証を要求するか、別のローカルインターセプトプロキシを使用してそれらをチェーン化する必要があることに注意してください-Firefox-> stunnel-> localのようなもの認証プロキシ-> LANプロキシ/ゲートウェイ->インターネット->サーバーのstunnel-> privoxy。

それはたくさんのコピーですが、うまくいきます!

;This is the *client's* stunnel.conf.
[https]
accept = localhost:9020
connect = your.lan.proxy:80
client = yes
protocol = connect
;protocolHost should be the same as the "accept" for the server
protocolHost = 1.2.3.4:443
;Same CAfile, different cert and key pair
CAfile = ca.crt
cert = client.crt
key = client.key
;VERY IMPORTANT!!! Make sure it's really your server and not a MITM attempt by your local network by making sure that the certificate authority "ca.crt" really signed the server's cert
verify = 2
;More performance tweaks...
sessionCachetimeout = 600
sessionCacheSize = 200
TIMEOUTidle = 600

;This is the *server's* stunnel.conf.
[https]
;1.2.3.4 is a publicly-routable, static IP address that can be connected to by your box that's under the firewall
accept = 1.2.3.4:443
;localhost:8118 is an example of where your local forwarding HTTP(S) proxy might reside.
connect = localhost:8118
CAfile = ca.crt
cert = server.crt
key = server.key
;VERY IMPORTANT!!! Without this, anyone in the world can use your public stunnel port as an open proxy!
verify = 2
;Set some timeouts higher for performance reasons
sessionCacheTimeout = 600
sessionCacheSize = 200
TIMEOUTidle = 600

すべてが設定されると、最終結果は次のようになります。

  1. Webブラウザーはlocalhost:9020(stunnel)に接続し、HTTPまたはHTTPS接続を受け入れることができるプロキシのように扱います。
  2. stunnelがブラウザから接続を取得すると、ファイアウォールのプロキシ/ゲートウェイを介して到達し、リモートサーバーとのTLSセッションを確立します。この時点で、クライアントはサーバーのPKI証明書を検証し、その逆も同様です。
  3. リモートサーバーとのTLSセッションが確立されると、stunnelは、ローカルプロキシを介してサーバーに直接、HTTPリクエストやSSLトンネルリクエストなどのブラウザーからのデータを渡します。このチャネルは暗号化されているため、ローカルネットワークはデータの内容を知ることができず、トラフィック分析を行うことによってのみ推測できます。
  4. サーバーでstunnel実行されているインスタンスがデータの受信を開始すると、たとえばlocalhost:8118HTTP(S)プロキシサーバー(私の場合はPrivoxy)がリッスンしている場所への接続が開かれます。
  5. その後、Privoxyは通常の転送HTTPプロキシサーバーのように機能し、サーバーのISPを介してリクエストをパブリックインターネットに転送します。

関連するソケットとバッファの量は、あなたがプロキシ経由でSSL接続を入れ子にしている場合は特に、非常に高いオーバーヘッドこのメソッドを作る、しかし、それはあなたのローカルネットワークが知る方法がないという利点があるどのサイトあなたがSSL経由で訪問しているが。つまり、サーバーにアクセスしていることはわかりますが、それとは別に、Gmailにアクセスしているか、SuperUserにアクセスしているかはわかりません。そしてあなたのローカルゲートウェイはあなたをフィルタリングしたりブロックしたりする方法がありません。


2

私はローカルマシンでこの設定を試しましたが、「制限付きプロキシ」がを取得するCONNECT DEBIAN_IP:443 HTTP/1.1ことを確認できますが、証明書が表示されないため、これが機能するかどうかはわかりません。

仮定してみましょう:あなたのDebianは、プロキシ SSHサーバーを持っているApacheSquid、そうする必要があります。クライアントPCでは、が必要です。これは、実行に管理者権限を必要としないプログラムであり、インストールの必要がなく、ペンドライブから実行できます。putty

まずあなたのDebian:

SSHをポート443でリッスンし、a Port 443を追加する(または現在のポートを置き換える)だけ/etc/ssh/sshd_configでなく、TCP転送も許可する(AllowTcpForwarding yesそのファイルに追加する)

プロキシを実行するようにSquidまたはApacheを構成します。これはSSHトンネルを介して使用されるため、ループバックインターフェイスでリッスンするだけで済みます。Apacheを使用する場合:

Listen 127.0.0.1:8080
ProxyRequests On
<Proxy *>
  Order deny,allow
</Proxy>

サーバーが完了したら、クライアントPCを構成しましょう。

puttyで、DebianのパブリックIPをas Hostおよび443asポートとして構成します。SSHがまだ選択されていることを確認します。Connection -> Proxy設定に変更し、HTTP「制限付きプロキシ」設定を選択して入力します。Connection設定に変更し、30-のキープアライブを確立します60。に変更しますConnection -> SSH -> Tunnelssource port築く8080、とにDestinationlocalhost:8080Local選択したままにして、を押しAddます。あなたは上のようなスペースで見るべきですL8080 locahost:8080。変更へのバックSessionの最初の行の名前ダウンの設定、書き込みSaved sessions及びこれらの面倒な設定はすべて保存ヘルプrestablishに次の日に接続。

これでOpen、Debian への接続を試すことができます。ユーザープロンプトが表示された場合は、これで終了するステップにすぎません。そうでない場合...別の方法を検索する必要があります。

次に、Firefox localhostでポート8080をプロキシとして設定します。


残念ながら、SSHのプロトコルはSSL / TLSに基づいていないため、これは機能しません。クライアント側の制限付きプロキシがポート443を経由する接続のスニッフィングを行うと、TLSソケットではないことが即座に認識され、ドロップされます。確かに、TLSでラップすることはできますが、それはあなたの答えが説明するものではありません。
allquixotic 2014

私はHTTPプロキシ(BURP)を使用してテストを行い、動作したので、試してみる価値がありました。ただし、SSHをTLSでラップして機能させ続けると、トリッキーになる可能性があります...
NuTTyX 2014

TLSを介したSSHは、不必要な間接化です。すでにTLSソケットを使用している場合は、SSHは必要ありません。以下の私の答えを参照してください。(注:この回答については、つい最近まで知りませんでした。そのため、あなたの回答に餌を付けて解決策を投稿したわけではありません。文字通りこれを約25分前に発見しました。)
allquixotic

解決してよかった
NuTTyX 2014

1

サーバーにプロキシを設定する途中です。残りの半分はサーバーのSSLであり、クライアントのローカルプロキシはputtyを使用してSSL対応のHTTPプロキシに接続し、Firefoxがすべてを127.0.0.1にプロキシするように設定します。

私はパテのセットアップのために簡単なグーグルを実行し、これを見つけました:https : //mariobrandt.de/archives/technik/ssh-tunnel-bypassing-transparent-proxy-using-apache-170/


公平を期すために、彼は彼の投稿でより詳細に行きました。投票ありがとうございます。
joe

@krowe私の答えのどこにも「Apache」または「PuTTY」と書かれていません。
allquixotic 2014

いいえ、あなたがこの回答に賛成したことを気にしないでください!私はあなたのコメントを、私が何らかの方法で彼の答えにニックを入れたか、それをはぎ取っていたと言ったと解釈しました。振り返ってみると、リンク先のブログは、投稿した回答のいい代替案のようですが、パフォーマンスや機能などがどのように異なるかはわかりません(改善される場合もあれば、悪化する場合もあります)。
allquixotic 2014

+1とにかくWebサーバーを実行しているので、これが好きです。
krowe 2014
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.