nginx: Блокировка определенного PHP-файла из большинства стран

nginx: Блокировка определенного PHP-файла из большинства стран

Предыстория: Я управляю несколькими сайтами 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, но не оба.

Так что если яудалятьстрока, отмеченная #1then, выглядит хорошо: в Швейцарии я могу получить доступ 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;

Связанный контент