1

haproxy.cfg我试图从 x-forwarded-for 标头中提取正确的 IP 地址到新的自定义标头中。

我的输入请求标头将类似于

X-Forwarded-For: 1.2.3.4, 2.3.4.5, 3.4.5.6

我预期的新标题将类似于:

X-Custom-IP: 2.3.4.5

谢谢

4

1 回答 1

2

原答案:

您可以使用字段 sample-fetcher 转换关键字: https ://cbonte.github.io/haproxy-dconv/configuration-1.6.html#7.3.1-field

由于无法计算当前 haproxy 中的字段,我会在 X-Forwarded-For 标头上编写一个带有正则表达式的几个简单 ACL,检测 0、1、2、3、4、5 个不同的 IP(或者实际上,逗号分隔符)并在此基础上选择要放入 X-Custom-IP 的正确字段。

例如(未测试)

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

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


编辑:有趣的是,我甚至不需要 5 分钟就找到更好的解决方案。

使用 hdr_ip 样本提取器: https ://cbonte.github.io/haproxy-dconv/configuration-1.5.html#7.3.6-hdr_ip

您仍然需要 ACL 来计算 IP,但您可以直接使用 hdr_ip(x-forwarded-for,2) 和 hdr_ip(x-forwarded-for,3),不需要 Field()。

于 2016-06-20T09:44:07.757 回答