我的网络服务器目前被内容垃圾邮件发送者淹没。
我不想使用 iptables 完全阻止 IP,因为它们来自动态 IP,如果我阻止一个 IP,那么几分钟后垃圾邮件就会来自另一个 IP,所以我假设它使用受感染 PC 的僵尸网络,这些 PC 可能会重新连接,我不想最终完全阻止整个 ISP 或永久阻止 tor 出口节点。所以我想使用柔软的阻止类似于 cloud-flare 和 google 所做的。它们会为那些得分较低的 IP 显示一个网页,其中包含阻止它们的原因以及解除阻止的可能性。
我也有一个解决方案,但我想知道是否有更好的方法来解决这个问题。
我有一条捕获所有请求的规则,它会将请求传递给对 IP 进行评分的应用程序,如果 IP 的评分很差,则信息页面将显示 502 错误。如果 IP 没有问题,则返回 418,并将请求传递给@final-pass
location ~ {
error_page 500 418 = @final-pass;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header Host $host;
proxy_intercept_errors on;
proxy_pass http://unix:/tmp/ip-check.sock;
}
然后我@final-pass
将这个请求转发到第二个 nginx 实例,该实例具有所有虚拟主机的常规设置:
location @final-pass {
proxy_read_timeout 300;
proxy_connect_timeout 300;
proxy_redirect off;
proxy_buffering off;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_pass http://127.0.0.1:8080;
proxy_request_buffering off;
proxy_http_version 1.1;
}
有没有更好或正确的方法来解决这个问题?418
错误似乎有点难看。
编辑
有没有更好/正确的方法来实现,我可以先将请求传递给一个上游,如果该上游未处理该请求,则将其传递给另一个上游,而不会滥用错误418
?
编辑2 444
可能是一个更好的错误代码,但问题仍然是一样的,有没有比使用错误更好的方法来解决这种问题转发。