这是我在检查 Apache 访问日志时发现的一个非常奇怪的问题。我在一堆容器前面安装了 HAProxy。它检查传入的请求(主机头或 SNI)并将请求转发到运行 Apache 实例的相应容器。我send-proxy-v2
为每个侦听器都安装了 。在容器内部,mod_remoteip
正在运行RemoteIPProxyProtocol On
。
这一切都很顺利,但我注意到一些请求显示的是网桥的 IP 地址,而不是实际的源 IP 地址。现在我想知道:这怎么可能???在 HAProxy 日志中,我可以看到每个请求的正确源地址(它们源自外部),但在容器内的日志中显示的是网桥的地址。
我完全不明白这一点。HAProxy 有时会“忘记”发送 PROXY 协议标头吗?外部客户端是否可能以某种方式绕过 PROXY 协议?任何有关如何调试此问题的建议都将不胜感激,因为我完全不知道。
我的设置在 Ubuntu 18.04 上运行,使用 HAProxy 1.8.8 和 Apache 2.4.54。
编辑:mod_remoteip
文档指出:
如果启用了 On 标志,则上游客户端必须在每次打开连接时发送标头,否则连接将被中止
因此,肯定是 HAProxy 发送了带有错误 IP 地址的标头。
编辑2:我进一步分析了日志,发现所有使用错误 IP 地址的请求都会导致 400 Bad Request。我进行了一些测试(发送损坏的标头),似乎当mod_remoteip
Apache 使用 400 响应“终止”这些请求时,地址没有被替换(至少出于记录目的)。所以我之前的结论完全是胡说八道,HAProxy 与此无关。
无论如何,我想知道:这是否构成了一个错误,还是我必须忍受的事情?大多数情况下,这些请求似乎来自机器人(恶意或自动安全扫描程序)。不过,我非常希望在日志中看到正确的 IP 地址。