Как реализовать SSL-терминацию с HAProxy в Ubuntu 14.04

Вступление

HAProxy, что означает High Availability Proxy, является популярным программным обеспечением с открытым исходным кодом TCP / HTTP Load Balancer и прокси-решением, которое может работать в Linux, Solaris и FreeBSD. Его наиболее распространенным применением является повышение производительности и надежности серверной среды путем распределения рабочей нагрузки по нескольким серверам (например, веб, приложение, база данных). Он используется во многих громких средах, включая GitHub, Imgur, Instagram и Twitter.

В этом руководстве мы рассмотрим, как использовать HAProxy для завершения SSL, для шифрования трафика и для балансировки нагрузки ваших веб-серверов. Мы также покажем вам, как использовать HAProxy для перенаправления HTTP-трафика на HTTPS.

Встроенная поддержка SSL была реализована в HAProxy 1.5.x, которая была выпущена как стабильная версия в июне 2014 года.

Предпосылки

Для завершения этого урока вы должны иметь или получить следующее:

  • По крайней мере один веб-сервер с частной сетью, прослушивающий HTTP (порт 80)

  • Root-доступ к дополнительному VPS, на котором мы будем устанавливать HAProxy. Инструкции по настройке корневого доступа можно найти здесь (шаги 3 и 4): Initial Настройка сервера с Ubuntu 14,04.

  • Сертификат SSL и пара секретных ключей с «общим именем», соответствующим вашему доменному имени или IP-адресу

Если у вас еще нет SSL-сертификата и пары закрытых ключей, пожалуйста, получите их, прежде чем продолжить. Вот несколько учебных пособий, которые содержат шаги, описывающие создание сертификатов SSL:

Создание комбинированного PEM SSL-сертификата / файла ключей

Чтобы реализовать завершение SSL с помощью HAProxy, мы должны убедиться, что ваш сертификат SSL и пара ключей имеют правильный формат PEM. В большинстве случаев вы можете просто объединить свой сертификат SSL (файл .crt или .cer, предоставленный центром сертификации) и его соответствующий закрытый ключ (файл .key, созданный вами). Предполагая, что ваш файл сертификата называется + example.com.crt +, а ваш файл закрытого ключа называется + example.com.key +, вот пример того, как объединить файлы:

cat .crt .key > example.com.pem
sudo cp .pem /etc/ssl/private/

Это создает объединенный файл PEM с именем + example.com.pem + и копирует его в + / etc / ssl / private +. Как всегда, обязательно сохраните все копии вашего файла закрытого ключа, включая файл PEM (который содержит закрытый ключ).

В некоторых случаях вам может потребоваться скопировать корневой сертификат CA и промежуточные сертификаты CA в файл PEM.

Наша стартовая среда

Вот среда, с которой мы начинаем:

изображение: https: //assets.digitalocean.com/articles/HAProxy/ssl/web_server_http.png [веб-сервер по HTTP]

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

Если вы не знакомы с основными понятиями или терминологией балансировки нагрузки, такими как балансировка нагрузки уровня 7, бэкэнды или ACL, вот статья, которая объясняет основы: https://www.digitalocean.com/community/articles/an-introduction- to-haproxy-and-load-балансировки-концепции [Введение в HAProxy и концепции балансировки нагрузки].

Наша цель

К концу этого урока мы хотим создать среду, которая выглядит следующим образом:

изображение: https: //assets.digitalocean.com/articles/HAProxy/ssl/haproxy_ssl.png [HAProxy SSL Termination]

То есть ваши пользователи будут получать доступ к вашему веб-сайту, подключаясь к вашему HAProxy-серверу по протоколу HTTPS, который будет расшифровывать сеанс SSL и перенаправлять незашифрованные запросы на ваши веб-серверы (т.е. серверы в www-backend) через их частные сетевые интерфейсы через порт 80. Затем ваши веб-серверы отправят свои ответы на ваш сервер HAProxy, который зашифрует ответы и отправит их обратно пользователю, который сделал исходный запрос.

Вы можете настроить свой www-backend на любое количество веб-серверов, если они обслуживают идентичный контент. Другими словами, вы можете настроить это на одном сервере, а затем уменьшить его, добавив столько серверов, сколько вы хотите. Помните, что по мере увеличения трафика ваш HAProxy-сервер может стать узким местом в производительности, если у него недостаточно системных ресурсов для обработки вашего пользовательского трафика.

  • Примечание: * В этом руководстве не рассматривается, как обеспечить, чтобы ваши веб-серверы / серверы приложений обслуживали один и тот же контент, поскольку он часто зависит от приложения или веб-сервера.

