我在尝试配置 NGinx 时遇到了一个相当有趣的问题。我运行一个小型 Web 服务器,该服务器使用 NGinx 1.13.8 通过 HTTPS 提供所有服务。对于此类配置,它还会监听端口 80,并将所有请求重定向到具有相同 URI 的端口 443,使用以下配置片段来实现此目的:
location / {
return 301 https://$server_name$request_uri;
}
它本身已经很好地满足了我的需求。但是,我开始收到一些明显虚假且易于识别的流量(大约 5 分钟的随机时间段内,我收到来自看似随机的 IP 的一千个新连接,所有连接在 User-Agent 标头中都有一个公共前缀,所有连接都发出完全相同的请求 ( HEAD / HTTP/1.1
),所有连接都保持打开状态直到超时,并且所有连接都不会遵循重定向)。
理想情况下,我希望在识别这些连接后立即关闭它们,以尽量减少它们浪费的资源量。目前,我想出了这个修改后的配置片段来实现这一点:
location / {
return 301 https://$server_name$request_uri;
}
location = / {
if ($method = "HEAD") {
set $drop M;
}
if ($http_user_agent ~* "Dalvik/2.1.0 (Linux U ") {
set $drop "U${drop}";
}
if ($drop = "UM") {
return 444;
}
}
但是,这似乎不起作用(因为日志仍然显示这些流量峰值完全返回 301。我也尝试在第一个位置块内进行不太具体的匹配(仅在 User-Agent 标头或方法上进行全面匹配),但这似乎也不起作用。
因此,我有两个问题:
- 这为什么不起作用?
- 有没有更好的方法来处理这种流量,而不需要防火墙的深度数据包检查?