Apache 日志显示 NAT 服务器地址而不是实际请求者 IP

Apache 日志显示 NAT 服务器地址而不是实际请求者 IP

我的 Apache 服务器位于带有 NAT 转换的防火墙后面。我遇到的问题是,我想查看实际发出请求的人,而不是防火墙的地址。知道防火墙正常工作固然很好,但要真正查看流量模式,我需要查看真实世界的 IP 地址。

更新

防火墙是 CentOS 5.2 盒,使用 fwbuilder 创建的 iptable 规则。

iptables 响应所有接口上的请求,Squid 仅在面向内部的接口上运行。

答案1

我在代理服务器和负载平衡器上见过这种情况。通常的情况是入站流量通过代理到达 Web 服务器,但 Web 服务器的默认网关不是代理。通过执行反向 NAT,Web 服务器获取代理的 IP 而不是客户端的 IP。由于它将具有到代理的路由(实际上可能位于同一子网中),因此可以确保它始终可以将返回流量返回到客户端。

解决此问题的一种方法是让代理将包含客户端真实 IP 的自定义 HTTP 标头插入到 Web 服务器可以解析的 HTTP 请求中。对于 Apache,这变成了一个简单的问题,只需修改您的LogFormat语句以使用%{Custom-Header}而不是%h。当然,这取决于您的设备是否真正了解 HTTP 并能够将任意标头插入 GET/POST/等请求中。这是代理和负载平衡器的常见功能,但对防火墙来说却并非如此。此外,除非您的设备正在执行 SSL 终止,否则它不会帮助您处理 HTTPS 请求。正如 Kyle 所说,我们需要更多地了解您的防火墙。

答案2

我认为在这种情况下最常见的 NAT 是仅对目标地址进行 NAT。因此客户端仍将具有相同的源地址(公共 IP)。所以我认为我们需要更多地了解防火墙。

例如:

Client: 12.12.12.12
Public Website Address: 11.11.11.11
Private Web Server ip: 10.0.0.2

Client -->  Your Firewall --> Web Server

Client Packet:
    Src IP:12.12.12.12
    Dst IP:11.11.11.11
NAT Firewall:
    Takes client Packet, changes Dst from 11.11.11.11 to 10.0.0.2.
    Make entry in table to remember this mapping
Web Server (When Client Packet Arrives):
    Src:12.12.12.12
    Dst: 10.0.0.2

Reply Packet from Web Server:
    Src: 10.0.0.2
    Dst: 12.12.12.12
NAT Firewall:
    Takes Reply Packet, changes Src to 11.11.11.11 after looking at mapping
Client (When Packet Arives):
    Src: 11.11.11.11 
    Dst: 12.12.12.12

客户端很可能也位于 NAT 之后,但这只会使此目的更加令人困惑。

答案3

根据您的描述,这个“防火墙”看起来更像是一个反向代理。

NAT 通常适用于传出连接,而不适用于传入连接。当专用网络中的计算机打开与外界的连接时,远程服务器会将该连接视为来自防火墙的公共 IP 地址;但是当远程计算机打开与您的内部服务器之一的连接(通过防火墙上的端口转发)时,它会将该连接视为来自其来源的实际公共 IP 地址。您描述的是反向代理的典型行为,而不是 NAT 防火墙的典型行为。

您确定防火墙上没有运行任何反向代理(如 SQUID)并拦截传入的 HTTP(S) 连接吗?SQUID 还可以充当透明代理,因此它可能在您不知情的情况下存在。这也是您发布内部网站时 ISA Server 的标准行为:即使您认为您只是在进行端口转发,您实际上也在反向代理您的 Web 服务器。

答案4

如果您在日志中看到本地 IP,还请检查旁边的用户代理;如果它是“PageSpeed”,那么它应该是好的显示这些请求的本地 IP。

相关内容