リバースプロキシでのレート制限

レート制限に使用されているヘッダーについて質問があります。コンテキストとして、set_real_ip を含む nginx.conf を使用しており、クライアントの実際のIPを Some-Client-IP ヘッダーで送信するプロバイダーを使用しています。

  sendfile on;
set_real_ip_from ...;
set_real_ip_from ...;
set_real_ip_from ...;
set_real_ip_from ...;

real_ip_header Some-Client-IP;
real_ip_recursive on;

Some-Client-IP は、実際のユーザーのIPを持つアップストリームから取得するものです。

Nginx の conf.d 内の現在の discourse.conf では、デフォルトで以下のようになっています。

おそらくすべてのルートに共通です。

    proxy_set_header Host $http_host;
    proxy_set_header X-Request-Start "t=${msec}";
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $thescheme;
    proxy_pass http://discourse;

Discourse はレート制限のために X-Forwarded-For または X-Real-IP のどちらを参照していますか? production.log でリバースプロキシのIPが表示されるため、X-Forwarded-For を参照していると思われます。正しい解決策は、X-Forwarded-For$remote_addr を参照するように変更することでしょうか?

このスレッドでは、誰かがその行を完全に削除したようです Last IP shows Reverse Proxy IP address - #5 by schleifer

よろしくお願いします。

「いいね!」 1

そのスタンザを app.yml に追加しましたか?これらの設定は、コンテナ内の NGINX に配置する必要があります。Set up Discourse on a server with existing Apache sites も参照してください。これは Apache 用ですが、app.yml に記述する部分は、リバースプロキシを実行しているものが何であれ同じです。

これらのスタンザは、conf.d/discourse.conf 内のコンテナにある現在の nginx.conf にあります。

app.yml の部分については、以下を意味しましたか?

run:
  - replace:
      filename: /etc/nginx/conf.d/discourse.conf
      from: "types {"
      to: |
        set_real_ip_from 172.17.0.0/24;
        real_ip_header X-Forwarded-For;
        real_ip_recursive on;
        types {

コンテナの外部に HAProxy はありません。DNS プロバイダーが事前に処理を行うため、real_ip_header は別のヘッダー値にあり、実際には置換が必要な IP アドレスのリストがあります。

X-Forwarded-For のリストも確認しました。これが間違った IP が表示される原因ではないかと疑問に思っています。

たとえば、本番ログには 111.11.11.111 が表示されますが、(x-real-ip に設定されている) 55.555.55.55 は表示されません。

HTTP_X_FORWARDED_FOR	111.11.11.111, 22.22.22.222, 333.33.33.333, 55.555.55.55
HTTP_X_REAL_IP	55.555.55.55

その場合は、推奨される設定をそれに応じて調整する必要があります。

または、IPアドレスやレート制限を気にしない場合は、レート制限テンプレートにリマインダーを設定できます。

「いいね!」 1