未設定のドメインでも elb 経由で proxy.pac を使って https で接続する方法

46
未設定のドメインでも ELB 経由で proxy.pac を使って https で接続する方法 天野卓 JAWS-UG 長野支部 勉強会 #2 NSEG #58

Upload: taku-amano

Post on 17-Jul-2015

509 views

Category:

Technology


0 download

TRANSCRIPT

Page 1: 未設定のドメインでも ELB 経由で proxy.pac を使って https で接続する方法

未設定のドメインでも ELB 経由で proxy.pac を使って

https で接続する方法

天野卓 JAWS-UG 長野支部 勉強会 #2

NSEG #58

Page 2: 未設定のドメインでも ELB 経由で proxy.pac を使って https で接続する方法

AWS上の構成

Page 3: 未設定のドメインでも ELB 経由で proxy.pac を使って https で接続する方法
Page 4: 未設定のドメインでも ELB 経由で proxy.pac を使って https で接続する方法

運用中のウェブサイトを この環境に移行する

Page 5: 未設定のドメインでも ELB 経由で proxy.pac を使って https で接続する方法

DNSのレコードの設定を 更新する前に

ブラウザで確認したい

Page 6: 未設定のドメインでも ELB 経由で proxy.pac を使って https で接続する方法

• 割りと頻繁にIPアドレスが変わるのでhostsファイルでは設定しにくい

• DNSサーバーを用意するのは面倒

• proxy.pac で指定できると嬉しい

Page 7: 未設定のドメインでも ELB 経由で proxy.pac を使って https で接続する方法

