tl;dr; 当 HAProxy 从下游接收到以逗号分隔的列表时,如何将(替换值或替换标头)附加到 X-Forwarded-For 标头?
默认情况下,HAProxy 不会像 NGINX 那样附加到 X-Forwarded-For 标头,而是创建一个具有新值的重复标头 - 是的,根据 RFC,它们是允许的。现在我的问题是,这种行为对我的上游应用程序来说是不可接受的。我需要解决这个问题。
我的 HAProxy 从下游接收 X-Forwarded-For 标头,如下所示:“X-Forward-For:假定客户端 ip、边缘反向代理 ip、入口控制器 ip”接下来是身份验证网关(它添加了一些特定标头),然后是 HAProxy 和后端 Web 服务器。我需要将身份验证网关 ip 作为第四个条目附加到 HAProxy 中的 XFF 列表中。
我已在适当的后端定义中尝试了以下内容:
http-request replace-value X-Forwarded-For (.*) " %[hdr(x-forwarded-for)], %[src]"
结果为“X-Forwarded-For:入口控制器 ip、身份验证网关 ip、入口控制器 ip、身份验证网关 ip、入口控制器 ip、身份验证网关 ip”
http-request replace-header X-Forwarded-For (.*) " %[hdr(x-forwarded-for)], %[src]"
结果为“X-Forwarded-For:入口控制器 ip,身份验证网关 ip”
http-request replace-value X-Forwarded-For ^ " %[hdr(x-forwarded-for)], %[src]
结果为“X-Forwarded-For:入口控制器 ip、身份验证网关 ip、入口控制器 ip、身份验证网关 ip、入口控制器 ip、身份验证网关 ip”
http-request replace-header X-Forwarded-For ^ " %[hdr(x-forwarded-for)], %[src]
结果为“X-Forwarded-For:入口控制器 ip,身份验证网关 ip”
我最初认为有一些 200 IQ HAProxy 开发人员逻辑涉及 XFF 标头,并使用包含下游 XFF 值的不同命名的重复标头 X-FF-1 进行测试......
http-request replace-value X-Forwarded-For (.*) " %[hdr(x-ff-1)], %[src]
结果为“X-Forwarded-For:入口控制器 ip、身份验证网关 ip、入口控制器 ip、身份验证网关 ip、入口控制器 ip、身份验证网关 ip”
http-request replace-header X-Forwarded-For ^ " %[hdr(x-ff-1)], %[src]"
结果为“X-Forwarded-For:入口控制器 ip,身份验证网关 ip”
...但没有骰子。
我不知道如何解决这个缺点。这可能是一个简单的正则表达式修复,但我认为当标头以逗号分隔列表的形式呈现时,HAProxy 处理标头的方式存在一些问题。在 XFF 情况下,逗号分隔列表中除最右边的值之外的所有内容都会被丢弃。
另外,我知道使用 XFF 标头作为客户端 IP 是不可靠的,但我对公司的软件开发团队没有任何影响力。
答案1
如果您想要附加到逗号分隔的列表,则可以使用以下命令。例如,如果您有“X-Forwarded-For:假定客户端 ip,proxy1”,并且想要在后面附加“proxy2”
http-request replace-header X-Forwarded-For ^ "%[req.fhdr(x-forwarded-for)], %[src]"
您获得“X-Forwarded-For:假定客户端 ip,代理 1,代理 2”。
要将“proxy1”附加到单个“X-Forwarded-For:假定客户端 ip”,您可以使用
http-request replace-value X-Forwarded-for ^ "%[hdr(x-forwarded-for)], %[src]"