コンテンツにスキップ

PROXYプロトコル

PROXYプロトコルとは?

リバースプロキシやロードバランサーがクライアントとバックエンドサーバーの間に存在する場合、バックエンドサーバーにはプロキシのIPアドレスがソースとして見え、元のクライアントのアドレスは見えません。PROXYプロトコルは、TCPレイヤーでこの問題を解決します。上流のプロキシが各TCP接続の先頭に、元のクライアントのIPアドレスとポートを含む小さなヘッダーを付加します。

X-Forwarded-ForForwardedヘッダーなどの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 App

PROXYプロトコルがない場合、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プロトコルヘッダーが含まれることを期待し、そこから元のクライアントアドレス情報を抽出します。

セキュリティ警告: PROXYヘッダーは認証されません。設定時は、すべてのTCP接続がリストされた信頼されたプロキシから送信される必要があります。クライアントアドレスのなりすましを防ぐため、ファイアウォールルールでアクセスを制限してください。

制限事項

QUICの基盤となるUDPはコネクションレスであるため、PROXYプロトコルでHTTP/3 (QUIC)はサポートされていません。PROXYプロトコルサポートはTCP上のHTTP/1.1およびHTTP/2にのみ適用されます。

ユースケース

  • **AWS Elastic Load Balancer (ELB)**の背後でのrpxyの運用
  • PROXYプロトコルが有効なHAProxyの背後でのrpxyの運用
  • TCPプロキシとしてPROXYプロトコル付きで設定されたNginxの背後でのrpxyの運用
  • レイヤー4ロードバランシングのためのrpxy-l4との連携

rpxy-l4rpxy の関係を手短に確認したい場合は、rpxy-l4 を参照してください。