安全反向代理 Apache 服务器仍然在访问日志中获取对其他域的请求

安全反向代理 Apache 服务器仍然在访问日志中获取对其他域的请求

我一直在尝试将 apache(端口 80)设置为 nodejs 服务器(端口 3000)的反向代理,但我犯了一个错误,即使用 启动了我的 apache 服务器ProxyRequests On。在数十万个垃圾代理请求使 access.log 文件膨胀并且我的小型 8GB 开发服务器因磁盘空间不足而崩溃后,我发现了这个错误。现在,我正在尝试找出保护虚拟主机的正确方法。

我的虚拟主机配置将所有请求从端口 80 路由到 3000(我的 nodejs 服务器)

<VirtualHost *:80>
    ServerName www.example.com
    ServerAlias example.com

    DocumentRoot /var/www/path-to-my-site

    ProxyRequests Off
    ProxyPass / http://127.0.0.1:3000/
    ProxyPassReverse / http://127.0.0.1:3000/
    ProxyTimeout 60
</VirtualHost>

我认为此配置应该有效,但我不知道如何验证它。我启动了 Apache,但仍然收到类似这样的请求(这些都不是我的域)。

208.115.232.246 - - [04/May/2020:11:06:03 -0400] "CONNECT bcqapi.muuky.cc:8043 HTTP/1.1" 502 383
208.115.232.246 - - [04/May/2020:13:29:27 -0400] "GET http://finalcheat.pw/ HTTP/1.1" 200 9368 
91.199.118.175 - - [04/May/2020:11:06:04 -0400] "GET http://205.198.7.143/ HTTP/1.1" 200 9368 
91.199.118.175 - - [04/May/2020:11:06:04 -0400] "GET http://205.198.7.143/ HTTP/1.1" 200 9368 
91.199.118.175 - - [04/May/2020:11:06:04 -0400] "GET http://205.198.7.143/ HTTP/1.1" 404 1089
208.115.232.250 - - [04/May/2020:11:06:13 -0400] "CONNECT www.hg77733.net:443 HTTP/1.1" 502 383
208.115.232.206 - - [04/May/2020:12:26:24 -0400] "GET http://www.7mx1.com/user/signup/ HTTP/1.1" 403 214

我预计服务器会向这些请求发出 502 和 403 错误,但 200 和 404 错误让我担心。这是否意味着这些请求已被服务器接受,而我的服务器仍然不安全?如果是这样,我该如何阻止来自其他域的请求?

如果我的配置是安全的,有没有办法可以完全阻止记录这些请求,以免耗尽磁盘空间?

答案1

您混淆了两个概念 - 代理请求和带有随机或伪造主机名的普通请求。 只需稍加解释即可回答您的问题。

普通的 HTTP 请求具有“Host:”标头,该标头始终会填充某些内容。如果您的浏览器想要查看 example1.com - 它会解析其地址并使用带有“Host: example1.com”标头的 HTTP 请求连接到此地址。此服务器可以同时托管 example1.com 和 example2.com,因此 Apache 随时都知道真正请求的是哪个域并采取不同的行为。这与代理无关,这只是 HTTP 的工作方式,并且没有限制将任何内容放入 Host 标头中。重点是,在这种情况下,Web 服务器旨在自行处理此请求。

代理 HTTP 请求是指客户端连接到服务器并使用代理标头,假设服务器用于代理,而不是用于网页服务。不过,这次服务器的主要目的是将请求转发给其他人。

ProxyPass 和 ProxyPassReverse 是两者的混合体。当 Web 服务器打算自己处理请求,但将此请求转发给其他人时,它被称为透明代理,这就是您现在使用它的方式。在这种情况下,请求不是代理类型,但服务器的行为像代理。重点是,服务器作为代理的行为不是因为请求,而是因为管理员提供的配置,而且客户端不知道此请求是代理的。

根据经验,我可以说这些请求与您的 ProxyRequests错误没有任何关系。任何可能的公共IP地址都会受到来自世界各地的任何可能漏洞的测试。只有CONNECT记录可以被视为有人仍然认为您有开放的代理服务器。

因此,回答你的问题:

  1. 为什么您仍然没有对所有请求都回答 404 或 502?因为没有人检查 Host 标头。Nodejs(很可能)不关心请求了哪个 Host,并且您的 Apache 配置将所有请求放在一个虚拟主机中,也不检查它。如果您将响应限制为要服务的真实名称,效果会更好:
ProxyRequests Off
<VirtualHost *:80>

    # Dumb landing site

    DocumentRoot /var/www/landing # This directory should contain small index.html with "Domain not configured"

</VirtualHost>
<VirtualHost *:80>

    # Real site answering only on my.server.net

    DocumentRoot /var/www/path-to-my-site
    ServerName my.server.net
    ServerAlias www.my.server.net
    ProxyPass / http://127.0.0.1:3000/
    ProxyPassReverse / http://127.0.0.1:3000/
    ProxyTimeout 60

</VirtualHost>

为确保万无一失,尝试通过 IP 调用任何公共服务 - 最有可能的是,您将收到“域未配置”错误简单页面。这样您就可以确保您的 nodejs 不会收到配置错误的请求,并且有害请求的数量会减少。

  1. 您能从日志中删除这些请求吗?也许可以,但强烈建议不要这样做。因为如果有人想对您进行 DDoS 攻击,或者您将面临另一场灾难 - 您将没有太多选择来发现这一点。但您可以为不同的虚拟主机定义不同的日志文件,这样大多数垃圾都会进入登陆虚拟主机的日志。

  2. 磁盘空间不足。任何公共 Web 服务器的日志中都会有大量垃圾,因此您应该始终考虑日志轮换。

  3. 您的配置是否安全?这取决于具体情况。首先,是的 - 如果您在所有 Apache 配置中选中了“ProxyRequests”指令,则表示您已禁用代理请求。其次,否,通常将 / 传递给任何服务器都不是好事,最好传递所需的上下文(例如仅传递 /app),但这取决于此 nodejs 服务器应处理哪些请求。第三,否 - 您应该考虑使用 https,以确保现有会话数据不会受到损害,这也取决于具体情况。

相关内容