Nginx 位置阻止访问列表和“X-Forwarded-For”

Dav*_*rne 2 php wordpress nginx x-forwarded-for

我在负载平衡的 Nginx 集群上有一些 WordPress 站点。我希望阻止对这些的 /wp-admin 和 /wp-login.php 的访问。客户端不愿意使用诸如Wordfence之类的插件来实现这一点(可以理解)。

负载均衡器在 X-Forwarded-For 中转发真实的客户端 IP,这存在于 Nginx 中,因为我目前在主日志格式中使用"$http_x_forwarded_for"

这是我当前的位置块:

   location ~ ^/(wp-admin|wp-login.php) {

     real_ip_header X-Forwarded-For;

     try_files $uri $uri/ /index.php?$args;
     index index.html index.htm index.php;

     root           /var/www/vhosts/domain.com/html;
     fastcgi_pass   127.0.0.1:9000;
     fastcgi_index  index.php;
     fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
     include        fastcgi_params;

     allow 1.1.1.1;
     allow 2.2.2.2;
     allow 3.3.3.3;
     #allow 10.10.85.0/24;
     deny all;
   }
Run Code Online (Sandbox Code Playgroud)

如您所见,我使用“real_ip_header X-Forwarded-For;” 声明真实的ip应该是什么。但这是行不通的。完成上述操作后,所有发送到该处的请求都会被阻止。如果我取消注释专用10.10.85.0/24子网(这是从负载均衡器传递流量的专用网络),则向每个人授予对这些位置的访问权限。

我确实在 Nginx 中编译了 realip 模块,如下所示:

[root@STR-MAI-ORDS1 conf.d]# 2>&1 nginx -V | tr -- - '\n' | grep http_realip_module
http_realip_module
[root@STR-MAI-ORDS1 conf.d]#
Run Code Online (Sandbox Code Playgroud)

在我的日志文件中,我可以看到通过使用 X-Forwarded-For 打印到日志中的真实公共 IP,但对于此位置块 realip 却不起作用,我不确定为什么。

如果重要的话,环境看起来像这样:

  • pfSense FW(2 节点 HA)
  • Zevenet 负载均衡器(2 节点 HA)
  • CentOS 6.x Web 服务器(3 节点集群)

网络堆栈是:

  • Nginx v1.12.0
  • PHP-FPM v7.0.20 (fastcgi)

任何关于我做错了什么的建议都会很棒。谢谢。

Dav*_*rne 7

事实证明,Nginx 中的“set_real_ip_from”不是可选的...即使我正确地将“real_ip_header”设置为“X-Forwarded-For”形成 LoadBalancers,Nginx 完全拒绝这样做,因为它不这样做(默认情况下)信任LB作为可以设置真实IP的源。

修复方法是在我的位置块中包含以下内容:

set_real_ip_from 10.10.85.0/24;
real_ip_header X-Forwarded-For;
Run Code Online (Sandbox Code Playgroud)

然后 Nginx 信任 LB(位于该子网内)并将真实 IP 设置为其。