我目前收到了大量针对 /wpad.dat 的请求 - 看上去像是一次攻击。
现在,我想要做的是触发每个请求 /wpad.dat 的 IP 的 iptables,然后将其添加到黑名单。有办法吗?这意味着 IP 将能够发送一个洪水请求,然后不再发送任何请求。
有什么巧妙的方法可以有效地做到这一点吗?
答案1
您可能考虑过其他方法来阻止 IP 地址。例如,Fail2ban旨在扫描日志文件中的给定模式并暂时阻止 IP。
正如评论中提到的,您可能会将数千个 IP 添加到黑名单中。虽然iptables
有效,但每增加一条规则都会增加每个请求的处理时间。您可以使用ipset
另一种方法,当添加许多 IP 时,这种方法似乎要快得多。它采用哈希方法来加快匹配速度。请参阅使用 ipset 批量阻止 IP 地址iptables
了解详情以及和的比较ipset
。
如果您想使用iptables
,这可能取决于您的网络服务器的设置方式。假设您使用 apache 或 nginx,您可以将其设置为在wpad.dat
请求时触发某种 cgi 脚本运行。
例如,如果您的网站已经使用 php,您可以使用内部重写来触发 php 脚本(或 ruby/python/java,取决于您通常使用的语言)。
脚本运行后,只需在命令行上运行如下命令:
iptables -I INPUT -s {IP-HERE} -j DROP
该脚本需要以 root 身份执行,而赋予 Web 用户 root 权限可能不是一个好主意,因此您可以将其打包为 shell 脚本,chown
以 root 身份执行,然后setuid
在其上使用。
重大警告:如果您访问该资源,您可能会意外阻止自己,因此您可能需要设置--dport
为端口 80 或类似的端口。这至少可以避免阻止您的 ssh 协议,因此如果您设法阻止自己,您可以 ssh 进入您的服务器并解除阻止。
到期:由于永久阻止多个 IP 地址通常不是一个好主意,因此您可能需要跟踪被阻止的 IP 地址(可能将其附加到日志文件中),并创建一个 cron 作业来定期删除这些 IP 地址。您只需运行类似以下程序:
iptables -D INPUT -s 192.168.1.100 -j DROP
答案2
使用 iptables 自动阻止并不是一件简单的事情,但是你可以通过添加此规则来限制连接,这样它就不会占用你的所有资源:
iptables -A INPUT -p tcp --dport 80 -m state --state NEW -m limit --limit 50/minute --limit-burst 200 -j ACCEPT