Как настроить резервированную схему сети с использованием протокола BGP и anycast-подсети
Как настроить резервированную схему сети с использованием двух файерволов (FortiGate) в разных локациях на инфраструктуре Selectel.
Введение
В данной инструкции расскажем, как настроить резервированную схему сети на инфраструктуре Selectel. Статья будет полезна всем, кто хочет построить отказоустойчивую инфраструктуру на уровне сети. Такая схема резервирования позволяет решить все перечисленные ниже задачи одновременно:
- Использовать разнообразные платформы — выделенные серверы, облачную платформу, облако VMware — для размещения проекта.
- Объединить вычислительные ресурсы в единую изолированную сеть, защищенную от внешних угроз — например, DDoS-атак.
- Разделить проект на несколько окружений (например, Production, Staging, Testing, Development), изолированных друг от друга на уровне сети провайдера.
- Контролировать доступ как между проектами/окружениям, так и внешними сетями.
- Сделать проект максимально доступным из интернета, даже в случае выхода из строя или планового обслуживания оборудования в одном из ДЦ.
Чтобы резервирование работало, необходимо настроить не только сеть, но и инфраструктуру, на которой будут работать клиентские проекты. В этом тексте мы затронем только сетевую часть настройки.
В рассматриваемом примере мы используем:
- IaaS-продукты Selectel.
- Услугу L3 VPN, которая строится на базе отдельной локальной сети Selectel, не пересекающейся с интернет-каналами.
- Разные VRF (Virtual Routing and Forwarding instance), или виртуальные маршрутизаторы, в локальной сети Selectel.
- Два файервола FortiGate, выполняющие роль пограничных роутеров и размещенные в разных городах.
- Внешнюю anycast-сеть, которая может быть доступна одновременно из разных местоположений (выдается дата-центром).
- Линковочные /29 подсети.
Итоговая схема сети выглядит так:
Теперь опишем все подробнее, ориентируясь на схему.
У нас есть роутинг-инстанс — vrf_1 (красные линии). Он объединяет вычислительные ресурсы, расположенные в Санкт-Петербурге и Москве: выделенные серверы, виртуальные машины, развернутые в облачной платформе Selectel и в облаке на базе VMware.
Для доступа к проектам из интернета выделена anycast-сеть 31.184.217.248/29.
Также выделены две внешние /29 сети для организации связи между FortiGate клиента и сетевым оборудованием провайдера. Адреса из данных сетей будут использоваться для настройки протоколов маршрутизации (Border Gateway Protocol, BGP), через которые клиент будет анонсировать свою anycast-сеть на оборудование в дата-центр. Также они могут использоваться для доступа в интернет.
Мы не используем /31 стыковочные сети, так как наш шлюз резервируется на базе технологии VRRP (подключено по умолчанию для FortiGate).
Чтобы реализовать расписанную схему, необходимо:
- Заказать необходимое количество выделенных серверов, файерволов, виртуальных машин.
- Понять, сколько изолированных виртуальных роутеров потребуется и какие серверы должны быть ими связаны.
- Определиться, сколько белых IP-адресов необходимо для доступа к клиентским сервисам из интернета.
- Заказать и настроить VRF.
- Настроить маршрутизации на клиентских серверах.
- Создать виртуальные машины с файерволами FortiGate.
- Настроить FG через CLI.
- Настроить BGP на FortiGate в локальной сети.
- Настроить BGP во внешней сети.
- Определить Master/Slave-роли для FortiGate.
- Настроить NAT на FortiGate.
- Протестировать схемы.
Заказ и настройка VRF
Мы опустим описание первых трех шагов, потому что они не связаны с настройками сети. О том, как арендовать серверы в Selectel, и что такое виртуальный роутер, можно почитать в базе знаний компании или обратиться за консультацией по почте sales@selectel.ru.
Итак, закажем необходимое количество VRF и добавим в них нужные серверы. Для этого нужно создать тикет через панель управления Selectel. Инструкция, как быстро создать локальную сеть, есть в базе знаний.
На данный момент конфигурировать такие сети можно самостоятельно через панель управления.
Мой текст тикета выглядел примерно так:
Здравствуйте!
Просьба собрать L3 VPN.
Локация: облачная платформа ru-7
Проект ID: d0f49f94c5a44b1dbe82ac41d20d635a
Подсеть: 10.10.1.0/24, в качестве шлюза будет выступать адрес 10.10.1.254, для резервирования с вашей стороны можете забрать адреса 10.10.1.252-10.10.1.253
Далее адреса для шлюза и резервирования для каждой подсети будут аналогичными.
Локация: облачная платформа ru-9
Проект ID: d0f49f94c5a44b1dbe82ac41d20d635a
Подсеть: 10.10.2.0/24
Локация: MSK-2
VLAN:2450
Подсеть: 10.10.3.0/24
Локация: SPB-5
VLAN:1303
Подсеть: 10.10.4.0/24
Локация: VMware SPB
Виртуальный дата-центр: s-3327-SPB1-S1-vDC59
Подсеть: 10.10.5.0/24
Локация: VMware MSK
Виртуальный дата-центр: s-3327-MSK1-S1-vDC30
Подсеть: 10.10.6.0/24
Какие изменения в инфраструктуре произойдут после этих действий?
В облачной платформе будет добавлена подсеть с доступом в локальную сеть L3 VPN. Для удобства ее можно переименовать. Чтобы изменить CIDR, потребуется оформить запрос через тикет-систему. Если вы планируете пользоваться сетью в дальнейшем, удалять ее нельзя, иначе придется заново открывать запрос на ее добавление в локальную сеть L3 VPN. Обращаем внимание, что существующую в облачной платформе подсеть добавить в L3 VPN невозможно по техническим причинам;
В облаке на базе VMware ситуация аналогичная: после заказа подсеть появится в vCloud Director.
Для выделенных серверов фиксированной конфигурации дополнительно просить о подключении локального порта не нужно. Серверы Selectel заранее подключены в обе плоскости сети — локальную и интернет.
Если у вас сервер произвольной конфигурации или вы разместили свое оборудование в Selectel (colocation), потребуется запросить подключение вашего оборудования к локальной сети Selectel через тикет
Дополнительно для построения BGP-сессий во внешней сети потребуется выделить по стандартной /29 внешней подсети для каждого файервола. В нашей схеме в
качестве примера будут использоваться сети 77.223.107.152/29 (Мск) и и 94.26.237.112/29 (СПб).
Настройка маршрутизации на клиентских серверах
Далее приступаем к базовой настройке всех серверов. Из начальных настроек нужно лишь указать адрес серверу и прописать маршрут по умолчанию в сторону шлюза, который находится на роутере Selectel.
Здесь будут полезны статьи по настройке маршрутов в L3 VPN-сети и настройке облака на базе VMware с нуля.
Создание виртуальных машин с файерволами FortiGate
В качестве файерволов мы выбрали Fortinet FortiGate (FG). Оба мы развернули из официального образа на виртуальной машине в облачной платформе. Отличий в конфигурировании виртуального и «железного» FG нет. Приступаем к развертыванию образа и настройке FG.
На что обратить внимание, если вы разворачиваете FortiOS на виртуальной машине в облачной платформе Selectel: для добавления портов в конфигурацию FG необходимо в панели управления облачной платформой на вкладке «Порты» добавить порт, затем программно перезапустить виртуальную машину с ОС FortiOS. Поэтому советуем заранее просчитать максимальное необходимое количество портов, которое потребуется для полноценной работы инфраструктуры с использованием FG.
В нашем примере потребуется добавить еще два порта (первый порт появляется, когда мы указываем его в поле «Сеть» при создании виртуальной машины).
В самой конфигурации на FG появится порт с базовой конфигурацией, адресации на нем никакой не будет. Но нужно учитывать, что определенный порт создан в определенном VLAN, подсеть которого ему назначена.
Первичная настройка FG через CLI
Продолжим настройку основной части схемы — файерволов. Первичная настройка, адресация на портах и BGP, производилась через CLI.
Чтобы не конфигурировать что-то в vdom (virtual domain) — по умолчанию («root»), следует создать новый vdom и там уже продолжить конфигурацию оборудования для организации схемы. В нашем примере это vdom «custom».
Итоговая конфигурация портов в CLI для FortiGate MSK будет выглядеть так:
config system interface
edit "port1"
set vdom "custom"
set ip 10.10.1.200 255.255.255.0
set allowaccess ping ssh
set type physical
set snmp-index 1
next
edit "port2"
set vdom "custom"
set ip 77.223.107.154 255.255.255.248
set allowaccess ping ssh http
set type physical
set snmp-index 5
next
edit "port3"
set vdom "custom"
set ip 31.184.217.250 255.255.255.248
set allowaccess ping
set type physical
set snmp-index 6
next
...
end
Port 1 — располагается в локальной сети, которая прокинута в L3 VPN;
Port 2 — внешняя адресация;
Port 3 — anycast-подсеть (для анонсирования подсети в интернет, так как активных сервисов на серверах у нас пока нет).
Настройка BGP на FortiGate в локальной сети
Для поднятия BGP-сессий с L3 VPN-роутерами Selectel необходимо сделать заявку через тикет в панели управления. В нем нужно указать IP-адрес, который используется на FortiGate (в примере это 10.10.1.200 и 10.10.2.200 на FortiGate MSK).
В ответе будет следующая информация:
- IP-адреса роутеров Selectel (в примере 10.10.1.252 и 10.10.1.253);
- Selectel ASN (в примере 64530);
- Ваша ASN (в примере 65500).
Пример запроса на подключение BGP во внешней сети:
Локация: MSK-1
VLAN: 2380
IP-адрес для BGP-сессии: 212.41.3.146
Маршрутная политика: default route only
Номер AS: 52016
ID услуги: b3d3fst1a-81tt-4d12-7c77-d028526d81b0
Для поднятия сессии BGP с пограничными маршрутизаторами и L3 VPN-маршрутизаторами провайдера необходимо написать запрос в техническую поддержку.
Итоговый конфиг BGP для локальной сети:
config router bgp
set as 65500
set router-id 10.10.1.200
config neighbor
edit "10.10.1.252"
set interface "port1"
set remote-as 64530
next
edit "10.10.1.253"
set interface "port1"
set remote-as 64530
next
end
Можно также настроить BGP через neighbor-range. Это значит, что сессия поднимется с любым адресом из заданного диапазона:
config neighbor-group
edit "selectel"
set remote-as 64530
next
end
config neighbor-range
edit 2
set prefix 10.20.1.0 255.255.255.0
set neighbor-group "selectel"
next
end
Несмотря на то, что router-id отличен от того, который сконфигурирован как адрес соседа на другом конце, сессия установится в Established. В качестве router-id может быть указан внешний адрес, тогда сессии поднимутся и во внешней, и в локальной сетях. Если router-id будет содержать в себе адрес из диапазона локальных адресов, то локальные сессии поднимутся, а внешние нет.
Настройка BGP во внешней сети
Чтобы сессии установились во внешней сети, потребовалось изменить адрес router-id на внешний. Сессии в локальной сети при этом переустановились.
FG анонсирует в интернет подсеть 31.184.217.248/29 (напомним, что это anycast-подсеть) и принимает маршрут по умолчанию (0.0.0.0/0) от пограничных роутеров Selectel.
В Selectel для успешного построения BGP-сессии с бордерными роутерами необходимо:
- прописать опцию multihop (set ebgp-enforce-multihop enable),
- выставить TTL не менее 10 (set ebgp-multihop-ttl),
- прописать статический маршрут до адреса соседа (в нашем случае достаточно будет маршрута до /32 адреса).
С учетом всех вводных итоговый конфиг выглядит так:
config router bgp
set as 65500
set router-id 77.223.107.154
config neighbor
edit "<selectel-brd-1>"
set ebgp-enforce-multihop enable
set ebgp-multihop-ttl 10
set interface "port2"
set prefix-list-in "default_from_selectel_inet"
set prefix-list-out "anycast_subnet_out"
set remote-as 50340
next
edit "<selectel-brd-2>"
set ebgp-enforce-multihop enable
set ebgp-multihop-ttl 10
set interface "port2"
set prefix-list-in "default_from_selectel_inet"
set prefix-list-out "anycast_subnet_out"
set remote-as 50340
next
end
config router prefix-list
edit "anycast_subnet_out"
config rule
edit 1
set prefix 31.184.217.248 255.255.255.248
unset ge
unset le
next
edit 2
set action deny
set prefix any
unset ge
unset le
next
end
next
edit "default_from_selectel_inet"
config rule
edit 1
set prefix 0.0.0.0 0.0.0.0
unset ge
unset le
next
end
next
end
config router static
edit 4
set dst <selectel-brd-1> 255.255.255.255
set gateway 77.223.107.153
set device "port2"
next
edit 1
set dst <selectel-brd-2> 255.255.255.255
set gateway 77.223.107.153
set device "port2"
next
end
В результате мы получили следующую таблицу маршрутизации на FG:
Видим, что есть активный дефолтный маршрут, который изучен от одного из бордерных роутеров по BGP. Этот же дефолтный маршрут анонсируется в локальную сеть самим файерволом.
Так как мы добавили еще port 3 с адресом из anycast-подсети, сделаем так, чтобы данная подсеть начала анонсироваться через BGP и стала доступна из интернета. Для этого необходимо настроить редистрибуцию на FortiGate следующим образом:
config redistribute "connected"
set status enable
end
Аналогично настраиваем сессию со вторым бордерным роутером.
Таким же образом настраиваем FG в СПб.
Определение Master/Slave ролей для FortiGate
Рассматриваемая нами топология предполагает, что FortiGate работают по схеме Master/Slave. В нашем случае мастером будет FortiGate в Москве, а бэкапом — FG в Санкт-Петербурге. Это значит, что при отсутствии нештатных ситуаций в инфраструктуре, все активные сервисы будут располагаться и работать в московской части инфраструктуры.
Как обеспечить распределение ролей для FortiGate, мы описали ниже.
Применим список правил (route-map, объект, в котором указываются атрибуты для управления приоритетами маршрутов) на FG, располагающемся в Санкт-Петербурге, чтобы сделать его бэкапом во внешней и локальной сети. Для этого будем использовать:
- AS Path Prepend (во внешней сети)
- MED (в локальной сети).
Такие методы вывода одного из FG в бэкап могут игнорироваться на стороне оператора связи, в связи с особенностями конфигурации, поэтому рекомендуем уточнить у оператора связи возможность обработки отправляемых атрибутов маршрутизации для анонсируемых подсетей.
Technical Tip: BGP AS-Path Prepending Configuration Example
Настройки route-map на FG в СПб (бэкап):
config router route-map
edit "Secondary_exit"
config rule
edit 1
set set-aspath "65500 65500 65500"
unset set-ip-nexthop
unset set-ip6-nexthop
unset set-ip6-nexthop-local
unset set-originator-id
next
end
next
edit "Secondary_exit_local"
config rule
edit 1
unset set-ip-nexthop
unset set-ip6-nexthop
unset set-ip6-nexthop-local
set set-metric 500
unset set-originator-id
next
end
next
end
В это время активный маршрут до anycast-подсети 31.184.217.248/29 ведет на московский FG.
Настройка NAT на FortiGate
Далее для упрощения конфигурирования правил NAT можно перейти в WEB панель FG.
Настраиваем SNAT (механизм подмены адреса источника пакета):
Метод: One-to-one (механизм подмены локального адреса на внешний).
Внешний адрес: адрес из anycast-подсети.
Настраиваем DNAT (механизм подмены адреса назначения пакета):
В данном примере 10.10.6.2 — это адрес виртуальной машины в VMware.
P.S: На FG DST NAT называется VIP (Virtual IPs).
Настройка Firewall Policy на FortiGate
Создаем необходимые файервольные правила для прохождения трафика из интернета в локальную сеть и обратно.
Те же настройки нужно будет добавить на FG в СПб.
Пример настроек из примера выше в CLI:
config firewall policy
edit 1
set name "LAN_to_WAN"
set uuid f122f4a0-d40d-51eb-13d6-2bcda4bbb967
set srcintf "port1"
set dstintf "port2"
set srcaddr "lan_vrf_1"
set dstaddr "all"
set action accept
set schedule "always"
set service "ALL_TCP" "PING" "SSH" "TRACEROUTE"
set ippool enable
set poolname "snat"
set nat enable
next
edit 2
set name "WAN_to_LAN"
set uuid 19ad41c8-d40e-51eb-5332-1b1f167774ff
set srcintf "port2"
set dstintf "port1"
set srcaddr "all"
set dstaddr "WAN_to_LAN_31.184.217.252"
set action accept
set schedule "always"
set service "ALL_TCP" "PING" "SSH" "TRACEROUTE"
set fixedport enable
set nat enable
next
end
lan_vrf_1 — это подсеть 10.10.0.0/16.
edit "lan_vrf_1"
set uuid c90d6cf2-d40d-51eb-9a1d-554fdb82ae1d
set subnet 10.10.0.0 255.255.0.0
next
end
WAN_to_LAN_31.184.217.252 — это правило DST NAT.
config firewall vip
edit "WAN_to_LAN_31.184.217.252"
set uuid b767c3a0-3b2b-51ec-b73d-62bc3b513471
set extip 31.184.217.252
set mappedip "10.10.6.2"
set extintf "any"
set portforward enable
set protocol icmp
next
end
Это не все настройки, которые необходимо сделать на файерволах. В связи с некоторыми багами, с которыми мы столкнулись во время тестирования схемы, придется дополнительно изменить некоторые настройки по умолчанию. Подробнее об этом ниже.
Тестирование схемы (часть 1)
На схеме FortiGate в Санкт-Петербурге является бэкапом (мы настроили такое поведение в разделе «Определение Master/Slave ролей для FortiGate» ), и все активные маршруты ведут на FortiGate в Москве.
Рассмотрим схему в действии с разных сторон.
Сначала посмотрим влияние отключения мастер-файервола, располагающегося в Москве, для серверов/виртуальных машин, находящихся в локальной сети, и на их возможность выходить в интернет.
Возьмем, например, железный сервер в СПб (10.10.4.2) и виртуальную машину в Москве в облаке VMware (10.10.6.2).
10.10.4.2
10.10.6.2
Сейчас на этих машинах есть доступ в интернет. Между собой машины также могут обмениваться трафиком по локальной сети.
10.10.4.2:
10.10.6.2:
Трафик в интернет идет через файервол. Внешних адресов на этих серверах нет.
10.10.4.2:
10.10.6.2:
Проверяем отсутствие возможности у серверов выйти в интернет при отключении файервола в Москве (мастер-файервол). На машинах запущена команда «ping 8.8.8.8».
Отключаем файервол в панели управления:
Результаты запуска утилиты ping:
с машины 10.10.4.2:
с машины 10.10.6.2:
Трассировка до отключения (слева) и после (справа) московского FortiGate:
с машины 10.10.4.2:
с машины 10.10.6.2:
Видим, что трафик после отключения московского мастер-файервола пошел через резервный FG, расположенный в СПб.
Тестируем возвращение мастер-файервола.
Результаты пинга 8.8.8.8:
с машины 10.10.4.2:
с машины 10.10.6.2:
По трассировкам будет видна обратная ситуация: сначала трафик шел через СПб, потом ушел в МСК.
Фиксируем приличные потери. Это происходит потому, что сессия в интернет-сети поднимается на долю секунды быстрее, чем в локальной сети. Поэтому дефолтный маршрут (0.0.0.0/0) начинает анонсироваться в локальную сеть только при следующем сообщении BGP update. По дефолту на FG таймер анонсирования подсетей равен 30 секундам. Чтобы уменьшить время даунтайма, выставим таймер в 2 секунды на московском FG для соседей в локальной сети.
Настройка таймера:
config neighbor
Description: BGP neighbor table.
edit <ip>
set advertisement-interval {integer}
Итоговый конфиг для соседей в локальной сети:
config router bgp
set as 65500
set router-id *белый IP-адрес*
config neighbor
edit "10.10.1.252"
set advertisement-interval 2
set interface "port1"
set remote-as 64530
next
edit "10.10.1.253"
set advertisement-interval 2
set interface "port1"
set remote-as 64530
next
end
Повторим тестирование и снимем результаты доступности внешего ресурса 8.8.8.8 после включения московского файервола.
Результаты пинга 8.8.8.8:
10.10.4.2:
10.10.6.2:
Вероятно, изменение таймеров — не самое лучшее решение проблемы, но оперативно найти и применить какой-либо другой workaround не удалось.
Тестирование схемы (часть 2)
Далее проверим доступность сервисов, которые работают на серверах и виртуальных машинах в локальной сети, из интернета.
Для простоты представим, что на виртуальной машине в Москве 10.10.6.2 крутится сервис, который транслируется через NAT на anycast-адрес 31.184.217.252.
На обоих файерволах настроено одно и то же правило DST NAT:
Из любой сети (домашняя/офисная/другая) ставим на ping адрес 31.184.217.252 и/или запускаем трассировку.
Выключаем мастер FG (московский) через панель управления, тем самым имитируем аварию/работы.
Спустя несколько миллисекунд во внешней сети маршрут перестраивается, и теперь anycast-подсеть доступна через петербургский FG.
Слева — до отключения FG в МСК, справа — после.
Результаты пинга:
Включаем московский FG в панели управления.
Получаем следующий результат утилиты ping:
Заключение
Мы описали сборку и базовую настройку отказоустойчивой схемы сети с использованием файерволов (Fortinet FortiGate) в разных регионах. Безусловно, все достоинства данной схемы сложно продемонстрировать в одном тексте. Какие-то функции вы можете «подкрутить» или подключить самостоятельно, что даст возможность более гибко подстроить текущую схему под ваши цели и задачи.
На данный момент описанная схема уже эксплуатируется в реальных проектах на сети Selectel.
Если возникнут вопросы или предложения по дополнению и улучшению схемы, пишите в комментарии. Кроме того, если вы клиент Selectel или хотите им стать, сотрудники компании помогут развернуть такую архитектуру в рамках услуги Managed Services.