share facebook facebook2 twitter menu hatena pocket slack

2015.02.25 WED

ELB経由でフォワードプロキシ on Amazon EC2

WRITTEN BY三浦 剛慈

こんにちは、cloudpack三浦剛慈 です。

■実現したい事

AWS上でフォワードプロキシサーバを冗長構成(act/act)で用意する。インタネット越しでそのプロキシサーバを利用する。

■実現方法

  • Internet facingのELBを作成する
  • Cent OS on EC2上でフォワードプロキシサーバーを2台起動させる
  • ELBにフォワードプロキシサーバーを2台ぶら下げる

■構成イメージ

ELB経由でフォワードプロキシ on Amazon EC2: 構成イメージ

■構築方法

※NATの構築方法については割愛します。

1.フォワードproxyサーバ

※今回はApacheを利用

1-1.apacheのインストール
#yum install httpd
1-2.サービスポートを80以外に変更する

※ここがキモ(80だとELB経由では実現できません!

Listen 8080
1-3.フォワードproxyを有効に設定する
<IfModule mod_proxy.c>
ProxyRequests On

<Proxy *>
Order deny,allow
Allow from all
</Proxy>
ProxyVia On

Allow from allはセキュリティ要件に合わせて調整したほうがよいです。

1-4.apache再起動
#service httpd restart

2.ELB

2-1.Port Configurationの設定

※その他はよしなに
ELB経由でフォワードプロキシ on Amazon EC2: ELB Port Configuration の設定

■注意事項

ELBのPort Configurationで80ポートを使用した場合、ELBがHTTPリクエストのURIパラメータを書き換えてEC2に渡してしまう為、正しくフォワードされなくなります。

http://cloudpack.jp がターゲットである場合の例で説明しますと、クライアント端末からELBへのリクエストのURIパラメータ

GET https://cloudpack.jp/ HTTP/1.1

は上記のとおりで、

80ポートを使用した際の、ELBからEC2に渡されるURIパラメータは

GET / HTTP/1.1

※”http://cloudpack.jp”がすっぽり抜けます
→ 結果、”/”が指定されている為、forward proxyサーバのローカルドキュメントルートのindex.htmlが返されることになります。

80ポート 以 外 を使用した際の、ELBからEC2に渡されるURIパラメータ

GET https://cloudpack.jp/ HTTP/1.1

※クライアント端末から渡されたものがそのままELBからEC2に渡されます

■動作確認方法

curl コマンドでproxyサーバ指定して行う方法

$ http_proxy=http://xxxx-yyyyyyy.ap-northeast-1.elb.amazonaws.com:8080 curl https://cloudpack.jp/ -v
* Adding handle: conn: 0xAAAAAAAAAA
* Adding handle: send: 0
* Adding handle: recv: 0
* Curl_addHandleToPipeline: length: 1
* - Conn 0 (0xBBBBBBBBBBB) send_pipe: 1, recv_pipe: 0
* About to connect() to proxy xxxx-yyyyyyy.ap-northeast-1.elb.amazonaws.com port 8080 (#0)
*   Trying zzz.zzz.zzz.zzz...
* Connected to xxxx-yyyyyyy.ap-northeast-1.elb.amazonaws.com (zzz.zzz.zzz.zzz) port 8080 (#0)
> GET https://cloudpack.jp/ HTTP/1.1
> User-Agent: curl/7.30.0
> Host: cloudpack.jp
> Accept: */*
> Proxy-Connection: Keep-Alive
>
&lt; HTTP/1.1 200 OK
&lt; Date: Thu, 19 Feb 2015 02:53:27 GMT
* Server nginx is not blacklisted
&lt; Server: nginx
&lt; Content-Type: text/html; charset=UTF-8
&lt; Vary: Accept-Encoding
&lt; X-Cached: Thu, 19 Feb 2015 02:03:12 GMT
&lt; Via: 1.1 ip-dd-ee-ff-gg.ap-northeast-1.compute.internal
&lt; Connection: close
&lt; Transfer-Encoding: chunked
&lt;
&lt;!DOCTYPE html&gt;
&lt;html lang=&quot;ja&quot;&gt;
~中略~
&lt;/html&gt;

以上です。

元記事はこちらです。
ELB経由でフォワードプロキシ on EC2