Настройка балансировщика

В данной конфигурации балансировщик распределяет 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», выполните следующие действия:

  1. Перейдите в раздел Policy & ObjectsHealth Check.
  2. Нажмите кнопку Create New.
  3. Укажите имя в поле Name.
  4. Укажите тип HTTP в поле Type.
  5. Введите порт в поле Port (по умолчанию для HTTP-трафика — 80).
  6. Введите искомую фразу в поле Matched content
  7. При необходимости укажите другие параметры аналогично рисунку ниже.

HTTPS

Для мониторинга работоспособности серверов на уровне HTTPS создается аналогичный Health Check, только без детальной проверки контента и URL.

Создание Virtual server

HTTP

Virtual Server для HTTP

Для создания Virtual server, на который будет поступать HTTP-запросы:

  1. Перейдите в раздел Policy & ObjectsVirtual Servers.
  2. Нажмите кнопку Create New.
  3. Укажите имя в поле Name, тип HTTP в поле Type, интерфейс в поле Interface.
  4. В Virtual server IP и Virtual server port — внешний IP-адрес и порт, на которые будут поступать запросы.
  5. В выпадающем меню Load balancing method выберите метод балансировки нагрузки, который подходит для вашего случая.
  6. Включите опцию Persistence, чтобы сохранять данные о сеансе, выбрав значение HTTP Cookie.
  7. Выберите монитор работоспособности Health check, созданный ранее, нажав +.
  8. Включите опцию HTTP multiplexing, если необходимо использовать единое TCP-соединение между веб-клиентом и сервером, в том числе и для поступающих несвязанных запросов и ответов.
  9. Включите опцию Preserve client IP для сохранения IP-адреса клиента в HTTP-заголовке X-Forwarded-For. Это может быть полезно при включении HTTP multiplexing, если на реальных серверах требуются сохранить исходный IP-адрес клиента, например, в log-сообщения.

Привязка реальных серверов к виртуальному

Для привязки реальных серверов к виртуальному:

  1. В разделе Policy & ObjectsVirtual Servers, где продолжается настройка Virtual Server, создайте Real Servers.
  2. В таблице Real Servers нажмите Create New.
  3. В открывшемся окне добавьте IP-адрес и порт сервера, по которым требуется подключение. В данном случае HTTP-сервер развернут на 80 порту.
  4. Нажмите кнопку OK.
  5. Добавьте все сервера, участвующие в балансировке нагрузки, повторив пункты 1-4.
  6. Сохраните настройки Virtual Server, нажав кнопку OK.

HTTPS

Для работы балансировщика нагрузки FortiGate требуется загрузить SSL-сертификат.

Импортирование SSL-сертификата

Для добавления сертификата:

  1. Перейдите в раздел SystemCertificates.
  2. Убедитесь, что в SystemFeature Visibility включено Certificates.
  3. Выберите ImportLocal Certificate.
  4. В открывшемся окне установите Type — Certificate, загрузите Certificate file и Key file для вашего сертификата.
  5. Введите пароль в поле 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.

Создание политики

Чтобы создать политику безопасности, включающую виртуальный сервер балансировки нагрузки в качестве адреса назначения:

  1. Перейдите в раздел Policy & ObjectsPv4 Policy.
  2. Нажмите кнопку Create New.
  3. Укажите имя политики в поле Name.
  4. Укажите входящий интерфейс — Incoming interface, исходящий интерфейс — Outgoing interface, за которым подключены серверы.
  5. В поле источник (Source) выберите объект all, нажав +.
  6. В поле назначение (Destination) выберите виртуальный сервер балансировки нагрузки, который был создан ранее. Обратите внимание! Важно, чтобы режим Inspection mode был установлен в настройках политики на Proxy-based. Если режим будет установлен на Flow-based, то виртуальный сервер будет недоступен.
  7. Выключите режим NAT, чтобы серверы “видели” IP-адреса подключившихся клиентов.
  8. Для HTTP и HTTPS балансировщика политики создаются аналогичным образом. Разница только в выборе виртуального сервера в поле Destination.
  9. Нажмите кнопку OK, чтобы сохранить настройки политики.

Результат

В данном примере была настроена балансировка нагрузки HTTP-трафика между тремя серверами.

Запросы, поступающие по адресу виртуального сервера 172.20.120.121:3080, перенаправляются на реальные сервера по очереди в соответствии с выбранным методом.

Ниже продемонстрировано то, как при обращении по одному и тому же адресу происходит переключение между серверами. Для наглядности контент на каждом сервере различный.

Чтобы включить графическое отображение статусов серверов балансировщика, перейдите в раздел MonitorLoad 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