CLBからクライアントの実際のIPを取得する方法の紹介
CLBの4層のリスナー(TCP/UDP/TCP SSL/QUIC)は、バックエンドサーバーからクライアントの実際のIPを直接取得することをサポートしており、追加の設定が不要です。デフォルトでは、バックエンドサーバーから取得された送信元IPは、クライアントの実際のIPです。
ただし、CLBとバックエンドサーバーの間に1つ以上のNATゲートウェイが存在する場合、バックエンドサーバーはクライアントの実際の送信元IPを取得できません。この場合、CLBの4層のリスナーでProxy Protocol設定を有効にし、Proxy Protocolを使用し、Proxy Protocolを通じてクライアントの実際の送信元IPをバックエンドサーバーに渡すことができます。
注意:
注意:
この機能を使用するには、バックエンドサーバー側で同じくProxy Protocolを有効にする必要があります。これにより、バックエンドサーバーはクライアントの実際のIPアドレスを取得できます。ただし、バックエンドサーバーがProxy Protocolの解析能力を持っていない場合、Proxy Protocol設定にチェックを入れると、バックエンドサービスの解析異常を引き起こし、サービスが使えなくなる可能性があります。
この機能はオンラインでのスムーズなマイグレーションをサポートしていません。ProxyProtocolに切り替えるにはサービスを停止してアップグレードする必要がありますので、慎重に設定してください。
CLBはProxy Protocol v2バージョンのみをサポートしています。Proxy Protocol v2バージョンは、TCPやUDPなどの複数の通信プロトコルをサポートしています。詳細は The PROXY protocolをご参照ください。 機能説明
この機能は標準アカウントタイプのみでサポートされており、従来のアカウントタイプではサポートされていません。アカウントタイプの判断方法はアカウントタイプの判断をご参照ください。 IPv4およびIPv6インスタンスのTCP/UDP/TCP SSL/QUICリスナーのみがこの機能をサポートしています。
IPv6 CLBのTCP/UDPリスナーのProxy Protocol設定機能はまだグレーボックステストの段階にあります。必要に応じてオーダーシートの申請を提出してください。 Proxy Protocolについて
Proxy Protocolを使用すると、プロキシサーバはリクエストを転送する際に、クライアントの元のネットワーク接続情報をリクエストヘッダーにカプセル化してバックエンドサーバーに渡します。バックエンドサーバーはProxy Protocolヘッダーを解析することで、送信元IPアドレス、送信元ポート、通信プロトコルなどのクライアントの実際のネットワーク接続情報を取得できます。
Proxy Protocolを使用することで、バックエンドサーバーは的確なクライアントの元のネットワーク接続情報を取得し、より正確なログ記録、アクセス制御、トラフィック監視などの操作を行うことができます。
Proxy Protocol V2
Proxy Protocol V2プロトコルはバイナリ形式を採用しており、TCPv4、TCPv6、UDPv4、UDPv6をサポートしており、その形式は以下の通り:
IPv4形式
IPv6形式
前提条件
Proxy Protocolを有効にする前に、新規接続が失敗しないように、ご使用のバックエンドサーバーがProxy Protocol v2バージョンをサポートしていることを確認してください。
本記事では、IPv4 CLBのTCPリスナーを例として説明します。
操作手順
ステップ1:TCPリスナーのProxy Protocol設定を有効にする
2. CLBインスタンス一覧ページの左上から地域を選択し、インスタンス一覧の右側の操作列でリスナーの設定をクリックします。
3. TCP/UDP/TCP SSL/QUICリスナーで対象のリスナーの詳細をクリックし、ProxyProtocolの設定が有効になっていることを確認します。有効になっていない場合は、リスナーを編集し、詳細オプションでProxyProtocolの設定にチェックを入れ、保存してください。
ステップ2:バックエンドサーバーのProxy Protocolを有効にする
ここでは、CentOS 7.9およびNginx 1.20.1バージョンの設定を例として説明します。実際は使用している環境に応じて設定してください。
1. バックエンドサーバーにログインし、nginx -tコマンドを実行して設定ファイルのパスを確認します。デフォルトパスは/etc/nginx/nginx.confですが、実際は使用している環境に応じて設定してください。
2. 設定ファイル内のProxy Protocolの内容を変更して保存してください。変更箇所は以下の説明を参照してください。
http {
# $proxy_protocol_addrの設定を確保し、この変数はクライアントの実際のIPを記録します
log_format main '$proxy_protocol_addr - $remote_addr- $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
# 80リスニングポートを例として、proxy_protocolフィールドを追加します
server { listen 80 proxy_protocol;
#...
}
}
3. sudo nginx -s reloadコマンドを実行し、Nginxの設定ファイルを再読み込みします。
ステップ3:バックエンドサーバーがクライアントの実際のIPを取得できたかを確認
Nginxをバックエンドサーバーとして使用している場合、Nginxのログを確認することで、クライアントの実際のIPアドレスを正常に取得できたかを判断できます。
Nginxのログファイルのデフォルトパスは:/var/log/nginx/access.logです。
各行のログにおいて、$proxy_protocol_addr変数に対応するIPアドレスがクライアントの実際のIPアドレスです。