Я пытаюсь отклонить соединения от определенных пользовательских агентов (путем сопоставления подстроки заголовка пользовательского агента), используя haproxy ACL с параметром -f для чтения из файла. Однако он не работает, он работает так, как будто конфигурация игнорируется.
Может ли кто-нибудь с большим опытом работы с haproxy определить, что мне не хватает? Или несколько советов по отладке этой конфигурации haproxy?
Я запускаю haproxy 1.4.18.
Это отрывок из haproxy.cfg:
listen http 0.0.0.0:80
acl abuser hdr_sub(user-agent) -f /etc/haproxy/abuser.lst
tcp-request content reject if abuser
mode http
server www1 127.0.0.1:8080 maxconn 10000
Это содержимое файла abuser.lst:
# annoying bots
annoyingbot1
annoyingbot2
Это старый вопрос, но если кто-то еще столкнется с этой проблемой:
Ваша проблема связана с тем, что tcp-request content
запускается до того, как HAProxy успевает получить / прочитать какие-либо данные уровня 7.
Как это исправить?
Легко: добавить TCP-запрос проверить задержку:
listen http 0.0.0.0:80
tcp-request inspect delay 15s
acl abuser hdr_sub(user-agent) -f /etc/haproxy/abuser.lst
tcp-request content reject if abuser
mode http
server www1 127.0.0.1:8080 maxconn 10000
Вот важный момент из документации HAProxy:
Обратите внимание, что при проверке содержимого haproxy будет оценивать все правила для каждого нового входящего фрагмента, принимая во внимание тот факт, что эти данные являются частичными. Если ни одно правило не соответствует до вышеупомянутой задержки, последняя проверка выполняется по истечении срока, на этот раз с учетом того, что содержимое является окончательным. Если задержка не задана, haproxy вообще не будет ждать и немедленно вынесет вердикт на основании доступной информации.. Очевидно, что это вряд ли будет очень полезно и даже может быть пикантным, поэтому такие настройки не рекомендуются.