Установите HAProxy 1.6.x

Создайте новый VPS с частной сетью. Для этого урока мы назовем его haproxy-www, но вы можете называть его как хотите.

В нашем * haproxy-www * VPS добавьте выделенный PPA в apt-get:

sudo add-apt-repository ppa:vbernat/haproxy-1.6

Затем обновите ваш apt-кеш:

sudo apt-get update

Затем установите HAProxy 1.6 с помощью apt-get с помощью следующей команды:

sudo apt-get install haproxy

Теперь, когда HAProxy 1.6 установлен, давайте настроим его!

Конфигурация HAProxy

Файл конфигурации HAProxy находится по адресу + / etc / haproxy / haproxy.cfg + и состоит из двух основных разделов:

  • * Global *: устанавливает параметры всего процесса

  • * Прокси *: состоит из разделов defaults, listen, frontend и backend

Опять же, если вы не знакомы с HAProxy или основными понятиями и терминологией балансировки нагрузки, перейдите по этой ссылке: https://www.digitalocean.com/community/articles/an-introduction-to-haproxy-and-load-balancing -concepts [Введение в HAProxy и концепции балансировки нагрузки].

Конфигурация HAProxy: глобальная

  • Все настройки HAProxy должны быть выполнены на вашем HAProxy VPS, _haproxy-www _. *

Откройте haproxy.cfg в редакторе:

sudo vi /etc/haproxy/haproxy.cfg

Вы увидите, что уже определены два раздела: global и defaults.

Первое, что вам нужно сделать, это установить maxconn на разумное число. Этот параметр влияет на количество одновременных подключений, которые разрешает HAProxy, что может повлиять на QoS и предотвратить сбой при попытке веб-серверов обслуживать слишком много запросов. Вам нужно будет поэкспериментировать с этим, чтобы найти то, что подходит для вашей среды. Добавьте следующую строку (со значением, которое вы считаете разумным) в раздел global конфигурации

  maxconn

Добавьте эту строку, чтобы настроить максимальный размер создаваемых временных ключей DHE:

  tune.ssl.default-dh-param 2048

Затем в разделе defaults добавьте следующие строки под строкой, в которой написано + mode http +:

  option forwardfor
  option http-server-close

Параметр forwardfor устанавливает HAProxy для добавления заголовков X-Forwarded-For к каждому запросу, а параметр http-server-close уменьшает задержку между HAProxy и вашими пользователями, закрывая соединения, но поддерживая keep-alives.

Конфигурация HAProxy: Статистика

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

  stats enable
  stats uri
  stats realm Haproxy\ Statistics
  stats auth :

