2016-09-02 5 views
0

В последнее время мы переключились с citrix на HAProxy для балансировки нагрузки.Дополнительное пространство в HTTP-заголовках дает 400 ошибок в HAProxy

Проблема в том, что для некоторых запросов HAProxy начал выдавать ошибку 400 (что хорошо работало на citrix). Таким образом, мы перешли на балансировку нагрузки на основе TCP из балансировки нагрузки на основе HTTP в настоящее время.

При дальнейших исследованиях мы обнаружили, что некоторые запросы имели дополнительное пространство в HTTP-заголовке, что вызвало ошибку 400.

profileID<space>:value 
vs 
profileID:value 

И эти запросы поступают из приложения Android, поэтому мы не можем изменить исходный код.

Мы пытаемся вернуться к балансировке нагрузки на основе http.

Есть ли настройка конфигурации, которая может позволить нам игнорировать пространство.

+2

Вы на 100% уверены, что заблокированные заголовки - это «двоеточие», а не «пробел-двоеточие»? – regilero

+2

Пространство после двоеточия не является недопустимым в HTTP и не будет заблокировано HAProxy. Здесь что-то еще происходит. Взгляните на свои журналы. Найдите значение для состояния завершения - '% tsc', если вы используете собственный формат журнала. При успешных запросах это будет регистрироваться как '----'. Для неудавшихся запросов первые два символа (по крайней мере) будут разными, и это очень полезная информация. Что вы здесь видите? Вы захватили трассировку пакетов? У вас есть какие-либо 'req [i] rep' правила? Если да, пожалуйста, покажите их - вы можете нарушать запросы с помощью плохого регулярного выражения. –

+0

@regilero: ya вы правы .. обновили вопрос. – pratikvasa

ответ

3

HAProxy поддерживает директиву конфигурации прокси, называемую option accept-invalid-http-request.

Он решает некоторые из строгого соблюдения протокола, что HAProxy правильно требует по умолчанию для входящих запросов, поэтому его нельзя использовать вслепую или небрежно, не понимая последствий.

Из документации:

По умолчанию HAProxy соответствует RFC7230 с точки зрения анализа сообщений. Это означает, что недопустимые символы в именах заголовков не разрешены и вызывают ошибку для возврата клиенту. Это желаемое поведение, так как такие запрещенные символы используются в основном для создания атак с использованием слабых сторон сервера и для защиты от обхода защиты.

Иногда багги-браузер или сервер будут вызывать недопустимые имена заголовков по любой причине (конфигурация, реализация), и проблема не будет немедленно исправлена. В таком случае можно разделить парсер заголовка заголовка HAProxy, чтобы принять любой символ, даже если это не имеет смысла, указав эту опцию.

Аналогичным образом список символов, разрешенных для отображения в URI, хорошо определен RFC3986, а символы 0-31, 32 (пробел), 34 ('' '), 60 (' < '), 62 (' > '), 92 (' \ '), 94 ('^'), 96 (' `'), 123 (' {'), 124 (' | '), 125 ('} '), 127 (delete) и что-либо выше не разрешено вообще. Haproxy всегда блокирует несколько из них (0..32, 127). Остальные блокируются по умолчанию, если эта опция не включена. Этот параметр также расслабляет тест в версии HTTP, он позволяет пропускать запросы HTTP/0.9 (не указанная версия) и несколько цифр как для основной, так и для младшей версии.

Этот параметр никогда не должен включаться по умолчанию, поскольку он скрывает ошибки приложений и открывает нарушения безопасности. только быть после того, как проблема была подтверждена.

http://cbonte.github.io/haproxy-dconv/1.6/configuration.html#4-option%20accept-invalid-http-request (курсив)

Добавление этой опции в соответствующей frontend части файла configurarion должны допустить, чтобы эти некорректные заголовки должны быть приняты.

Обратите внимание, что потенциальные риски безопасности, упомянутые в документации, не являются рисками, присущими HAProxy, а скорее опасны для использования уязвимостей в вашем стеке за прокси-сервером - поскольку обычно HAProxy защищает эти компоненты от таких недействительных запросов.

Смежные вопросы