r2proxy - あまり設定せずにELB経由でproxy.pacを使ってHTTPSでアクセスするためのツール

  • 投稿日:
  • by
  • カテゴリ:

Amazon Web Service (AWS) の Elastic Load Balancing (ELB) の場合はIPアドレスが固定ではなくhostsファイルでは設定しにくいというところもあり、DNSのレコードを未設定のホストにブラウザからアクセスしたい場合には、proxy.pacでELBのAレコードに向けてしまうと便利です。この場合、ELBは設定したEC2インスタンスへのプロキシサーバーとして振る舞ってくれるので、何も準備をしなくてもHTTPであれば表示することができます。ただHTTPSに関しては、proxy.pacで設定した場合にはブラウザはCONNECTメソッドを使って繋ぎにいくのですが、ELBがCONNECTメソッドには対応していないため、表示することができません。

そのような問題を解決するためのツールを書きました。

r2proxy

どのように動作するのか?

  • r2proxyは、(オプション無しで起動すると) 直接の接続元へのHTTPのプロキシサーバーとして動作します。( CONNECTメソッドにも対応しています)
    • ELBのインスタンスは、(2014年10月時点では)接続元のIPアドレスに接続しても、設定したInstance Portから応答を返してくれるようなので、その動作を利用しています。
  • ELBでTCPのListenerを一つ作り、それをr2proxyに向けます。
  • proxy.pacで、TCPのListenerのポートを指定すると、HTTPSのリクエストを表示できるようになります。

特徴

  • ELBのHTTPSのListenerを利用できます。
    • EC2のインスタンスでHTTPSの設定をする必要がありません。
  • ELBの"Cookie Stickiness"を利用できます。(2014年10月時点)
  • デフォルトで想定している使いかたの場合には、環境ごとの個別の設定は必要ありません。
    • コンパイル済みのプログラムをコピーして実行すれば動作します。

懸案事項など

  • 「接続元のIPアドレスからも応答を返してくれる」という現時点での挙動に依存しているので、これが変更になった場合には動作しなくなります。
  • ELBとインスタンスの間のやりとりが一往復増えていたりするので、r2proxyはHTTPの(HTTPS向けでない)プロキシサーバーとしても動作していますが、HTTPSのリクエストのみを向けるのがいいと思います。
  • CONNECTメソッドを使うことになるので、接続先のホスト名はHTTPで暗号化されずに送信されます。(HTTPSに関してはリクエストと応答の内容は暗号化されます)