HAProxy: возьмите средний IP из 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
Спасибо
1 ответ
Оригинальный ответ:
Вы можете использовать поле преобразования ключевого слова sample-fetcher: https://cbonte.github.io/haproxy-dconv/configuration-1.6.html
Поскольку в текущем haproxy нет способа подсчитывать поля, я бы написал несколько простых ACL-списков с регулярным выражением над заголовком X-Forwarded-For, которые обнаруживают 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
Вам все еще нужны ACL для подсчета IP-адресов, но вы можете использовать hdr_ip(x-forwarded-for,2) и hdr_ip(x-forwarded-for,3) напрямую, нет необходимости в Field().