if (host == “example.com") { return “PROXY 123345.ap-northeast-1.elb.amazonaws.com”;}

Page 8: 未設定のドメインでも ELB 経由で proxy.pac を使って https で接続する方法
Page 9: 未設定のドメインでも ELB 経由で proxy.pac を使って https で接続する方法
Page 10: 未設定のドメインでも ELB 経由で proxy.pac を使って https で接続する方法
Page 11: 未設定のドメインでも ELB 経由で proxy.pac を使って https で接続する方法
Page 12: 未設定のドメインでも ELB 経由で proxy.pac を使って https で接続する方法
Page 13: 未設定のドメインでも ELB 経由で proxy.pac を使って https で接続する方法
Page 14: 未設定のドメインでも ELB 経由で proxy.pac を使って https で接続する方法

プロキシサーバーを経由して HTTPSで接続する場合には

ブラウザはCONNECTメソッドを使う

Page 15: 未設定のドメインでも ELB 経由で proxy.pac を使って https で接続する方法

CONNECTメソッドとは?

Page 16: 未設定のドメインでも ELB 経由で proxy.pac を使って https で接続する方法

CONNECT www.example.com:443 HTTP/1.1

Page 17: 未設定のドメインでも ELB 経由で proxy.pac を使って https で接続する方法

ELBはCONNECTメソッドに 対応していない

Page 18: 未設定のドメインでも ELB 経由で proxy.pac を使って https で接続する方法

CONNECTメソッドに 対応しているプロキシサーバー を準備すれば接続できそう

Page 19: 未設定のドメインでも ELB 経由で proxy.pac を使って https で接続する方法

• Apache

• Squid

• 等 …

Page 20: 未設定のドメインでも ELB 経由で proxy.pac を使って https で接続する方法

• このためだけに入れるのは面倒くさい

• 設定ファイルを書くのも面倒くさい

• 移行後にアンインストールするのも面倒くさい

Page 21: 未設定のドメインでも ELB 経由で proxy.pac を使って https で接続する方法

• シングルバイナリでコピーすればそのまま動く

• 設定ファイルを書かなくても動く

Page 22: 未設定のドメインでも ELB 経由で proxy.pac を使って https で接続する方法

• シングルバイナリでコピーすればそのまま動く

• go で書いたらシングルバイナリになる

• 確かプロキシサーバーを書けるライブラリがあった

• 設定ファイルを書かなくても動く

• 接続元のIPアドレスを利用できるかも

Page 23: 未設定のドメインでも ELB 経由で proxy.pac を使って https で接続する方法

r2proxy

Page 24: 未設定のドメインでも ELB 経由で proxy.pac を使って https で接続する方法

means "reflective reverse proxy"

Page 25: 未設定のドメインでも ELB 経由で proxy.pac を使って https で接続する方法
Page 26: 未設定のドメインでも ELB 経由で proxy.pac を使って https で接続する方法

if (host == “example.com") { if (shExpMatch(url, "https*")) { return “PROXY 123345.ap-northeast-1.elb.amazonaws.com:8080”; } else { return “PROXY 123345.ap-northeast-1.elb.amazonaws.com”; }}

Page 27: 未設定のドメインでも ELB 経由で proxy.pac を使って https で接続する方法

r2proxyの実装

Page 28: 未設定のドメインでも ELB 経由で proxy.pac を使って https で接続する方法

github.com/elazarl/goproxy

Page 29: 未設定のドメインでも ELB 経由で proxy.pac を使って https で接続する方法

import ( "github.com/elazarl/goproxy" "log" "net/http")

func main() { proxy := goproxy.NewProxyHttpServer() proxy.Verbose = true log.Fatal(http.ListenAndServe(":8080", proxy))}

Page 30: 未設定のドメインでも ELB 経由で proxy.pac を使って https で接続する方法

func main() { portRegexp := regexp.MustCompile(":([0-9]+)$") proxy := goproxy.NewProxyHttpServer()

server := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { host := strings.Split(r.RemoteAddr, ":")[0]

port := 80 matches := portRegexp.FindStringSubmatch(r.URL.Host); if len(matches) != 0 { port, _ = strconv.Atoi(matches[1]) }

r.URL.Host = fmt.Sprintf("%s:%d", host, port)

proxy.ServeHTTP(w, r) })

http.ListenAndServe(":8080", server)}

Page 31: 未設定のドメインでも ELB 経由で proxy.pac を使って https で接続する方法

goproxyを利用する際の

注意 !

Page 32: 未設定のドメインでも ELB 経由で proxy.pac を使って https で接続する方法

接続を制限するコードを 何も入れないと

CONNECTメソッドで 任意のサーバーの任意のポートへ トンネルし放題になります

Page 33: 未設定のドメインでも ELB 経由で proxy.pac を使って https で接続する方法

import ( "github.com/elazarl/goproxy" "log" "net/http")

func main() { proxy := goproxy.NewProxyHttpServer() proxy.Verbose = true log.Fatal(http.ListenAndServe(":8080", proxy))}

Page 34: 未設定のドメインでも ELB 経由で proxy.pac を使って https で接続する方法

IAM ロールで緩めに

権限を与えていたりすると…

Page 35: 未設定のドメインでも ELB 経由で proxy.pac を使って https で接続する方法

r2proxyの特徴

Page 36: 未設定のドメインでも ELB 経由で proxy.pac を使って https で接続する方法

• バイナリをコピーして実行すれば動作する

• ELBのHTTPSのListenerを利用できる

• EC2のインスタンスでHTTPSの設定をする必要がない

• ELBの"Cookie Stickiness”も利用できる(2014年10月時点)

Page 37: 未設定のドメインでも ELB 経由で proxy.pac を使って https で接続する方法

転送料の試算

Page 38: 未設定のドメインでも ELB 経由で proxy.pac を使って https で接続する方法

おそらく無料

(AZ内の転送なので)

Page 39: 未設定のドメインでも ELB 経由で proxy.pac を使って https で接続する方法

r2proxyの制限事項

Page 40: 未設定のドメインでも ELB 経由で proxy.pac を使って https で接続する方法

• ELBの現在の文書化されていない挙動に依存

• 「接続元のIPアドレスからも応答を返してくれる」

• 接続先のホスト名は暗号化されない

• HTTPSのリクエストの内容は暗号化される

Page 41: 未設定のドメインでも ELB 経由で proxy.pac を使って https で接続する方法

r2proxyの性能

Page 42: 未設定のドメインでも ELB 経由で proxy.pac を使って https で接続する方法

手元のGoogle Chrome で 計測した性能なので

ざっくりとした傾向のデータです

Page 43: 未設定のドメインでも ELB 経由で proxy.pac を使って https で接続する方法

• KeepAlive で接続を確立した状態から計測

• r2proxy は KeepAlive に未対応

• ただし、HTTPS に関しては KeepAlive になる

• CONNECTメソッドで接続しているので

• キャッシュを Disable にしてページをリロード

• ロード後の以下の値の算術平均

• window.performance.timing.domComplete - window.performance.timing.connectStart

Page 44: 未設定のドメインでも ELB 経由で proxy.pac を使って https で接続する方法
Page 45: 未設定のドメインでも ELB 経由で proxy.pac を使って https で接続する方法
Page 46: 未設定のドメインでも ELB 経由で proxy.pac を使って https で接続する方法

ありがとうございました!

A theme of this presentation is https://github.com/sanographix/azusa-keynote