我最近更新了面向公众的 NGINX 实例的设置,以添加对 http2 的支持。在之后查看日志以了解它的使用频率时,我发现与托管站点无关的新日志条目迅速增加。
首先是一堆发出CONNECT
请求的条目,由于 NGINX 实例未配置为转发代理,这些都失败并出现 400 错误。我已经设置了 fail2ban 规则来丢弃来自许多源 IP 地址的流量。我对此并不特别担心(如果需要,请添加评论)。
下一组条目是GET
请求,但没有路径,它们有完整的 URL 作为目标,例如
222.223.121.231 - - [16/Jul/2020:12:57:37 +0100] "GET http://api.gxout.com/proxy/check.aspx HTTP/1.1" 404 199 "http://api.gxout.com/proxy/check.aspx" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)"
其中大多数都按预期再次收到 404 响应,并且我添加了另一个 fail2ban 规则来丢弃来自源 IP 地址的数据包(同样并没有真正关心这些)。
还有一些类似的得到了 200 个回复,这些是我担心的,例如
35.236.60.202 - - [16/Jul/2020:11:52:28 +0100] "GET http://www.nike.com/ HTTP/1.1" 200 396 "-" "python-requests/2.20.0"
我有以下问题:
- 为什么 NGINX 会为此请求返回 200?
- 有关如何调试的建议?
所有传入流量都应该是 https(必需或 http2),并且我被固定在 TLS 1.2 或 1.3,所以我认为使用 tcpdump 捕获流量不会有帮助(我假设我无法提供私钥进入wireshark并解码数据包?)。
我能想到的唯一其他选择是向 NGINX 添加一些自定义日志记录(是否可以在 nginx 访问日志中记录响应数据?)以记录整个请求/响应。我过去这样做是为了调试 oAuth2.0 令牌交换问题,但仅限于我可以完全控制所有传入流量的系统上。
我认为没有必要进一步调试,因为有些事情是显而易见的:
python-requests/2.20.0
as User-Agent 表示一些 Python 脚本。流行的requests
Python 库使编写简单的机器人变得非常容易,无论好坏。如果您在 NGINX 中有一个允许响应任何标头的默认服务器,则将 200 返回到未知主机名可能是非常典型的
Host:
。请原谅我的措辞,但默认情况下,NGINX 中的默认服务器将响应任何
Host:
. 然后,200
返回 a 所需的是您的应用程序不检查域名并且不为您网站的规范域名发出重定向。与典型情况一样,“您知道您托管哪些域”,任何具有外来域名(或没有)的请求都可以被视为恶意/不需要的。
您可能想查看“域不是您的”此类请求的蜜罐阻止方法
Host:
- 大多数恶意/不良机器人实际上只会提供裸 IP 作为标头的值,只是因为它们懒惰检查哪些域位于给定 IP 上(请注意,他们只需通过枚举网络/IP 地址即可找到受害者)。至于带有完整 URL 而不是 URI 的请求,这可以是任何东西,包括写得不好的机器人、代理检查器等。
如果您有很多这样的请求,并且在您的后端生成 404,我建议您使用简单的规则直接在配置中拒绝此操作,并可能添加一个即时块,而不是使用 Fail2ban。