Nginx:阻止除一个IP地址外的所有URL访问(wp-admin/wp-login.php)

时间:2020-01-09 10:42:46  来源:igfitidea点击:

在nginx Web服务器中阻止WordPress URL(例如example.com/blog/wp-login.php和example.com/blog/wp-admin/)的最佳方法是什么?

但是,最近许多新闻媒体报道说,在多台主机上的WordPress用户上发生了相当大的暴力攻击。
攻击者使用用户名admin并尝试使用数千个密码,从而强行攻击WordPress管理门户(example.com/wp-admin/)。

Nginx阻止访问WordPress管理门户

编辑文件nginx.conf,执行:

# vi /etc/nginx/nginx.conf

在服务器上下文中追加以下所有内容并拒绝所有nginx config伪指令:

location ~ ^/(wp-admin|wp-login\.php) {
                allow 1.2.3.4;
                deny all;
  }

如果您的博客位于/blog /子目录中,请尝试:

location ~ ^/blog/(wp-admin|wp-login\.php) {
                allow 1.2.3.4;
                deny all;
  }

用您的实际静态IP地址替换1.2.3.4。
这是一个示例配置文件

upstream apachebackend  {
server 192.168.1.10:8080 weight=6;
server 192.168.1.11:8080 weight=5; 
server 192.168.1.12:8080 weight=5; 
server 192.168.1.13:8080 weight=5; 
#server 127.0.0.1:8080 weight=1; 
}
 
server {
      access_log  /var/log/nginx/access.log;
      error_log   /var/log/nginx/error.log;
      index       index.html;
      listen      75.126.153.206:80 default;
      root        /usr/share/nginx/html;
      server_name theitroad.local www.theitroad.local;
 
  ## PROXY - Web
      location / {
        proxy_pass  http://apachebackend;
        proxy_next_upstream error timeout invalid_header http_500 http_502 http_503;
        proxy_redirect off;
        proxy_buffering off;
 
        proxy_set_header        Host            $host;
        proxy_set_header        X-Real-IP       $remote_addr;
        proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
      }
      location ~ ^/(wp-admin|wp-login\.php) {
           allow 1.2.3.4;
           deny all;
           proxy_pass  http://apachebackend;
           proxy_next_upstream error timeout invalid_header http_500 http_502 http_503;
           proxy_set_header        Host            $host;
           proxy_set_header        X-Real-IP       $remote_addr;
           proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
      }
}

重新启动/重新加载Nginx Web服务器,执行:

# /etc/init.d/nginx reload

测试一下

访问您的博客URL,例如http://www.theitroad.local/cms/wp-login.php或者http://bash.theitroad.local/wp-admin/示例输出:
Nginx阻止WordPress Admin Portal

如何自定义403错误页面?

有关更多信息,请参见创建自定义静态HTTP 404或者HTTP 403错误页面。

其他建议

首先,在nginx上设置SSL证书。
编辑文件wp-config.php并追加以下指令:

define('FORCE_SSL_ADMIN', true);

保存并关闭文件。

FORCE_SSL_ADMIN选项强制WordPress保护登录名和管理区域的安全,从而使密码和cookie永远不会通过http干净地发送。
使用curl命令查看http标头,执行:

$ curl -I http://www.theitroad.local/cms/wp-admin/
HTTP/1.1 302 Found
Server: nginx
Date: Sun, 14 Apr 2013 09:01:44 GMT
Content-Type: text/html
Connection: keep-alive
Keep-Alive: timeout=60
Vary: Cookie
Expires: Wed, 11 Jan 1984 05:00:00 GMT
Cache-Control: no-cache, must-revalidate, max-age=0
Pragma: no-cache
Location: https://www.theitroad.local/cms/wp-admin/

我还建议您添加以下防火墙规则,以便您只能访问SSL部分:

## Open port 443 to you only ##
## Allow your home/office static IP 1.2.3.4 at port 443
/sbin/iptables -A INPUT -s 1.2.3.4  -m state --state NEW -p tcp --dport 443 --destination YOUR-Web-Server-SSL-IP-HERE -j ACCEPT
 
## Make sure  you DROP the rest of the world for 75.126.153.203 for TCP port 443 ###
##/sbin/iptables -A INPUT -s 0/0  -m state --state NEW -p tcp --dport 443 --destination YOUR-Web-Server-SSL-IP-HERE -j DROP