在 haproxy 中覆盖 X-Forwarded-For 标头?

Eva*_*van 6 tomcat haproxy x-forwarded-for

在我的 HAProxy 负载均衡器中,我有以下配置块:

defaults
    mode                    http
    log                     global
    option                  httplog clf
    option                  dontlognull
    option http-server-close
    option forwardfor       except 127.0.0.0/8
    option                  redispatch

frontend  main_http *:80
    option forwardfor except 127.0.0.1
    option httpclose
    default_backend         backend_http

backend backend_http
    balance     roundrobin
    option httpchk
    server  node1 10.0.0.64:80 check port 80
    server  node2 10.0.0.65:80 check port 80
    server  node3 10.0.0.66:80 check port 80
Run Code Online (Sandbox Code Playgroud)

在节点 (Tomcat) 上,我以这种格式记录请求(与第一个字段中的 x-forwarded-for 和真正的 REMOTE_ADDR 相结合):

pattern='%{X-Forwarded-For}i - %u %t "%r" %s %b "%{Referer}i" "%{User-Agent}i" %a'
Run Code Online (Sandbox Code Playgroud)

这似乎适用于大多数请求,但在某些情况下,我假设客户端位于代理后面,我看到第一个字段包含这些值的请求(每行代表一个真实请求,我破坏了真实 IP隐私):

10.83.103.44, 10.83.103.44 
10.83.198.52, 10.83.198.52 
10.53.109.36, 10.53.109.36 
unknown, unknown 
192.168.1.43, 127.0.0.1 
192.168.11.189, 127.0.0.1 
10.1.6.3, 216.x.y.194, 10.37.52.202 
192.168.50.250, 38.x.y.5, 10.37.31.201 
Run Code Online (Sandbox Code Playgroud)

根据 HAproxy 文档,最后一个 X-Forwarded-For 应该是它附加的正确的,但事实并非如此。我的应用程序使用客户端 IP 进行地理查找,所以这不仅仅是一个日志问题,它实际上是把事情搞砸了。

我想做的是:与其让 HAproxy 将客户端的 IP 附加到它接收到的现有 X-Forwarded-For 标头,不如简单地覆盖它。因此,如果它X-Forwarded-For: 10.1.2.3从 IP 地址 98.76.54.32接收,它将发送给客户端的只是X-Forwarded-For: 98.76.54.32. 有没有办法做到这一点?我想知道为什么如此明显的垃圾会进入节点 -unknown, unknown显然是垃圾信息 - 但如果存在,我会满足于解决方法。

提前致谢。

Sha*_*den 13

在 HAProxy 添加自己的请求头之前,将其从请求头中撕下:

reqidel ^X-Forwarded-For:.*
Run Code Online (Sandbox Code Playgroud)

此更改的风险在于您将丢失有关“真实”客户端 IP 地址的信息 - 然后您的日志将显示客户端正在使用的代理服务器的 IP。听起来你没问题!

顺便说一句,请参阅此问题以获取有关X-Forwarded-For标题附加顺序混淆的一些有趣信息。