Настройка балансировщика
В данной конфигурации балансировщик распределяет 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 ?
list list
up Change address up.
down Change address down.
healthcheck Server health check.
clear Clear firewall VIP, VIP6, VIP46, VIP64 real server statistics.
#diagnose firewall vip virtual-server ?
real-server Real-server diagnostics.
stats Statistics.
filter Filter for various virtual server diagnostics.
Например, следующие команды перечисляют и отображают информацию о статусе всех реальных серверов:
# diagnose firewall vip virtual-server real-server
vd root/0 vs HTTP_Virtual_Server/8 addr 192.168.101.2:80 status 2/1 (process 3400)
conn: max 0 active 0 attempts 0 success 0 drop 0 fail 0
vd root/0 vs HTTP_Virtual_Server/8 addr 192.168.101.3:80 status 2/1 (process 3400)
conn: max 0 active 0 attempts 0 success 0 drop 0 fail 0
vd root/0 vs HTTP_Virtual_Server/8 addr 192.168.101.4:80 status 2/1 (process 3400)
conn: max 0 active 0 attempts 0 success 0 drop 0 fail 0
...
# diagnose firewall vip realserver list
alloc=4
------------------------------
vf=0 name=HTTP_Virtual_Server/8 class=4 type=1 213.232.199.178:(3080-3080), protocol=6
total=3 alive=3 power=3 ptr=190910308
ip=192.168.101.2-192.168.101.2/80 adm_status=0 holddown_interval=300 max_connections=0 weight=1 option=01
alive=1 total=1 enable=00000001 alive=00000001 power=1
src_sz=0
id=0 status=up ks=0 us=0 events=1 bytes=33522 rtt=0
ip=192.168.101.3-192.168.101.3/80 adm_status=0 holddown_interval=300 max_connections=0 weight=1 option=01
alive=1 total=1 enable=00000001 alive=00000001 power=1
src_sz=0
id=0 status=up ks=0 us=0 events=1 bytes=90135 rtt=0
ip=192.168.101.4-192.168.101.4/80 adm_status=0 holddown_interval=300 max_connections=0 weight=1 option=01
alive=1 total=1 enable=00000001 alive=00000001 power=1
src_sz=0
id=0 status=up ks=0 us=0 events=1 bytes=46431 rtt=0
Многие диагностические команды включают получение информации об одном или нескольких виртуальных серверах. Чтобы контролировать, какие серверы запрашиваются, вы можете определить фильтр:
# diagnose firewall vip virtual-server filter ?
vd: any
virtual-server: any
source ip: any
dest ip: any
source port: any
dest port: any
Самой наглядной проверкой является сниффер пакетов. Следующей командой в FortiGate можно отследить распределение трафика с установленными фильтрами порта и интерфейса для более удобного просмотра:
# diagnose sniffer pa lan ' port 80 ' ?
<verbose>
1: print header of packets
2: print header and data from ip of packets
3: print header and data from ethernet of packets (if available)
4: print header of packets with interface name
5: print header and data from ip of packets with interface name
6: print header and data from ethernet of packets (if available) with intf name
# diagnose sniffer pa lan ' port 80' 4
interfaces=[lan]
filters=[ port 80]
5.311722 lan -- 192.168.100.99.5006 -> 192.168.101.4.80: ack 3239918662
5.311743 lan -- 192.168.101.3.80 -> 192.168.100.99.10948: syn 2478242486 ack 1197038930
5.311796 lan -- 192.168.100.99.10948 -> 192.168.101.3.80: ack 2478242487
5.311805 lan -- 192.168.100.99.5006 -> 192.168.101.4.80: psh 298401776 ack 3239918662
5.311882 lan -- 192.168.100.99.10948 -> 192.168.101.3.80: psh 1197038930 ack 2478242487
5.311896 lan -- 192.168.101.2.80 -> 192.168.100.99.3235: syn 63859594 ack 3621132829
...
# diagnose sniffer pa lan ' port 80' 5
…
5.823857 lan -- 192.168.101.4.80 -> 192.168.100.99.6445: psh 144329992 ack 2029802169
0x0000 4500 0244 acb0 4000 3e06 434b c0a8 6504 E..D..@.>.CK..e.
0x0010 c0a8 6463 0050 192d 089a 4d08 78fc 52b9 ..dc.P.-..M.x.R.
0x0020 8018 00eb 5cbb 0000 0101 080a 0265 4801 ....\........eH.
0x0030 0c5d 6f29 4854 5450 2f31 2e31 2032 3030 .]o)HTTP/1.1.200
0x0040 204f 4b0d 0a44 6174 653a 2046 7269 2c20 .OK..Date:.Fri,.
0x0050 3233 204f 6374 2032 3032 3020 3133 3a31 23.Oct.2020.13:1
0x0060 373a 3233 2047 4d54 0d0a 5365 7276 6572 7:23.GMT..Server
0x0070 3a20 4170 6163 6865 2f32 2e34 2e31 3820 :.Apache/2.4.18.
0x0080 2855 6275 6e74 7529 0d0a 4c61 7374 2d4d (Ubuntu)..Last-M
0x0090 6f64 6966 6965 643a 2054 6875 2c20 3031 odified:.Thu,.01
0x00a0 204f 6374 2032 3032 3020 3132 3a34 373a .Oct.2020.12:47:
0x00b0 3238 2047 4d54 0d0a 4554 6167 3a20 2264 28.GMT..ETag:."d
0x00c0 642d 3562 3039 6236 6233 3836 3161 3422 d-5b09b6b3861a4"
0x00d0 0d0a 4163 6365 7074 2d52 616e 6765 733a ..Accept-Ranges:
0x00e0 2062 7974 6573 0d0a 436f 6e74 656e 742d .bytes..Content-
0x00f0 4c65 6e67 7468 3a20 3232 310d 0a56 6172 Length:.221..Var
0x0100 793a 2041 6363 6570 742d 456e 636f 6469 y:.Accept-Encodi
0x0110 6e67 0d0a 4b65 6570 2d41 6c69 7665 3a20 ng..Keep-Alive:.
0x0120 7469 6d65 6f75 743d 352c 206d 6178 3d31 timeout=5,.max=1
0x0130 3030 0d0a 436f 6e6e 6563 7469 6f6e 3a20 00..Connection:.
0x0140 4b65 6570 2d41 6c69 7665 0d0a 436f 6e74 Keep-Alive..Cont
0x0150 656e 742d 5479 7065 3a20 7465 7874 2f68 ent-Type:.text/h
0x0160 746d 6c0d 0a0d 0a3c 2144 4f43 5459 5045 tml....<!DOCTYPE
0x0170 2068 746d 6c3e 0a3c 6874 6d6c 3e0a 2020 .html>.<html>...
0x0180 3c68 6561 643e 0a20 2020 203c 7469 746c <head>.....<titl
0x0190 653e 4d59 2057 4542 2053 4552 5645 5220 e>MY.WEB.SERVER.
0x01a0 3321 3c2f 7469 746c 653e 0a20 203c 2f68 3!</title>...</h
0x01b0 6561 643e 0a20 203c 626f 6479 3e0a 2020 ead>...<body>...
0x01c0 2020 3c63 656e 7465 723e 0a20 2020 2020 ..<center>......
0x01d0 2020 203c 696d 6720 7372 633d 222f 6963 ...<img.src="/ic
0x01e0 6f6e 732f 7562 756e 7475 2d6c 6f67 6f2e ons/ubuntu-logo.
0x01f0 706e 6722 2f3e 0a20 2020 2020 2020 203c png"/>.........<
0x0200 6831 3e53 656c 6563 7465 6c3a 204d 7920 h1>Selectel:.My.
0x0210 7765 6220 7365 7276 6572 2033 213c 2f68 web.server.3!</h
0x0220 313e 0a20 2020 203c 2f63 656e 7465 723e 1>.....</center>
0x0230 0a20 203c 2f62 6f64 793e 0a3c 2f68 746d ...</body>.</htm
0x0240 6c3e 0a0a l>..
...
Также трафик можно отследить на самом сервере, например, с помощью команды tcpdump. Ниже показан трафик при выключенном NAT при настройке политики для балансировщика на FortiGate, благодаря чему можно отследить исходящий IP-адрес клиента.
root@server1:~# tcpdump -n -i eth1 port 80 and host 192.168.101.2
6:59:19.400119 IP 37.134.185.89.32924 > 192.168.101.2.80: Flags [P.], seq 1:577, ack 1, win 11, options [nop,nop,TS val 200141474 ecr 21914156], length 576: HTTP: GET / HTTP/1.1
16:59:19.400134 IP 192.168.101.2.80 > 95.213.254.17.32924: Flags [.], ack 577, win 236, options [nop,nop,TS val 21914156 ecr 200141474], length 0
16:59:19.400556 IP 192.168.101.2.80 > 95.213.254.17.32924: Flags [P.], seq 1:508, ack 577, win 236, options [nop,nop,TS val 21914156 ecr 200141474], length 507: HTTP: HTTP/1.1 200 OK
16:59:19.401566 IP 95.213.254.17.32924 > 192.168.101.2.80: Flags [.], ack 508, win 11, options [nop,nop,TS val 200141474 ecr 21914156], length 0
16:59:22.805985 IP 192.168.101.2.80 > 192.168.100.99.9742: Flags [F.], seq 529, ack 216, win 235, options [nop,nop,TS val 21915007 ecr 200141319], length 0
При включенном NAT в качестве исходящего IP-адреса отображается адрес FortiGate:
root@server1:~# tcpdump -n -i eth1 port 80 and host 192.168.101.2
17:29:26.994943 IP 192.168.100.99.11512 > 192.168.101.2.80: Flags [P.], seq 1:216, ack 1, win 11, options [nop,nop,TS val 200322233 ecr 22366034], length 215: HTTP: GET /index.html HTTP/1.1
17:29:26.994984 IP 192.168.101.2.80 > 192.168.100.99.11512: Flags [.], ack 216, win 235, options [nop,nop,TS val 22366055 ecr 200322233], length 0
17:29:26.995400 IP 192.168.101.2.80 > 192.168.100.99.11512: Flags [P.], seq 1:529, ack 216, win 235, options [nop,nop,TS val 22366055 ecr 200322233], length 528: HTTP: HTTP/1.1 200 OK
17:29:26.996429 IP 192.168.100.99.11512 > 192.168.101.2.80: Flags [.], ack 529, win 11, options [nop,nop,TS val 200322233 ecr 22366055], length 0
17:29:31.986638 IP 192.168.101.2.80 > 192.168.100.99.11512: Flags [F.], seq 529, ack 216, win 235, options [nop,nop,TS val 22367303 ecr 200322233], length 0