Балансировка нагрузки с помощью FortiGate
Балансировка нагрузки с помощью FortiGate включает в себя все необходимые функции для распределения трафика между несколькими серверами в вашей инфраструктуре, развернутой в Selectel, включая как выделенные аппаратные серверы, так и виртуальные серверы в Облачной платформе Selectel.
FortiGate обеспечивает комплексную защиту вашей инфраструктуры и балансирует нагрузки серверов, распределяя потоки трафика по заданным правилам, что позволяет объединить в одном устройстве функции балансировщика нагрузки, Next Generation Firewall (NGFW) и защиту от угроз.
Балансировка нагрузки на основе решений FortiGate обеспечивает:
- быструю и надежную обработку запросов;
- значительное упрощение сетевой архитектуры;
- снижение операционных расходов.
Балансировщик нагрузки поддерживает HTTP, HTTPS, IMAPS, POP3S, SMTPS, SSL или более низкоуровневые протоколы TCP/UDP или IP. Сохранение сеанса поддерживается на основе идентификатора сеанса SSL или на основе введенного файла cookie HTTP.
Health Check — механизм проверки работоспособности серверов для предотвращения отправки трафика балансировки нагрузки на неработающие серверы. Для проверки используется ICMP ping или другое более сложное тестирование TCP-соединений. Health Check удаляет из кластера балансировки нагрузки неработающие реальные серверы. Удаление реальных серверов из кластеров основано на настройках:
- Interval — с какой частотой проверяется сервер;
- Timeout — максимальное допустимое время ответа, прежде чем сервер будет считаться недоступным;
- Retry — количество отказов до того, как сервер считается недоступным, после чего удаляется.
Типы Health Check по протоколам: TCP, HTTP, PING.
Virtual Server — виртуальный сервер, на чей внешний IP-адрес поступает трафик, который перенаправляется к балансировщику нагрузки.
Real Server — действительный, реальный, сервер, на который поступают запросы после балансировки. За каждым виртуальным сервером может быть закреплено несколько реальных серверов. Конфигурация реального сервера включает IP-адрес и номер порта, на котором реальный сервер принимает сеансы. Устройство FortiGate отправляет сеансы на IP-адрес реального сервера, используя номер порта назначения в реальной конфигурации сервера. Конфигурация сервера включает его IP-адрес и номер порта, на котором принимает сеансы.
SSL Offloading — механизм ускорения SSL-соединения клиентов с сервером, при котором операции шифрования производятся на FortiGate вместо самих серверов с помощью отдельного специального процессора. Данный механизм можно применить, только если для балансировки нагрузки задан тип одного из протоколов SSL (HTTPS, IMAPS, POP3S, SMTPS, SSL). FortiGate предоставляет возможность выбрать, какие сегменты SSL-соединения будут получать разгрузку SSL, определив режим:
- Client ⟷ FortiGate — режим, при котором аппаратно ускоренная обработка SSL/TLS только в части соединения между клиентом и устройством FortiGate. Этот режим называется half mode SSL offloading. Сегмент между устройством FortiGate и сервером будет использовать открытое (clear text) соединение, что обеспечит лучшую производительность;
- Full — режим, при котором применяется аппаратно ускоренная обработка SSL к обеим частям соединения: сегментом между клиентом и блоком FortiGate и сегментом между блоком FortiGate и сервером, то есть Client ⟷ FortiGate ⟷ Server. Сегмент между устройством FortiGate и сервером будет использовать шифрованное соединение, но «рукопожатия» будут сокращены. Это не так эффективно, как разгрузка SSL в half mode, но все же повышает производительность.
HTTP multiplexing — функция, которая позволяет веб-клиенту использовать одно соединение TCP для всех запросов к серверу. Данная особенность снижает нагрузку на веб-сервер за счет установки единого соединения, по которому параллельно отправляются запросы и ответы. Каждый фрагмент ассоциируются с помощью специальных встроенных мета-данных, что обеспечивает возможность корректной обработки множества несвязанных запросов HTTP или HTTPS в различном порядке в одном и том же соединении. Более того, ответы получаются по мере их готовности, следовательно, тяжелые запросы не будут блокировать обработку и выдачу более простых объектов.
Например, если веб-браузеры пользователей совместимы только с HTTP 1.0, в котором данная функция не реализована, то включение опции HTTP multiplexing может повысить производительность между веб-сервером и FortiGate.
Persistence — параметр, который сохраняет и отслеживает данные сеанса, чтобы убедиться, что пользователь подключается к одному и тому же серверу каждый раз, когда он делает запрос, являющийся частью одного и того же сеанса или последующих сеансов. HTTP cookie persistence использует внедренные файлы cookie для обеспечения сохраняемости.
При настройке Persistence FortiGate балансирует нагрузку нового сеанса на реальный сервер в соответствии с методом балансировки нагрузки. Если у сеанса есть HTTP cookie или идентификатор сеанса SSL, устройство FortiGate отправляет все последующие сеансы с одним и тем же файлом cookie HTTP или идентификатором сеанса SSL на один и тот же реальный сервер.
Методы балансировки нагрузки
Трафик может распределяться между серверами на основе методов:
- static — равномерное распределение нагрузки между серверами по заранее определённому алгоритму, не учитывая занятость серверов;
- round-robin — распределение на основе алгоритма round-robin, выполняющего перебор равнозначных между собой серверов по циклу, независимо от времени ответа или количества подключений;
- weighted — распределение на основе присвоенных весов серверам для учёта особенностей и различий, где серверы с большим значением веса получают больший процент подключений;
- least-session — распределение, при котором запросы направляются на сервер, имеющий наименьшее количество текущих подключений, рекомендуется использовать при схожих возможностях серверов;
- least-rtt — распределение на основе Round-Trip-Time (время приема-передачи), при котором запросы направляются на сервер с наименьшим таким показателем, который определяется монитором Ping health check и по умолчанию равно 0, если Ping health check не установлен;
- first-alive — раздача нагрузки на первый действующий сервер, обеспечивая защиту от сбоя: сеансы не распределяются между серверами, а обрабатываются одним “первым”, пока он “живой”, а затем переключается на другой работающий сервер;
- http-host — распределение на основе HTTP-заголовка хоста, чтобы направить соединение к определенному серверу.
Перед настройкой балансировщика
Прежде чем настраивать балансировку нагрузки в графическом интерфейсе, включите отображение специального раздела настроек.
- Перейдите в System → Feature Visibility.
- Включите Load Balance в списке Additional Features.
В данном примере будут рассмотрены настройки Load Balancing для HTTP и HTTPS на аппаратном FortiGate-100E, первоначальную базовую настройку которого можно провести согласно инструкциям по настройке межсетевых экранов. В качестве серверов используются облачные серверы в Облачной платформе Selectel.
FortiGate и проект в Облачной платформе соединены приватной сетью, для подключения которой используется сеть глобального роутера между регионами и услугами, что позволяет устанавливать за межсетевым экраном также выделенные серверы и серверы в Облаке на базе VMware.
Настроить балансировщик
В данной конфигурации балансировщик распределяет HTTP-трафик из интернета на три веб-сервера, находящихся во внутренней сети. Сеансы HTTP принимаются на интерфейсе wan1 с IP-адресом назначения 172.20.120.121 на TCP-порте 3080 и перенаправляются с внутреннего интерфейса на веб-серверы. При пересылке адрес назначения сеансов преобразуется в IP-адрес одного из веб-серверов.
Аналогичным образом происходит балансировка HTTPS-трафика.
Создать Health Check
HTTP
Для проверки р аботоспособности создайте Health Check на уровне HTTP, для которого можно детально настроить URL /index.html
и контент ctel
.
Для настройки Health Check, который отправляет get-запросы по адресу http://<real_server_IP_address>/index.html
и выполняет поиск на возвращенной веб-странице фразы «Selectel», выполните следующие действия:
- Перейдите в раздел Policy & Objects → Health Check.
- Нажмите кнопку Create New.
- Укажите имя в поле Name.
- Укажите тип HTTP в поле Type.
- Введите порт в поле Port (по умолчанию для HTTP-трафика — 80).
- Введите искомую фразу в поле Matched content.
- При необходимости укажите другие параметры.
HTTPS
Для мониторинга работоспособности серверов на уровне HTTPS создается аналогичный Health Check, только без детальной проверки контента и URL.
Создать Virtual server
HTTP
Virtual Server для HTTP
Создается Virtual server, на который будет поступать HTTP-запросы.
- Перейдите в раздел Policy & Objects → Virtual Servers.
- Нажмите кнопку Create New.
- Укажите имя в поле Name, тип HTTP в поле Type, интерфейс в поле Interface.
- В Virtual server IP и Virtual server port — внешний IP-адрес и порт, на которые будут поступать запросы.
- В выпадающем меню Load balancing method выберите метод балансировки нагрузки, который подходит для вашего случая.
- Включите опцию Persistence, чтобы сохранять данные о сеансе, выбрав значение HTTP Cookie.
- Выберите монитор работоспособности Health check, созданный ранее, нажав +.
- Включите опцию HTTP multiplexing, если необходимо использовать единое TCP-соединение между веб-клиентом и сервером, в том числе и для поступающих несвязанных запросов и ответов.
- Включите опцию Preserve client IP для сохранения IP-адреса клиента в HTTP-заголовке
X-Forwarded-For
. Это может быть полезно при включении HTTP multiplexing, если на реальных серверах требуются сохранить исходный IP-адрес клиента, например, в log-сообщения.
Привязать реальные серверы к виртуальному
- В разделе Policy & Objects → Virtual Servers, где продолжается настройка Virtual Server, создайте Real Servers.
- В таблице Real Servers нажмите Create New.
- В открывшемся окне добавьте IP-адрес и порт сервера, по которым требуется подключение. В данном случае HTTP-сервер развернут на 80 порту.
- Нажмите кнопку OK.
- Добавьте все серверы, участвующие в балансировке нагрузки, повторив пункты 1-4.
- Сохраните настройки Virtual Server, нажав кнопку OK.
HTTPS
Для работы балансировщика нагрузки FortiGate требуется загрузить SSL-сертификат.
Добавить SSL-сертификат
- Перейдите в раздел System → Certificates.
- Убедитесь, что в System → Feature Visibility включено Certificates.
- Выберите Import → Local Certificate.
- В открывшемся окне установите Type — Certificate, загрузите Certificate file и Key file для вашего сертификата.
- Введите пароль в поле Password.
После выполненных действий сертификат сервера появится в списке Certificates.
Virtual Server для HTTPS
Для HTTPS виртуальный сервер создается аналогичным образом, что и для HTTP, указав тип Virtual Server в поле Type на HTTPS.
В качестве Persistence имеется возможность установить SSL Session ID помимо HTTP Cookie.
Для ускорения SSL-соединения в подразделе SSL Offloading выберите требуемый режим в поле Mode, определив таким образом какой сегмент сети будет разгружен: Client-FortiGate или Full.
Также выберите в выпадающем меню SSL-сертификат в поле Certificate, импортированный ранее.
Привязать реальный сервер к виртуальному
В подразделе Real Servers аналогичным образом добавьте реальные серверы, между которым будет балансироваться нагрузка. Укажите корректные порты, на котором развернуты веб-серверы для HTTPS-трафика, по умолчанию это порт 443.
Создать политику
Чтобы создать политику безопасности, включающую виртуальный сервер балансировки нагрузки в качестве адреса назначения:
- Перейдите в раздел Policy & Objects → Pv4 Policy.
- Нажмите кнопку Create New.
- Укажите имя политики в поле Name.
- Укажите входящий интерфейс — Incoming interface, исходящий интерфейс — Outgoing interface, за которым подключены серверы.
- В поле источник (Source) выберите объект all, нажав +.
- В поле назначение (Destination) выберите виртуальный сервер балансировки нагрузки, который был создан ранее. Важно, чтобы режим Inspection mode был установлен в настройках политики на Proxy-based. Если режим будет установлен на Flow-based, то виртуальный сервер будет недоступен.*
- Выключите режим NAT, чтобы серверы “видели” IP-адреса подключившихся клиентов.
- Для HTTP и HTTPS балансировщика политики создаются аналогичным образом. Разница только в выборе виртуального сервера в поле Destination.
- Нажмите кнопку OK, чтобы сохранить настройки политики.
Результат
В данном примере была настроена балансировка нагрузки HTTP-трафика между тремя серверами.
Запросы, поступающие по адресу виртуального сервера 172.20.120.121:3080
, перенаправляются на реальные серверы по очереди в соответствии с выбранным методом.
Ниже продемонстрировано то, как при обращении по одному и тому же адресу происходит переключение между серверами. Для наглядности контент на каждом сервере различный.
Чтобы включить графическое отображение статусов серверов балансировщика, перейдите в раздел Monitor → Load Balance Monitor (для FortiOS версии 6.2).
Можно использовать следующие консольные команды диагностики для просмотра информации о состоянии виртуальных и реальных серверов с балансировкой нагрузки:
# diagnose firewall vip realserver ?
Например, следующие команды перечисляют и отображают информацию о статусе всех реальных серверов:
# diagnose firewall vip virtual-server real-server
...
# diagnose firewall vip realserver list
Многие диагностические команды включают получение информации об одном или нескольких виртуальных серверах. Чтобы контролировать, какие серверы запрашиваются, вы можете определить фильтр:
# diagnose firewall vip virtual-server filter ?
Самой наглядной проверкой является сниффер пакетов. Следующей командой в FortiGate можно отследить распределение трафика с установленными фильтрами порта и интерфейса для более удобного просмотра:
# diagnose sniffer pa lan ' port 80 ' ?
...
# diagnose sniffer pa lan ' port 80' 5
Также трафик можно отследить на самом сервере, например, с помощью команды tcpdump. Ниже показан трафик при выключенном NAT при настройке политики для балансировщика на FortiGate, благодаря чему можно отследить исходящий IP-адрес клиента.
root@server1:~# tcpdump -n -i eth1 port 80 and host 192.168.101.2
При включенном NAT в качестве исходящего IP-адреса отображается адрес FortiGate:
root@server1:~# tcpdump -n -i eth1 port 80 and host 192.168.101.2