Nginx で X-Real-IP と X-Forwarded-For の両方を有効にする

Nginx で X-Real-IP と X-Forwarded-For の両方を有効にする

Nginx で X-Real-IP と X-Forwarded-For の両方を有効にするにはどうすればいいですか? 現在、Docker ネットワークで実際の IP を取得するには、次の操作を実行します。

set_real_ip_from  172.18.0.0/32;
real_ip_header    X-Real-IP;
real_ip_recursive on;

また、Cloudflare から Docker コンテナに実際の IP を渡すことも検討しています。X-Real-IP と X-Forwarded-For の両方を同じ構成で使用し、X-Real-IP に 1 セットの IP を使用し、X-Forwarded-For に 1 セットの IP を使用するにはどうすればよいでしょうか。

答え1

CloudFlare の背後から実際の IP を取得しようとしている場合は、代わりに独自のヘッダー CF-Connecting-IP を使用する必要があります。自分で生成していない場合は、他のヘッダーはクライアントによって偽造される可能性があるため、無視する必要があります。

real_ip_header CF-Connecting-IP;

答え2

  1. 試す地図ping を実行します (動作しません):

    map $remote_addr $real_header {
      default X-Real-IP;
      172.18.0.1 X-Forwarded-For;
    }
    
    server {
      real_ip_header $real_header;
    }
    
  2. これらのストリームを異なるサーバーに分割してみてください。マニュアルに従って、real_ip_header はサーバーまたは場所ごとに設定できるため、次のことが可能です。

    server {
      listen :8080;
      real_ip_header X-Real-IP;
      include "/all/other/stuff.conf";
    }
    
    server {
      listen :8081;
      real_ip_header X-Forwarded-For;
      include "/all/other/stuff.conf";
    }
    
  3. 場所を扱うには、それらを区別するための構文糖がさらに多く含まれ、おそらくifを使用する必要があるでしょうが、それらはしかし、2 つの内部場所を作成し、その間を手動で内部書き換えることは十分可能だと思います。これはユーザーからは完全に隠されます。

  4. Lua で遊んでみるのも役に立つと思いますが、まずは以前の提案を試してください。

関連情報