未設定のドメインでも elb 経由で proxy.pac を使って https で接続する方法
TRANSCRIPT
![Page 1: 未設定のドメインでも ELB 経由で proxy.pac を使って https で接続する方法](https://reader034.vdocuments.site/reader034/viewer/2022052217/55a8df9d1a28ab0d0d8b4875/html5/thumbnails/1.jpg)
未設定のドメインでも ELB 経由で proxy.pac を使って
https で接続する方法
天野卓 JAWS-UG 長野支部 勉強会 #2
NSEG #58
![Page 2: 未設定のドメインでも ELB 経由で proxy.pac を使って https で接続する方法](https://reader034.vdocuments.site/reader034/viewer/2022052217/55a8df9d1a28ab0d0d8b4875/html5/thumbnails/2.jpg)
AWS上の構成
![Page 3: 未設定のドメインでも ELB 経由で proxy.pac を使って https で接続する方法](https://reader034.vdocuments.site/reader034/viewer/2022052217/55a8df9d1a28ab0d0d8b4875/html5/thumbnails/3.jpg)
![Page 4: 未設定のドメインでも ELB 経由で proxy.pac を使って https で接続する方法](https://reader034.vdocuments.site/reader034/viewer/2022052217/55a8df9d1a28ab0d0d8b4875/html5/thumbnails/4.jpg)
運用中のウェブサイトを この環境に移行する
![Page 5: 未設定のドメインでも ELB 経由で proxy.pac を使って https で接続する方法](https://reader034.vdocuments.site/reader034/viewer/2022052217/55a8df9d1a28ab0d0d8b4875/html5/thumbnails/5.jpg)
DNSのレコードの設定を 更新する前に
ブラウザで確認したい
![Page 6: 未設定のドメインでも ELB 経由で proxy.pac を使って https で接続する方法](https://reader034.vdocuments.site/reader034/viewer/2022052217/55a8df9d1a28ab0d0d8b4875/html5/thumbnails/6.jpg)
• 割りと頻繁にIPアドレスが変わるのでhostsファイルでは設定しにくい
• DNSサーバーを用意するのは面倒
• proxy.pac で指定できると嬉しい
![Page 7: 未設定のドメインでも ELB 経由で proxy.pac を使って https で接続する方法](https://reader034.vdocuments.site/reader034/viewer/2022052217/55a8df9d1a28ab0d0d8b4875/html5/thumbnails/7.jpg)
if (host == “example.com") { return “PROXY 123345.ap-northeast-1.elb.amazonaws.com”;}
![Page 8: 未設定のドメインでも ELB 経由で proxy.pac を使って https で接続する方法](https://reader034.vdocuments.site/reader034/viewer/2022052217/55a8df9d1a28ab0d0d8b4875/html5/thumbnails/8.jpg)
![Page 9: 未設定のドメインでも ELB 経由で proxy.pac を使って https で接続する方法](https://reader034.vdocuments.site/reader034/viewer/2022052217/55a8df9d1a28ab0d0d8b4875/html5/thumbnails/9.jpg)
![Page 10: 未設定のドメインでも ELB 経由で proxy.pac を使って https で接続する方法](https://reader034.vdocuments.site/reader034/viewer/2022052217/55a8df9d1a28ab0d0d8b4875/html5/thumbnails/10.jpg)
![Page 11: 未設定のドメインでも ELB 経由で proxy.pac を使って https で接続する方法](https://reader034.vdocuments.site/reader034/viewer/2022052217/55a8df9d1a28ab0d0d8b4875/html5/thumbnails/11.jpg)
![Page 12: 未設定のドメインでも ELB 経由で proxy.pac を使って https で接続する方法](https://reader034.vdocuments.site/reader034/viewer/2022052217/55a8df9d1a28ab0d0d8b4875/html5/thumbnails/12.jpg)
![Page 13: 未設定のドメインでも ELB 経由で proxy.pac を使って https で接続する方法](https://reader034.vdocuments.site/reader034/viewer/2022052217/55a8df9d1a28ab0d0d8b4875/html5/thumbnails/13.jpg)
![Page 14: 未設定のドメインでも ELB 経由で proxy.pac を使って https で接続する方法](https://reader034.vdocuments.site/reader034/viewer/2022052217/55a8df9d1a28ab0d0d8b4875/html5/thumbnails/14.jpg)
プロキシサーバーを経由して HTTPSで接続する場合には
ブラウザはCONNECTメソッドを使う
![Page 15: 未設定のドメインでも ELB 経由で proxy.pac を使って https で接続する方法](https://reader034.vdocuments.site/reader034/viewer/2022052217/55a8df9d1a28ab0d0d8b4875/html5/thumbnails/15.jpg)
CONNECTメソッドとは?
![Page 17: 未設定のドメインでも ELB 経由で proxy.pac を使って https で接続する方法](https://reader034.vdocuments.site/reader034/viewer/2022052217/55a8df9d1a28ab0d0d8b4875/html5/thumbnails/17.jpg)
ELBはCONNECTメソッドに 対応していない
![Page 18: 未設定のドメインでも ELB 経由で proxy.pac を使って https で接続する方法](https://reader034.vdocuments.site/reader034/viewer/2022052217/55a8df9d1a28ab0d0d8b4875/html5/thumbnails/18.jpg)
CONNECTメソッドに 対応しているプロキシサーバー を準備すれば接続できそう
![Page 19: 未設定のドメインでも ELB 経由で proxy.pac を使って https で接続する方法](https://reader034.vdocuments.site/reader034/viewer/2022052217/55a8df9d1a28ab0d0d8b4875/html5/thumbnails/19.jpg)
• Apache
• Squid
• 等 …
![Page 20: 未設定のドメインでも ELB 経由で proxy.pac を使って https で接続する方法](https://reader034.vdocuments.site/reader034/viewer/2022052217/55a8df9d1a28ab0d0d8b4875/html5/thumbnails/20.jpg)
• このためだけに入れるのは面倒くさい
• 設定ファイルを書くのも面倒くさい
• 移行後にアンインストールするのも面倒くさい
![Page 21: 未設定のドメインでも ELB 経由で proxy.pac を使って https で接続する方法](https://reader034.vdocuments.site/reader034/viewer/2022052217/55a8df9d1a28ab0d0d8b4875/html5/thumbnails/21.jpg)
• シングルバイナリでコピーすればそのまま動く
• 設定ファイルを書かなくても動く
![Page 22: 未設定のドメインでも ELB 経由で proxy.pac を使って https で接続する方法](https://reader034.vdocuments.site/reader034/viewer/2022052217/55a8df9d1a28ab0d0d8b4875/html5/thumbnails/22.jpg)
• シングルバイナリでコピーすればそのまま動く
• go で書いたらシングルバイナリになる
• 確かプロキシサーバーを書けるライブラリがあった
• 設定ファイルを書かなくても動く
• 接続元のIPアドレスを利用できるかも
![Page 23: 未設定のドメインでも ELB 経由で proxy.pac を使って https で接続する方法](https://reader034.vdocuments.site/reader034/viewer/2022052217/55a8df9d1a28ab0d0d8b4875/html5/thumbnails/23.jpg)
r2proxy
![Page 24: 未設定のドメインでも ELB 経由で proxy.pac を使って https で接続する方法](https://reader034.vdocuments.site/reader034/viewer/2022052217/55a8df9d1a28ab0d0d8b4875/html5/thumbnails/24.jpg)
means "reflective reverse proxy"
![Page 25: 未設定のドメインでも ELB 経由で proxy.pac を使って https で接続する方法](https://reader034.vdocuments.site/reader034/viewer/2022052217/55a8df9d1a28ab0d0d8b4875/html5/thumbnails/25.jpg)
![Page 26: 未設定のドメインでも ELB 経由で proxy.pac を使って https で接続する方法](https://reader034.vdocuments.site/reader034/viewer/2022052217/55a8df9d1a28ab0d0d8b4875/html5/thumbnails/26.jpg)
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 で接続する方法](https://reader034.vdocuments.site/reader034/viewer/2022052217/55a8df9d1a28ab0d0d8b4875/html5/thumbnails/27.jpg)
r2proxyの実装
![Page 29: 未設定のドメインでも ELB 経由で proxy.pac を使って https で接続する方法](https://reader034.vdocuments.site/reader034/viewer/2022052217/55a8df9d1a28ab0d0d8b4875/html5/thumbnails/29.jpg)
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 で接続する方法](https://reader034.vdocuments.site/reader034/viewer/2022052217/55a8df9d1a28ab0d0d8b4875/html5/thumbnails/30.jpg)
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 で接続する方法](https://reader034.vdocuments.site/reader034/viewer/2022052217/55a8df9d1a28ab0d0d8b4875/html5/thumbnails/31.jpg)
goproxyを利用する際の
注意 !
![Page 32: 未設定のドメインでも ELB 経由で proxy.pac を使って https で接続する方法](https://reader034.vdocuments.site/reader034/viewer/2022052217/55a8df9d1a28ab0d0d8b4875/html5/thumbnails/32.jpg)
接続を制限するコードを 何も入れないと
CONNECTメソッドで 任意のサーバーの任意のポートへ トンネルし放題になります
![Page 33: 未設定のドメインでも ELB 経由で proxy.pac を使って https で接続する方法](https://reader034.vdocuments.site/reader034/viewer/2022052217/55a8df9d1a28ab0d0d8b4875/html5/thumbnails/33.jpg)
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 で接続する方法](https://reader034.vdocuments.site/reader034/viewer/2022052217/55a8df9d1a28ab0d0d8b4875/html5/thumbnails/34.jpg)
IAM ロールで緩めに
権限を与えていたりすると…
![Page 35: 未設定のドメインでも ELB 経由で proxy.pac を使って https で接続する方法](https://reader034.vdocuments.site/reader034/viewer/2022052217/55a8df9d1a28ab0d0d8b4875/html5/thumbnails/35.jpg)
r2proxyの特徴
![Page 36: 未設定のドメインでも ELB 経由で proxy.pac を使って https で接続する方法](https://reader034.vdocuments.site/reader034/viewer/2022052217/55a8df9d1a28ab0d0d8b4875/html5/thumbnails/36.jpg)
• バイナリをコピーして実行すれば動作する
• ELBのHTTPSのListenerを利用できる
• EC2のインスタンスでHTTPSの設定をする必要がない
• ELBの"Cookie Stickiness”も利用できる(2014年10月時点)
![Page 37: 未設定のドメインでも ELB 経由で proxy.pac を使って https で接続する方法](https://reader034.vdocuments.site/reader034/viewer/2022052217/55a8df9d1a28ab0d0d8b4875/html5/thumbnails/37.jpg)
転送料の試算
![Page 38: 未設定のドメインでも ELB 経由で proxy.pac を使って https で接続する方法](https://reader034.vdocuments.site/reader034/viewer/2022052217/55a8df9d1a28ab0d0d8b4875/html5/thumbnails/38.jpg)
おそらく無料
(AZ内の転送なので)
![Page 39: 未設定のドメインでも ELB 経由で proxy.pac を使って https で接続する方法](https://reader034.vdocuments.site/reader034/viewer/2022052217/55a8df9d1a28ab0d0d8b4875/html5/thumbnails/39.jpg)
r2proxyの制限事項
![Page 40: 未設定のドメインでも ELB 経由で proxy.pac を使って https で接続する方法](https://reader034.vdocuments.site/reader034/viewer/2022052217/55a8df9d1a28ab0d0d8b4875/html5/thumbnails/40.jpg)
• ELBの現在の文書化されていない挙動に依存
• 「接続元のIPアドレスからも応答を返してくれる」
• 接続先のホスト名は暗号化されない
• HTTPSのリクエストの内容は暗号化される
![Page 41: 未設定のドメインでも ELB 経由で proxy.pac を使って https で接続する方法](https://reader034.vdocuments.site/reader034/viewer/2022052217/55a8df9d1a28ab0d0d8b4875/html5/thumbnails/41.jpg)
r2proxyの性能
![Page 42: 未設定のドメインでも ELB 経由で proxy.pac を使って https で接続する方法](https://reader034.vdocuments.site/reader034/viewer/2022052217/55a8df9d1a28ab0d0d8b4875/html5/thumbnails/42.jpg)
手元のGoogle Chrome で 計測した性能なので
ざっくりとした傾向のデータです
![Page 43: 未設定のドメインでも ELB 経由で proxy.pac を使って https で接続する方法](https://reader034.vdocuments.site/reader034/viewer/2022052217/55a8df9d1a28ab0d0d8b4875/html5/thumbnails/43.jpg)
• KeepAlive で接続を確立した状態から計測
• r2proxy は KeepAlive に未対応
• ただし、HTTPS に関しては KeepAlive になる
• CONNECTメソッドで接続しているので
• キャッシュを Disable にしてページをリロード
• ロード後の以下の値の算術平均
• window.performance.timing.domComplete - window.performance.timing.connectStart
![Page 44: 未設定のドメインでも ELB 経由で proxy.pac を使って https で接続する方法](https://reader034.vdocuments.site/reader034/viewer/2022052217/55a8df9d1a28ab0d0d8b4875/html5/thumbnails/44.jpg)
![Page 45: 未設定のドメインでも ELB 経由で proxy.pac を使って https で接続する方法](https://reader034.vdocuments.site/reader034/viewer/2022052217/55a8df9d1a28ab0d0d8b4875/html5/thumbnails/45.jpg)
![Page 46: 未設定のドメインでも ELB 経由で proxy.pac を使って https で接続する方法](https://reader034.vdocuments.site/reader034/viewer/2022052217/55a8df9d1a28ab0d0d8b4875/html5/thumbnails/46.jpg)
ありがとうございました!
A theme of this presentation is https://github.com/sanographix/azusa-keynote