Балансировка нагрузки с помощью 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