在过去一天左右的时间里,其中一个实例消耗了大量带宽。这意味着我们几乎超出了限额(入站和出站量大致相同)。
查看日志,我唯一能看到的是 nginx access.log 中有大量带有相同文本字符串的 400 172 错误。
我已经将 nginx 更改为不同的端口,并实施了 fail2ban,但由于流量来自不同的 IP,因此这不起作用。我还让我们的 VPS 提供商更改了我们的 VPS 的 IP。
Fail2ban 目前正在断开与端口 80 的所有连接,这并不理想,因为我们想使用这个端口。
我们可以做些什么来改善这种情况?如果我们丢弃可疑流量,这是否仍会计入我们的配额?
更多信息
我设法通过更改 nginx 错误日志级别来获取更多详细信息。
似乎发生的唯一错误是客户端在读取客户端请求行时发送了无效请求。
该域名是新的并且之前没有被使用过(它是长期存在的域名之一上的全新子域名)。
我将检查它是否使用相同的路径。
另外,其出站流量增加的原因是否仅仅是因为入站数据包被阻止了?
答案1
一般而言,到达您或到达网关的任何流量(从您的主机出站时)都会计入您的带宽限额。即使活动微不足道或仅由主机防火墙阻止的流量组成,也是如此。
尽快丢弃恶意流量是理想的做法。但是,听起来你可能遇到了一个问题,涉及一个带宽大但传输配额小的托管计划 - 如果是这样的话,你正在遇到此类计划的根本问题。
您接下来要做什么取决于流量情况。如果只有少数主机,请考虑使用 VPS 提供商的防火墙阻止这些主机(如果他们提供此选项)。如果是搜索引擎机器人,请添加 robots.txt 禁止它们抓取生成错误的任何路径。
172
在您的日志中不是错误代码的一部分 - 这些行仅意味着您的服务器返回了错误代码400 Bad Request
,并且它发回的错误页面长度为 172 个字节。
由于是 400 错误,因此很可能不是搜索引擎(除非您正在运行奇怪的 CGI 应用程序),但如果不知道查询字符串(包括方法)是什么,就很难说清楚发生了什么。但是,请尝试根据“攻击者”试图执行的操作来解决问题。
阻止 nginx 中的请求不太可能带来太大的改变。
相反,您可以考虑在网络层通过丢弃违规流量来阻止这些请求;这意味着流量的发起者最终会得到一堆开放的连接。如果速度没有变化,那么很有可能是恶意的。如果所有流量都来自同一个网络,而且看起来像是洪水而不是试图做某事的自动化过程,您可以考虑向发起 ISP 发送滥用投诉。这可能很简单,因为其他人在您之前已经拥有了您的域名。
答案2
在不了解您的托管服务提供商的情况下,我无法就被拒绝的请求是否计入您的允许范围给出明确的答案,但一般来说,如果它到达您的服务器实例,它通常会被计算在内。
在这种情况下,绝对建议使用 fail2ban。确保丢弃传入数据包而不是拒绝它们,这意味着您不应该看到以“连接被拒绝”ICMP 数据包形式出现的传出流量增加。
传入请求中是否存在任何模式?它们是否全部来自特定 CIDR 块,还是针对特定 URL 的请求?这个 URL 是网站上的合法内容还是随机字符串?
如果每次都是相同的 URL,我建议在 Nginx 中阻止这些请求(如果您还没有这样做的话)。
如果它是一个相当小的特定源 CIDR 块,您可以全面删除来自这些地址的所有连接。
听起来你正在遭受 DDoS 攻击。这篇 Server Fault 文章提供了很好的建议:我遭受了 DDoS 攻击。我该怎么办?