HAProxy:将X-Forwarded-For的中间IP放入一个新的头中

HAProxy:将X-Forwarded-For的中间IP放入一个新的头中,proxy,ip,haproxy,x-forwarded-for,Proxy,Ip,Haproxy,X Forwarded For,在haproxy.cfg中,我试图将正确的IP地址从x-forwarded-for报头提取到一个新的自定义报头中 我的输入请求头类似于 X-Forwarded-For:1.2.3.4、2.3.4.5、3.4.5.6 我期望的新标题是: X-Custom-IP:2.3.4.5 谢谢原始答案: 您可以使用字段示例获取程序转换关键字: 由于在当前的haproxy中无法计数字段,我将在X-Forwarded-For头上编写几个简单的ACL,其中包含一个regexp,用于检测0、1、2、3、4、5个不同

haproxy.cfg
中,我试图将正确的IP地址从x-forwarded-for报头提取到一个新的自定义报头中

我的输入请求头类似于

X-Forwarded-For:1.2.3.4、2.3.4.5、3.4.5.6

我期望的新标题是:

X-Custom-IP:2.3.4.5

谢谢

原始答案:

您可以使用字段示例获取程序转换关键字:

由于在当前的haproxy中无法计数字段,我将在X-Forwarded-For头上编写几个简单的ACL,其中包含一个regexp,用于检测0、1、2、3、4、5个不同的IP(或者实际上是逗号分隔符),并基于此,选择适当的字段放入X-Custom-IP

例如(未测试)

让我知道它是否适合您,或者您是否找到了其他更好的解决方案:)


编辑:有趣的是,我甚至没花5分钟就找到了更好的解决方案

使用hdr_ip样本获取程序:


您仍然需要ACL来计算ip,但可以直接使用hdr_ip(x-forwarded-for,2)和hdr_ip(x-forwarded-for,3),不需要字段()
acl x_forwarded_for_1_ips hdr(x-forwarded-for) -i (?:[0-9]{1,3}\.){3}[0-9]{1,3}
acl x_forwarded_for_2_ips hdr(x-forwarded-for) -i ((?:[0-9]{1,3}\.){3}[0-9]{1,3},){1}(?:[0-9]{1,3}\.){3}[0-9]{1,3}
acl x_forwarded_for_3_ips hdr(x-forwarded-for) -i ((?:[0-9]{1,3}\.){3}[0-9]{1,3},){2}(?:[0-9]{1,3}\.){3}[0-9]{1,3}
acl x_forwarded_for_4_ips hdr(x-forwarded-for) -i ((?:[0-9]{1,3}\.){3}[0-9]{1,3},){3}(?:[0-9]{1,3}\.){3}[0-9]{1,3}
acl x_forwarded_for_5_ips hdr(x-forwarded-for) -i ((?:[0-9]{1,3}\.){3}[0-9]{1,3},){4}(?:[0-9]{1,3}\.){3}[0-9]{1,3}

http-request add-header X-Custom-Ip %[hdr(x-forwarded-for)] if x_forwarded_for_1_ips
http-request add-header X-Custom-Ip %[hdr(x-forwarded-for),field(2,\,)] if x_forwarded_for_2_ips
http-request add-header X-Custom-Ip %[hdr(x-forwarded-for),field(2,\,)] if x_forwarded_for_3_ips
http-request add-header X-Custom-Ip %[hdr(x-forwarded-for),field(3,\,)] if x_forwarded_for_4_ips
http-request add-header X-Custom-Ip %[hdr(x-forwarded-for),field(3,\,)] if x_forwarded_for_5_ips