网站搜索

如何在 Nginx/WordPress 登录页面中阻止 IP


这是一个循序渐进的初学者指南,展示了如何配置 Nginx 以阻止某些 IP 或 IP 范围访问您的网站,并阻止所有其他 IP,而只有您(和指定的 IP)可以访问 wordpress 登录页面。

这个网站几天前遭到了攻击。有人不断发出数万个请求,这减慢了服务器响应的速度。而且,这是我手动阻止攻击者的 IP 并限制对登录页面的访问所做的。

注意:对于大量 DDoS 攻击,建议使用第三方工具/服务,例如 fail2ban 或 CloudFlare,通过自动禁止 IP 来缓解。

第 1 步:找出攻击者的 IP

1. 首先,连接到您的 Linux 服务器并运行命令编辑 Nginx 配置文件:

sudo nano /etc/nginx/nginx.conf

然后,确保它包含访问日志的 access_log /var/log/nginx/access.log; 行。

2. 如果未启用访问日志,则需要手动添加该行并保存文件(按 Ctrl+S,然后按 Ctrl+X)。

并且,通过执行配置检查并重新启动服务来应用更改:

sudo nginx -t
sudo systemctl restart nginx.service

3. 无需浏览日志文件并手动计算 IP 访问次数,您可以在 server 中运行以下命令:

sudo awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -nr |more

此命令将查找日志文件 (/var/log/nginx/access.log) 并打印前 IP 并计算它们发送的请求数。

注意:如果您为您的网站使用 CloudFlare CDN,则默认情况下 Nginx 不会显示访问者的真实 IP。

在这种情况下,您需要在 server 中运行以下命令来为 Nginx 创建一个配置文件:

sudo nano /etc/nginx/conf.d/nginx-cloudflare-realip.conf

然后,添加以下几行来告诉 to 显示来自 CloudFlare 的访问的真实 IP:

set_real_ip_from 173.245.48.0/20;
set_real_ip_from 103.21.244.0/22;
set_real_ip_from 103.22.200.0/22;
set_real_ip_from 103.31.4.0/22;
set_real_ip_from 141.101.64.0/18;
set_real_ip_from 108.162.192.0/18;
set_real_ip_from 190.93.240.0/20;
set_real_ip_from 188.114.96.0/20;
set_real_ip_from 197.234.240.0/22;
set_real_ip_from 198.41.128.0/17;
set_real_ip_from 162.158.0.0/15;
set_real_ip_from 104.16.0.0/13;
set_real_ip_from 104.24.0.0/14;
set_real_ip_from 172.64.0.0/13;
set_real_ip_from 172.70.0.0/16;
set_real_ip_from 131.0.72.0/22;
set_real_ip_from 2400:cb00::/32;
set_real_ip_from 2606:4700::/32;
set_real_ip_from 2803:f800::/32;
set_real_ip_from 2405:b500::/32;
set_real_ip_from 2405:8100::/32;
set_real_ip_from 2a06:98c0::/29;
set_real_ip_from 2c0f:f248::/32;
#real_ip_header CF-Connecting-IP;
real_ip_header X-Forwarded-For;

然后,按 Ctrl+S 保存文件,按 Ctrl+X 退出。最后,运行上述 2 个命令以检查配置并重新启动服务。

注 1:Cloudflare 将来可能会添加/删除 IP!请参阅此页面了解最新信息。
注意2:此配置需要ngx_http_realip_module模型,该模型在Ubuntu和Debian中默认启用。

第 2 步:在 Nginx 中阻止 IP 或 IP 范围

找到攻击者的 IP 地址后,运行以下命令创建一个配置文件:

sudo nano /etc/nginx/conf.d/block.conf

然后,在下面添加类似的行,告诉阻止此主机中所有 NGINX Web 服务器的某些 IP 和 IP 范围(将下面的 IP 地址替换为您在上一步中获得的 IP 地址):

