Предыстория: у меня есть несколько сайтов WordPress, и я замечаю огромное количество попыток входа в систему методом грубой силы. fail2ban мне здесь не помогает, потому что злоумышленник осторожно пытается выполнить до 5 входов на каждый IP-адрес, а затем переключается на другой.
Моя проблема не в том, что я беспокоюсь о том, что пароли угадываются правильно. Меня беспокоит только огромная нагрузка, которую это вызывает на сервере.
Моя идея проста: я живу в Швейцарии и некоторые (не все) сайты будут входить в систему только из Швейцарии, поэтому я хотел бы заблокировать попытки входа из других стран на эти сайты. Звучит просто? Ну, nginx не хочет со мной соглашаться.
У меня есть следующий фрагмент, настроенный как snippets/php.conf
:
index index.html index.htm index.php;
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php7.0-fpm.sock;
fastcgi_read_timeout 300;
}
Я включаю этот фрагмент из большинства файлов в /etc/nginx/sites-enabled
. Я включил и настроил модуль nginx geoip, и, похоже, он работает нормально (конфигурация здесь не показана). Многие конфиги сайтов выглядят так:
server {
listen 80;
server_name mydomain.com;
location / {
# common WordPress config
try_files $uri $uri/ /index.php;
}
location ^~ /wp-login.php {
# CH is the country code for Switzerland
if ($geoip_country_code != CH) {
return 444;
}
include snippets/php.conf; # <-- #1
}
root /var/www/mydomain.com;
include snippets/php.conf;
}
Я везде читал, что nginx всегда соответствует один блок местоположения, потому что именно так он работает. Таким образом, он может соответствовать только блоку местоположения для wp-login.php
или сопоставьте блок для .php
, но не то и другое одновременно.
Так что если я удалять линия, отмеченная #1
тогда все в порядке: в Швейцарии я могу получить доступ wp-login.php
и за пределами Швейцарии я не могу получить к нему доступ. Большой! Однако когда я могу получить к нему доступ, он просто загружает wp-login.php
файл вместо его выполнения. Это кажется ожидаемым, поскольку блок местоположения для выполнения .php
не совпал, и поэтому материал fastcgi не работает.
Это заставляет меня думать, что мне действительно нужно добавить строку, отмеченную #1
. Но если я это сделаю, то внезапно я могу получить доступ к wp-login.php
со всех IP-адресов, независимо от того, из какой они страны.
Что я делаю не так? Я нашел массу статей о том, как настроить PHP с помощью nginx, а также массу статей о том, как заблокировать определенные страны. Но ни один из них не работает одновременно.
РЕДАКТИРОВАТЬ:
Вот содержание snippets/fastcgi-php.conf
в случае, если это имеет значение, я считаю, что он пришел из установки nginx по умолчанию на Debian Stretch:
# regex to split $uri to $fastcgi_script_name and $fastcgi_path
fastcgi_split_path_info ^(.+\.php)(/.+)$;
# Check that the PHP script exists before passing it
try_files $fastcgi_script_name =404;
# Bypass the fact that try_files resets $fastcgi_path_info
# see: http://trac.nginx.org/nginx/ticket/321
set $path_info $fastcgi_path_info;
fastcgi_param PATH_INFO $path_info;
fastcgi_index index.php;
include fastcgi.conf;