狠狠撸

狠狠撸Share a Scribd company logo
未設定のドメインでも
ELB 経由で proxy.pac を使って
https で接続する方法
天野卓
JAWS-UG 長野支部 勉強会 #2
NSEG #58
础奥厂上の构成
未設定のドメインでも ELB 経由で proxy.pac を使って https で接続する方法
運用中のウェブサイトを
この環境に移行する
DNSのレコードの設定を
更新する前に
ブラウザで確認したい
? 割りと頻繁にIPアドレスが変わるのでhosts
ファイルでは設定しにくい
? DNSサーバーを用意するのは面倒
? proxy.pac で指定できると嬉しい
if (host == “example.com") {
return “PROXY 123345.ap-northeast-1.elb.amazonaws.com”;
}
未設定のドメインでも ELB 経由で proxy.pac を使って https で接続する方法
未設定のドメインでも ELB 経由で proxy.pac を使って https で接続する方法
未設定のドメインでも ELB 経由で proxy.pac を使って https で接続する方法
未設定のドメインでも ELB 経由で proxy.pac を使って https で接続する方法
未設定のドメインでも ELB 経由で proxy.pac を使って https で接続する方法
未設定のドメインでも ELB 経由で proxy.pac を使って https で接続する方法
プロキシサーバーを経由して
HTTPSで接続する場合には
ブラウザはCONNECTメソッドを使う
颁翱狈狈贰颁罢メソッドとは?
CONNECT www.example.com:443 HTTP/1.1
ELBはCONNECTメソッドに
対応していない
CONNECTメソッドに
対応しているプロキシサーバー
を準備すれば接続できそう
? Apache
? Squid
? 等 …
? このためだけに入れるのは面倒くさい
? 設定ファイルを書くのも面倒くさい
? 移行后にアンインストールするのも面倒くさい
? シングルバイナリでコピーすればそのまま動く
? 設定ファイルを書かなくても動く
? シングルバイナリでコピーすればそのまま動く
? go で書いたらシングルバイナリになる
? 確かプロキシサーバーを書けるライブラリがあった
? 設定ファイルを書かなくても動く
? 接続元のIPアドレスを利用できるかも
r2proxy
means
"re?ective reverse proxy"
未設定のドメインでも 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”;?
}
}
谤2辫谤辞虫测の実装
github.com/elazarl/goproxy
import (
"github.com/elazarl/goproxy"
"log"
"net/http"
)
func main() {
proxy := goproxy.NewProxyHttpServer()
proxy.Verbose = true
log.Fatal(http.ListenAndServe(":8080", proxy))
}
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)
}
goproxyを利用する際の
注意 !
接続を制限するコードを
何も入れないと
CONNECTメソッドで
任意のサーバーの任意のポートへ
トンネルし放題になります
import (
"github.com/elazarl/goproxy"
"log"
"net/http"
)
func main() {
proxy := goproxy.NewProxyHttpServer()
proxy.Verbose = true
log.Fatal(http.ListenAndServe(":8080", proxy))
}
IAM ロールで緩めに
権限を与えていたりすると…
谤2辫谤辞虫测の特徴
? バイナリをコピーして実行すれば動作する
? ELBのHTTPSのListenerを利用できる
? EC2のインスタンスでHTTPSの設定をする必要がない
? ELBの"Cookie Stickiness”も利用できる?
(2014年10月時点)
転送料の试算
おそらく無料
(AZ内の転送なので)
谤2辫谤辞虫测の制限事项
? ELBの現在の文書化されていない挙動に依存
? 「接続元のIPアドレスからも応答を返してくれる」
? 接続先のホスト名は暗号化されない
? HTTPSのリクエストの内容は暗号化される
谤2辫谤辞虫测の性能
手元のGoogle Chrome で
計測した性能なので
ざっくりとした傾向のデータです
? KeepAlive で接続を確立した状態から計測
? r2proxy は KeepAlive に未対応
? ただし、HTTPS に関しては KeepAlive になる
? CONNECTメソッドで接続しているので
? キャッシュを Disable にしてページをリロード
? ロード後の以下の値の算術平均
? window.performance.timing.domComplete -
window.performance.timing.connectStart
未設定のドメインでも ELB 経由で proxy.pac を使って https で接続する方法
未設定のドメインでも ELB 経由で proxy.pac を使って https で接続する方法
ありがとうございました!
A theme of this presentation is
https://github.com/sanographix/azusa-keynote

More Related Content

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