гапрокси + оглушення + зберегти життя?


10

Я хотів би поставити оглушення перед haproxy 1.4 для обробки трафіку HTTPS. Мені також потрібен оглушення, щоб додати заголовок X-Forwarded-For . Цього можна досягти за допомогою патчів "stunnel-4.xx-xforwarded-for.diff" з веб-сайту haproxy.

Однак в описі згадується:

Зауважте, що цей патч не працює з підтримкою "живого", ...

Моє запитання: Що це означає для мене на практиці? Я не впевнений,

  1. якщо мова йде про збереження життя між
    • клієнт і оглушення
    • оглушення і гапрокси
    • або хапрокси та сервер сервера?
  2. що це означає для продуктивності: Якщо у мене на веб-сторінці 100 піктограм, чи повинен браузер узгодити 100 повних SSL-з'єднань, чи може він повторно використовувати з'єднання SSL, просто створивши нові з'єднання TCP?

Відповіді:


12

Йдеться про підтримку HTTP-режиму, який дозволяє декілька запитів на ресурси надходити через один сеанс TCP (і, з SSL, один сеанс SSL). Це має велике значення для продуктивності веб-сайту SSL, оскільки без збереження інформації потрібне рукостискання SSL для кожного запитуваного ресурсу.

Отож, проблема тут - одна велика неперервна сесія від клієнта аж до бек-сервера. Це важлива річ для продуктивності і звичайно сприймається для сучасних серверів HTTP, але цей патч говорить, що він не підтримує його. Давайте розберемося, чому ..


Сеанс збереження в живому режимі - це просто більше запитів один за одним - як тільки сервер закінчує свою відповідь на один запит, сервер не надсилає FINпакет для завершення сеансу TCP; клієнт може просто надіслати ще одну партію заголовків.

Щоб зрозуміти, що робить цей патч, ось приклад тривалої розмови:

Клієнт:

GET / HTTP/1.1
Connection: keep-alive
Host: domain.com
...

Сервер:

HTTP/1.1 200 OK
Content-Type: text/html; charset=UTF-8
Server: Apache
Content-Length: 34
.... (other headers)
<html><head>content!</head></html>

Ось де зупиниться неживе з'єднання. Але, Keep-Live дозволяє клієнту просто звільнити інше:

GET /images/some/image.on.the.page.jpg HTTP/1.1
Connection: keep-alive
Host: domain.com
...

Для клієнтського ідентифікатора, який здійснює проксі, деякі зворотні проксі можуть додавати в X-Forwarded-Forзаголовок у кожному запиті клієнта. Це повідомляє серверу висхідного потоку, звідки надходить запит (замість кожного запиту, що починається з IP-адреси зворотного проксі-сервера), для розумності в журналі та інших потреб програми.

X-Forwarded-ForЗаголовок повинен бути введений в кожен і кожен запит клієнта ресурсів відправленого через Keep-Alive з'єднання, так як повні заголовки посилаються кожен раз; обробка X-Forwarded-Forзаголовка і переклад у нього, як "справжній" IP-запит, здійснюються на основі запиту, а не за TCP-підтримкою "живого сеансу". І ей, можливо, там є якесь дивовижне програмне забезпечення для зворотного проксі-сервера, яке використовує один сеанс збереження в живому режимі для обслуговування запитів від декількох клієнтів.

Ось тут ця латка виходить з ладу.


Патч на цьому сайті спостерігає за буфером сеансу TCP для кінця першого набору заголовків HTTP у потоці та вводить новий заголовок у потік після закінчення цього першого набору заголовків. Після цього він вважає X-Forwarded-Forвиконану роботу і припиняє сканувати кінець нових наборів заголовків. Цей метод не обізнаний про всі майбутні заголовки, що надходять через наступні запити.

Не можу насправді звинуватити їх; stunnel насправді не був створений для обробки та перекладу вмісту своїх потоків.

Ефект, який це матиме у вашій системі, полягає в тому, що при першому запиті потокового потоку буде X-Forwarded-Forвведено заголовок належним чином, і всі наступні запити спрацюють нормально - але вони не матимуть заголовка.

Якщо немає іншого патча для введення заголовка, який може обробляти декілька запитів клієнтів на з'єднання (або отримати цей засіб за допомогою наших друзів у "Переповнення стека"), можливо, вам доведеться переглянути інші варіанти припинення SSL.


1
Відмінна відповідь, дякую. Нагадує, чому тут непогано задавати питання.
Кріс Лерчер

1
Щоб дозволити ін'єкції заголовка зберігати в живих в оглушення, потрібно було б мати можливість говорити майже про весь HTTP, що було б величезною роботою. Зважаючи на це, ви також можете використовувати протокол PROXY HAproxy (для якого потрібен патч для оглушення або альтернативно студ ) ін'єктувати заголовок в HAproxy. Докладнішу інформацію див. У документах (з кешу Google, оскільки сайт HAproxy частково знижується на банкоматі)
Holger Just

5

STunnel 4.45 виправляє це належним чином, використовуючи деякі нові можливості (проксі-протокол), що поставляються з HAProxy 1.15

Він також виправляє проблеми з попередніми патчами та Keep Alive


3

Подібно до того, що я розмістив у іншій темі, HAProxy підтримує нативні SSL з обох сторін починаючи з 1.5-dev12. Отже, маючи X-Forwarded-For, HTTP залишається живим, а також заголовок, який повідомляє серверу про те, що з'єднання було здійснено через SSL, є таким же простим, як і наступне:

listen front
    bind :80
    bind :443 ssl crt /etc/haproxy/haproxy.pem
    mode http
    option http-server-close
    option forwardfor
    reqadd X-Forwarded-Proto:\ https if { is_ssl }
    server srv1 1.1.1.1:80 check ...
    ...

Це набагато простіше, ніж обклеїти оглушення і набагато краще, ніж потрібно залишити живі.


Ви можете використовувати ssl_fc замість is_ssl
josch

2

Розширюючи чудову відповідь від Shane, ви можете використовувати Nginx як термінатор SSL перед HAproxy. Він правильно обробляє підтримку в режимі "живо" між клієнтом і nginx, що є найбільш чутливою стороною затримки і створює нове підключення до бекенда для кожного запиту клієнта, надсилаючи X-FORWARDED-FOR у кожному.


1
Однак якщо вам потрібні веб-розетки, то nginx не працюватиме.
w00t

Крім того, він підтримує кеш сеансу ssl.
3molo
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.