Classic Load Balancer で Proxy Protocol を構成する

AWS運用自動化サービス「Cloud Automator」

クライアントからの通信をCLBを経由してサーバにTCPで分散する際に、クライアントのIPアドレスがCLBのIPアドレスに書き換えられます。
CLBの背後に、Proxyがあった場合、送信元がCLBのIPアドレスになってしまうため、クライアントのIPアドレスによるアクセス制御ができなくなります。
そんなとき、Classic Load Balancerで Proxy Protocol を有効にすることで、CLBを経由した後でも、クライアントの発信元IPアドレスを取得することができるようになります。
こちらの構成を今回検証していました。

ProxyProtocol無効時(送信元がCLBのIP)

ProxyProtocol有効時(送信元がProxyClientのIP)

検証環境

前提条件

Proxy Protocol を有効にするための前提条件として、AWS公式サイトには以下のような記述があります。

  • ロードバランサーが、Proxy Protocol が有効になっているプロキシサーバーの背後にないことを確認します。Proxy Protocol がプロキシサーバーとロードバランサーの両方で有効になっていると、ロードバランサーが、プロキシサーバーからのヘッダーが既に追加されているリクエストにもう 1 つのヘッダーを追加します。インスタンスの設定によっては、このような重複によってエラーが発生する可能性があります。

  • インスタンスで Proxy Protocol 情報を処理できることを確認します。

  • リスナー設定で Proxy Protocol がサポートされることを確認します。詳細については、「Classic Load Balancer のリスナーの設定」を参照してください。

検証構成

名称 IP 備考
Proxy(squid) 10.0.0.24/32 AmazonLinux
Proxy-Client 10.0.0.23/32 AmazonLinux
blog-CLB 10.0.0.0/24・10.0.20.0/24 Classic Load Balancer

検証作業

1. Proxyの設定 作業場所

Proxy(squid) にログインし、squidのインストール及びProxyProtocolの設定を実施します。
3128ポートをProxyProtocolを有効にするProxyのリッスンポートとします。

・squidインストール

・squid設定ファイル編集(/etc/squid/squid.conf)

squidの設定ファイルを修正します。
以下の設定は、http_access deny all  よりも上部に設定を入れています。

設定箇所 設定内容
proxy server port Proxyのリッスンポート及びProxyProtocolの有効化
ELB subnet ACL。ELBが所蔵しているサブネットのネットワークアドレス。
white list ACL。ProxyClientのIP。
permit proxy_protocol_access proxy_protocolの利用許可
permit http protocol httpでのアクセス許可

2. CLBの設定

・CLB作成

AWSコンソールより、以下のようなインターナルCLBを作成しています。

項目 設定内容
名前 blog-CLB
DNS名 internal-blog-CLB-950891528.ap-northeast-1.elb.amazonaws.com
種類 Classic
スキーム internal
ポート構成 3128 (TCP) を 3128 (TCP) に転送します
・ProxyProtocolの有効化

CLBの編集権限がある端末で、AWSCLIよりCLBのProxyProtocol有効化を実施します。

Proxy Protocol を有効にするポリシーを作成

 作成したProxy Protocol を有効にするポリシーをCLBに適用

 ポリシーが適用されていることを確認

BackendServerDescriptionsにInstancePort及びPolicyNamesが記載されていることを確認します。

3. 動作確認

最後に動作確認です。
ProxyClientからcurlを叩いて、ProxyのAccessログに記録されている送信元のIPを確認します。

ProxyProtocol設定前は、ELBのIP(10.0.0.101)が送信元になっていますが、設定後は、ProxyClientのIP(10.0.0.23)が記録されていますね。

AWS運用自動化サービス「Cloud Automator」