我在nginx上有一个运行cloudflare的网站,并希望阻止所有未通过cloudflare的请求.
通常,我会将nginx配置中的nginx IP列入白名单,并拒绝其他所有IP.
但是我正在运行ngx_http_realip_module,它将X-Forward-For地址(这是来自Visitor的实际Ip)设置为request-IP,因此请求被拒绝.
有没有一种方法可以使此白名单工作而无需停用ngx_http_realip_module?此外,此白名单应仅适用于对Nginx的请求,不适用于其他服务
提前致谢
解决方法:
我想出的唯一可以使用nginx完成的解决方案需要nginx 1.9.7或更高版本.
您可以使用ngx_http_geo_module识别和阻止不是cloudflare ip的任何ip的响应.
使用此地理位置块.
geo $realip_remote_addr $cloudflare_ip {
default 0;
103.21.244.0/22 1;
103.22.200.0/22 1;
103.31.4.0/22 1;
104.16.0.0/12 1;
108.162.192.0/18 1;
131.0.72.0/22 1;
141.101.64.0/18 1;
162.158.0.0/15 1;
172.64.0.0/13 1;
173.245.48.0/20 1;
188.114.96.0/20 1;
190.93.240.0/20 1;
197.234.240.0/22 1;
198.41.128.0/17 1;
199.27.128.0/21 1;
2400:cb00::/32 1;
2405:8100::/32 1;
2405:b500::/32 1;
2606:4700::/32 1;
2803:f800::/32 1;
2c0f:f248::/32 1;
2a06:98c0::/29 1;
}
然后,您可以将其添加到服务器块中.
if ($cloudflare_ip != 1) {
return 444;
}
对于所有不是来自$cloudflare_ip的连接,它将关闭连接.
之所以有效,是因为我在geo块中使用了$realip_remote_addr,当使用real_ip_header CF-Connecting-IP时,该块保留了原始客户端地址.