Proxy Protocolを知りました

Proxy ProtocolはL4におけるx-forwarded-forみたいなもの

2010年ごろからあるみたいだったけどお恥ずかしながら知らずに生きてきた。 HTTPヘッダが覗けるロードバランサー(L7ロードバランサー)ならx-forwarded-forとかx-real-ipとかにIPを追記していくことでclientのIPアドレスを保持することができる。 HTTP通信以外のL4ロードバランサーの場合はそれができないので、Proxy Protocolというプロトコルを使ってclient ipを保持するという仕組み。

もとは、ロードバランサーのソフトウェアであるHAProxyが策定したものだが、それをAWSなど有名どころが採用したため標準的なものとして採用されている。

AWSのELBはどうなってたか

AWSの場合は、ELBでHTTPリスナーにすれば自動的にL7ロードバランサーになっているので気づいていないこともあると思う。もちろん、ALBはHTTPとHTTPSのみしか対応しておらずリクエストのパスで振り分けもできるのでL7ロードバランサーである。

HTTP以外、例えばMySQLとかSMTPとかを負荷分散する場合には、L4ロードバランサーになるが、その場合も、コマンドラインからProxy Protocolを有効にすることができるようです。 http://docs.aws.amazon.com/ja_jp/elasticloadbalancing/latest/classic/enable-proxy-protocol.html

f:id:masato47744:20170422024616p:plain

GCPではSSLプロキシ負荷分散の場合しか使えなかった

とにかく、Client IPが欲しくて欲しくてたまらなかったので、deis/routerにuse proxy protocolというのがあってなんかよく分からんけどこれをtrueにすればいけるかと思ったけど、ログにエラーが吐かれるのでproxy protocolとはなんぞやを調べ始めはじめたのがきっかけ。

https://cloud.google.com/compute/docs/load-balancing/tcp-ssl/#update_proxy_protocol_header_for_the_proxy

f:id:masato47744:20170422024628p:plain