Список доступа к местоположению 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 и для подсети.