Ограничение частоты запросов с обратным прокси

Возник вопрос о том, какой заголовок используется для ограничения частоты запросов (rate limiting). Для контекста: у нас есть nginx.conf с директивой set_real_ip, и мы используем провайдера, который передаёт нам трафик с реальным 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 — это заголовок, который мы получаем от upstream с реальным IP пользователя.

В текущем файле discourse.conf в директории conf.d для nginx у нас стоит значение по умолчанию:

Для всех маршрутов в целом:

    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? Мне кажется, что он смотрит в X-Forwarded-For, потому что в production.log я вижу IP своего обратного прокси. Правильным решением будет ли изменить X-Forwarded-For так, чтобы он также использовал $remote_addr?

Судя по этой теме, кто-то просто удалил эту строку целиком: Last IP shows Reverse Proxy IP address - #5 by schleifer

Спасибо.

Вы добавили этот блок в свой app.yml? Эти настройки должны находиться в NGINX внутри контейнера. См. также Set up Discourse on a server with existing Apache sites. Это для Apache, но часть, которая добавляется в app.yml, одинакова независимо от того, какой сервер выполняет роль обратного прокси.

Эти секции сейчас находятся в nginx.conf, а не в нашем контейнере в conf.d/discourse.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-адреса.

Например, я думаю, что в логах production мы видим 111.11.11.111, но не 55.555.55.55, который нам нужен (так как он установлен в x-real-ip).

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-адреса или ограничение частоты запросов, вы можете обновить шаблон ограничения частоты запросов.