deny 206.189.129.37;
deny 143.110.180.216;
deny 167.172.87.180;
deny 167.99.77.92;
deny 152.42.178.38;
deny 2600:3c03::f03c:91ff:fe69:a353;
deny 139.59.108.0/24;
deny 128.199.0.0/16;

此处 deny 139.59.108.0/24; 表示阻止从“139.59.108.0”到“139.59.108.255”的 IP 范围。并且,128.199.0.0/16;表示 IP 范围从“128.199.0.0”到“128.199.255.255”。您可以根据所需的 IP 范围相应地替换它们。

作为选择,您可以使用以下规则来仅允许 IP 1.2.3.4 和 2.3.4.5(相应地替换),但阻止所有其他 IP。

allow 1.2.3.4;
allow 2.3.4.5;
deny all;

编辑完文件后,按 Ctrl+S 保存,按 Ctrl+X 退出。最后,检查配置并重新启动服务以应用更改:

sudo nginx -t
sudo systemctl restart nginx.service

第 3 步:限制对 WordPress 登录页面的访问 (wp-admin, wp-login.php)

对于 wordpress 网站,阻止所有人访问 wp-admin/wp-login.php 页面是一个不错的选择,只有您和来自指定 IP 地址的用户能够访问。

1. 首先,连接到 Linux 服务器并运行命令来编辑您网站的 Nginx 配置文件:

sudo nano /etc/nginx/sites-available/wordpress

在 command 中,您需要将文件名 wordpress 替换为您的文件名。使用 ls /etc/nginx/sites-available 列出该目录中的所有文件。

2. 当文件打开时,向下滚动并添加 “location=/wp-login.php{}” 块,其规则如下:

location = /wp-login.php {
    allow 1.2.3.4;
    allow 2.3.4.5;
    deny all;
}

这里将 1.2.3.4 和 2.3.4.5 替换为您希望允许他们访问登录页面的 IP。并且,您可以添加更多或删除允许行来添加/删除 IP。

注意: “location=/wp-login.php {}” 和 “location ~ /.php${}” (表示任何以 '.php' 结尾的结尾)块都与 wordpress 登录页面 URL (wp-login.php) 匹配,但前者具有更高的优先级。

这意味着访问wp-login.php页面时,location ~ /.php$ 下的规则将被忽略!在这种情况下,它可能会尝试下载文件而不是呈现网页。

要解决此问题,您还需要在 “location ~ /.php${}” 下添加规则,使其如下所示:

location = /wp-login.php {
    include snippets/fastcgi-php.conf;
    fastcgi_pass unix:/run/php/php8.4-fpm.sock;
    allow 1.2.3.4;
    allow 2.3.4.5;
    deny all;
}

注意:您需要根据 “location ~\.php${}” 块下的规则替换 include snippets/fastcgi-php.conf; 和 fastcgi_pass unix:/run/php/php8.4-fpm.sock;

完成后。保存文件(按 Ctrl+S,然后按 Ctrl+X),检查配置并重新启动服务以应用更改。

sudo nginx -t
sudo systemctl restart nginx.service

提示: 更改位置块后,您可能需要清除浏览器缓存,然后验证它是否有效。

有关 Nginx 位置块的更多信息

Nginx 配置有不同类型的位置块。他们包括:

  • location /abc - 前缀匹配、example.com/abc、example.com/abcde、example.com/abc/123 example.com/abc?123。
  • 位置=/abc、完全匹配、example.com/abc、example.com/abc?123,但不适用于 example.com/abcde、example.com/abc/。
  • 位置 ~ ^/abc$,正则表达式匹配 example.com/abc、example.com/abc?123,但 example.com/abcde、example.com/abc/ 不匹配。
  • 位置 ~* ^/abc$,类似于位置 ~ ^/abc$,但不区分大小写。它还匹配 example.com/ABC。
  • 位置 ^~ /abc,类似于位置 /abc,但优先级更高,并且没有正则表达式。

优先级从高到低: 位置 = > 位置 ^~ > 位置 ~=位置 ~* >位置 /。

相关文章