Список доступа к местоположению Nginx и "X-Forwarded-For"

У меня есть несколько WordPress сайтов на кластере с балансировкой нагрузки Nginx. Я хочу заблокировать доступ к / wp-admin и /wp-login.php на этих. Клиент не желает использовать плагин, такой как Wordfence, для достижения этого (понятно).

Балансировщики нагрузки перенаправляют реальный IP-адрес клиента в X-Forwarded-For, и это присутствует в Nginx, так как в настоящее время я использую его в своем основном формате журнала с "$ http_x_forwarded_for".

Это мой текущий блок местоположения:

   location ~ ^/(wp-admin|wp-login.php) {

     real_ip_header X-Forwarded-For;

     try_files $uri $uri/ /index.php?$args;
     index index.html index.htm index.php;

     root           /var/www/vhosts/domain.com/html;
     fastcgi_pass   127.0.0.1:9000;
     fastcgi_index  index.php;
     fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
     include        fastcgi_params;

     allow 1.1.1.1;
     allow 2.2.2.2;
     allow 3.3.3.3;
     #allow 10.10.85.0/24;
     deny all;
   }

Как видите, я использую "real_ip_header X-Forwarded-For;" объявить, каким должен быть настоящий ip. Но это не работает. С учетом вышесказанного ВСЕ запросы к нему блокируются. Если я раскомментирую частную подсеть 10.10.85.0/24 (которая является частной сетью, трафик которой доставляется ОТ балансировщиков нагрузки), то доступ к расположениям предоставляется для ВСЕХ.

У меня действительно есть модуль realip, скомпилированный в Nginx, как можно увидеть здесь:

[root@STR-MAI-ORDS1 conf.d]# 2>&1 nginx -V | tr -- - '\n' | grep http_realip_module
http_realip_module
[root@STR-MAI-ORDS1 conf.d]#

В моих файлах журнала я вижу реальный общедоступный IP-адрес, который печатается для входа в систему с использованием X-Forwarded-For, но то же самое не работает для этого realip блока местоположения, и я не уверен, почему.

Если это имеет значение, среда выглядит следующим образом:

  • pfSense FW (2 узла HA)
  • Балансировщик нагрузки Zevenet (2 узла HA)
  • Веб-сервер CentOS 6.x (кластер из 3 узлов)

Веб-стек:

  • Nginx v1.12.0
  • PHP-FPM v7.0.20 (fastcgi)

Любой совет о том, что я делаю неправильно, был бы великолепен. Благодарю.

2 ответа

Оказывается, "set_real_ip_from" в Nginx не является обязательным... Даже если я правильно установил "real_ip_header" на "X-Forwarded-For из LoadBalancers", Nginx полностью отказался сделать это, потому что этого не происходит (по умолчанию) доверять LB как источнику, который может установить реальный IP.

Исправление должно было включать следующее в моем блоке местоположения:

set_real_ip_from 10.10.85.0/24;
real_ip_header X-Forwarded-For;

Затем Nginx доверяет LB (который находится в этой подсети) и устанавливает для него реальный ip.

Вы можете создать файл конфигурации для нескольких блокировок, как показано ниже.

изменить файл конфигурации ngnix

vi /usr/local/nginx/conf/nginx.conf

включить новый файл конфигурации для блокировки IP-адресов внутри nginx.conf

include blockips.conf;

сохраните файл конфигурации ngnix и создайте новый файл

vi blockips.conf

добавьте свои черные IP-адреса

deny 1.2.3.4;

или блокировка подсети

deny 91.212.45.0/24;

Для получения дополнительной информации см. Блокирующий IP nginx и для подсети.

Другие вопросы по тегам