PROXYプロトコル
PROXYプロトコルとは?
リバースプロキシやロードバランサーがクライアントとバックエンドサーバーの間に存在する場合、バックエンドサーバーにはプロキシのIPアドレスがソースとして見え、元のクライアントのアドレスは見えません。PROXYプロトコルは、TCPレイヤーでこの問題を解決します。上流のプロキシが各TCP接続の先頭に、元のクライアントのIPアドレスとポートを含む小さなヘッダーを付加します。
X-Forwarded-ForやForwardedヘッダーなどのHTTPレベルのソリューションとは異なり、PROXYプロトコルはTCPベースのあらゆるプロトコルに対して透過的に動作し、アプリケーションレベルのクライアントによるなりすましができません。
rpxyでの動作
rpxyは受信TCP接続でのPROXYプロトコルv1/v2ヘッダーの受信をサポートしています。これにより、rpxyはPROXYプロトコルに対応したL4ロードバランサーやプロキシ(AWS ELB、HAProxy、Nginx、rpxy-l4など)の背後に配置でき、rpxyはPROXYヘッダーから元のクライアントのソースIPとポートを復元します。
一般的なデプロイ構成は以下の通りです:
Client --> L4 Load Balancer (PROXY protocol) --> rpxy --> Backend AppPROXYプロトコルがない場合、rpxyにはロードバランサーのIPのみがクライアントアドレスとして見えます。PROXYプロトコルを有効にすると、rpxyは付加されたヘッダーを解析し、ログと転送に実際のクライアントIPを使用します。
設定
PROXYプロトコルサポートはデフォルトビルドに含まれています。有効にするには、設定ファイルに[experimental.tcp_recv_proxy_protocol]セクションを追加します:
[experimental.tcp_recv_proxy_protocol]
trusted_proxies = ["127.0.0.1/32", "10.0.0.0/8"] # 必須、空でないCIDRリスト(IPv4および/またはIPv6)
timeout = 50 # オプション、ミリ秒。デフォルト: 50ms。0 = 5sにフォールバック。| パラメータ | 説明 |
|---|---|
trusted_proxies | 必須。信頼されたプロキシソースを指定するCIDR範囲の空でないリスト。例: ["127.0.0.1/32", "::1/128"] |
timeout | オプション。PROXYヘッダー受信のタイムアウト(ミリ秒)。デフォルトは50ms。0に設定すると5sにフォールバック(非推奨)。 |
有効にすると、rpxyは信頼されたプロキシからのすべての受信TCP接続にPROXYプロトコルヘッダーが含まれることを期待し、そこから元のクライアントアドレス情報を抽出します。
制限事項
ユースケース
- **AWS Elastic Load Balancer (ELB)**の背後での
rpxyの運用 - PROXYプロトコルが有効なHAProxyの背後での
rpxyの運用 - TCPプロキシとしてPROXYプロトコル付きで設定されたNginxの背後での
rpxyの運用 - レイヤー4ロードバランシングのためのrpxy-l4との連携
rpxy-l4 と rpxy の関係を手短に確認したい場合は、rpxy-l4 を参照してください。