我们使用的是 cloudflare 代理,因此真实 IP 被隐藏了。但是如果您知道真实 IP,您仍然可以使用它访问网站。有没有办法限制该 IP 的访问?
我是说:
by domain: https://some-domain.com -> OK
by proxy IP: https://1.2.3.4 -> OK
by real IP: https://5.6.7.8 -> to restrict.
或者说试图限制它是毫无意义的?
nginx.conf 服务器块的示例:
server {
listen 80 default_server;
server_name some-domain.com;
return 301 https://$host$request_uri;
}
charset utf-8;
server {
server_name some-domain.com;
listen 443 ssl http2;
...
...
}
您在这里混淆了两种不同的东西。第一种是限制未
Host
在请求中设置正确标头的客户端的访问(这些客户端通常是机器人、网络扫描仪等)。要实现这一点,您需要某种类型的全能服务器块来拒绝此类请求。请参阅此StackOverflow 答案以获取示例。第二种方法是限制具有正确
Host
标头但来自 Cloudflare 边缘服务器以外的来源的请求。这通常是一种很好的做法,因为 Cloudflare 可作为您网站的反 DDoS(也可能是 WAF)服务。官方 Cloudflare IP 范围列表可在其网站上找到:IP 范围,或以纯文本形式提供IPv4和IPv6网址。您可以使用此列表拒绝此类请求,ngx_http_geo_module
如下所示:IP 范围列表会定期更新,因此我使用以下脚本自动生成范围列表:
然后,您可以按照如下方式将此列表包含在您的 nginx 配置中:
您还可以使用 IP 范围列表来恢复原始访问者 IP(有关详细信息,请参阅Cloudflare 官方文章“恢复原始访问者 IP”)。实际上,目前我使用另一个脚本来自动生成两个文件:
您可以按如下方式使用第二个文件:
在某些情况下,这种设置是必要的(这是我曾经遇到的一个问题)。