Это позволит вам просмотреть страницу статистики HAProxy, перейдя в свой домен по + / stats + (например, https://example.com/stats).

Пока не закрывайте файл конфигурации! Мы добавим конфигурацию прокси дальше.

Конфигурация HAProxy: Прокси

Конфигурация внешнего интерфейса

Первое, что мы хотим добавить - это интерфейс для обработки входящих HTTP-соединений. В конце файла давайте добавим внешний интерфейс www-http. Обязательно замените + haproxy_www_public_IP + на * public IP * вашего VPS haproxy-www:

frontend www-http
  bind :80
  reqadd X-Forwarded-Proto:\ http
  default_backend www-backend

Вот объяснение того, что означает каждая строка в приведенном выше фрагменте конфигурации внешнего интерфейса:

  • * веб-интерфейс www-http *: указывает веб-интерфейс с именем «www-http»

  • * bind haproxy_www_public_IP: 80 *: замените + haproxy_www_public_IP + публичным IP-адресом haproxy-www. Это говорит HAProxy, что этот интерфейс будет обрабатывать входящий сетевой трафик на этот IP-адрес и порт 80 (HTTP)

  • * reqadd X-Forwarded-Proto: \ http *: добавляет заголовок http в конец конца HTTP-запроса

  • * default_backend www-backend *: это указывает, что любой трафик, который получает этот веб-интерфейс, будет перенаправлен на www-backend, который мы определим на следующем шаге

Далее мы добавим внешний интерфейс для обработки входящих HTTPS-соединений. В конце файла давайте добавим внешний интерфейс www-https. Обязательно замените + haproxy_www_public_IP + на * public IP * вашего VPS haproxy-www:

frontend www-https
  bind :443 ssl crt /etc/ssl/private/
  reqadd X-Forwarded-Proto:\ https
  default_backend www-backend
  • * веб-интерфейс www-https *: указывает веб-интерфейс с именем «www-https»

  • * bind haproxy_www_public_IP: 443 ssl crt… *: замените + haproxy_www_public_IP + на публичный IP-адрес haproxy-www и + example.com.pem + на ваш сертификат SSL и пару ключей в комбинированном формате pem. Это говорит HAProxy, что этот интерфейс будет обрабатывать входящий сетевой трафик по этому IP-адресу и порту 443 (HTTPS).

  • * reqadd X-Forwarded-Proto: \ https *: добавляет заголовок https в конец конца запроса HTTPS

  • * default_backend www-backend *: это указывает, что любой трафик, который получает этот веб-интерфейс, будет перенаправлен на www-backend, который мы определим на следующем шаге

Конфигурация сервера

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

backend www-backend
  redirect scheme https if !{ ssl_fc }
  server www-1 :80 check
  server www-2 :80 check

Вот объяснение того, что означает каждая строка во фрагменте конфигурации бэкенда выше:

  • * backend www-backend *: указывает бэкэнд с именем www-backend

  • * схема перенаправления https if! \ {ssl_fc} *: эта строка перенаправляет HTTP-запросы на HTTPS, что делает ваш сайт только HTTPS. Если вы хотите разрешить HTTP и HTTPS, удалите эту строку

  • * сервер www-1… *: указывает внутренний сервер с именем www-1, частный IP-адрес (который вы должны заменить) и порт, который он прослушивает, 80. Параметр check заставляет балансировщик нагрузки периодически выполнять проверку работоспособности на этом сервере.

  • * сервер www-2… *: аналогично предыдущей строке. Добавьте дополнительные строки, подобные этой, с соответствующими именами и IP-адресами, чтобы добавить больше серверов в балансировщик нагрузки.

Теперь сохраните и выйдите из + haproxy.cfg +. Теперь HAProxy готов к запуску, но сначала давайте включим ведение журнала.

Включить ведение журнала HAProxy

Включение регистрации в HAProxy очень просто. Сначала отредактируйте файл rsyslog.conf:

sudo vi /etc/rsyslog.conf

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

$ModLoad imudp
$UDPServerRun 514
$UDPServerAddress 127.0.0.1

Теперь перезапустите rsyslog, чтобы включить новую конфигурацию:

sudo service rsyslog restart

Ведение журнала HAProxy теперь включено! Файл журнала будет создан в + / var / log / haproxy.log + после запуска HAProxy.

Запустите HAProxy

  • На haproxy-www * запустите HAProxy, чтобы изменения в конфигурации вступили в силу:

sudo service haproxy restart

HAProxy теперь выполняет SSL-терминацию и балансировку нагрузки ваших веб-серверов! Ваш сервер с балансировкой нагрузки теперь доступен для вашего пользователя через общедоступный IP-адрес или доменное имя вашего балансировщика нагрузки, haproxy-www! Есть несколько вещей, которые вы захотите проверить, чтобы убедиться, что все настроено правильно.

Что проверить

  • Если вы еще этого не сделали, обновите свои серверы имен, чтобы в вашем домене указывался публичный IP-адрес сервера haproxy-www

  • Если вы хотите, чтобы ваши серверы использовали только HTTPS, вы должны убедиться, что ваши веб-серверы (например, www-1, www-2 и т. д.) прослушивают только свои частные IP-адреса через порт 80. В противном случае пользователи смогут получить доступ к вашим веб-серверам через HTTP (незашифрованный) на своих общедоступных IP-адресах.

  • Посетите haproxy-www через HTTPS и убедитесь, что он работает

  • Посетите haproxy-www через HTTP и убедитесь, что он перенаправляет на HTTPS (если вы не настроили его для разрешения как HTTP, так и HTTPS)

  • Примечание: * Если вы используете приложение, которому нужно знать собственный URL, например WordPress, вам нужно изменить настройку URL с «http» на https ». Чтобы следовать примеру WordPress, вы должны перейти в общие настройки WordPress, а затем изменить адрес WordPress (URL) и адрес сайта (URL) с «http» на «https».

Заключение

Теперь у вас есть решение для балансировки нагрузки, которое обрабатывает ваши SSL-соединения и может использоваться для горизонтального масштабирования вашей серверной среды. Не стесняйтесь комбинировать то, что вы узнали в этом руководстве, с другими руководствами HAProxy, чтобы еще больше улучшить вашу среду!

Related