nginx:阻止来自大多数国家的特定 PHP 文件

nginx:阻止来自大多数国家的特定 PHP 文件

背景:我运行了几个 WordPress 网站,我注意到大量分布式暴力登录尝试。fail2ban 在这里对我没有帮助,因为攻击者小心翼翼地每个 IP 最多尝试 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。但是如果我这样做,那么突然我就可以从所有 IP 访问 ,wp-login.php无论他们来自哪个国家。

我做错了什么?我找到了很多关于如何使用 nginx 设置 PHP 的文章,也找到了很多关于如何屏蔽某些国家的文章。但没有一篇能同时做到这两点。

编辑:

snippets/fastcgi-php.conf以下是重要内容,我相信其中一个来自 Debian Stretch 上的 nginx 默认安装:

# 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;

相关内容