В этом тексте расскажем, как настроить резервированную схему сети с использованием двух файерволов (FortiGate) в разных локациях. Статья будет полезна всем, кто хочет построить отказоустойчивую инфраструктуру на уровне сети.

Подробно описанные шаги — под катом.

Какие задачи решает схема


Такое резервирование позволяет решить все перечисленные задачи одновременно:

  • Использовать разнообразные платформы — выделенные серверы, облачную платформу, облако VMware — для размещения проекта.
  • Объединить вычислительные ресурсы в единую изолированную сеть, защищенную от внешних угроз — например, DDoS-атак.
  • Разделить проект на несколько окружений (например, Production, Staging, Testing, Development), изолированных друг от друга на уровне сети провайдера.
  • Контролировать доступ как между проектами/окружениям, так и внешними сетями.
  • Сделать проект максимально доступным из интернета, даже в случае выхода из строя или планового обслуживания оборудования в одном из ДЦ.

Чтобы резервирование работало, необходимо настроить не только сеть, но и инфраструктуру, на которой будут работать клиентские проекты. В этом тексте мы затронем только сетевую часть настройки.

В рассматриваемом примере мы используем:

  • IaaS-продукты Selectel: выделенные серверы, облачную платформу, облако на базе VMware
  • Услугу 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.

Итоговая конфигурация портов в CLI для FortiGate MSK будет выглядеть так:

 config system interface
    edit "port1"
        set vdom "root"
        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 "root"
        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 "root"
        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, располагающемся в Санкт-Петербурге, чтобы сделать его бэкапом во внешней и локальной сети. Для этого будем использовать:

  1. AS Path Prepend (во внешней сети)
  2. 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.

Комментарии (3)


  1. shadowalone
    01.03.2022 02:19
    +1

    Какой ужас - использовать при включенном vdom, домен root как рабочий…

    Вам бы за это руки оторвать. В таком случае отключите vdom, или создайте отдельный рабочий домен, а root оставьте как management.


    1. kkxen Автор
      01.03.2022 12:07

      Здравствуйте! Большое спасибо за замечание. Цель текста была  показать, как вообще настроить отказоустойчивую схему BGP + Anycast, показать ее суть и работу. Информацию по настройке Fortigate скорректируем.


  1. algerka
    02.03.2022 20:08

    Какая-то сложная статья для восприятия.
    Что такое Master/Slave? Это FG кластер в режиме HA Active/Passive ?

    На мой взгляд, слабое решение с точки отказоустойчивости, раз внешние и внутренние каналы завязаны на одного провайдера, и совершенно отсутствует возможность подключения второго провайдера.
    Весь функционал можно было и средствами самого VmWare сделать, и ФГ тут лишний.
    Похоже, просто на рекламу selectel, а не какого-то интересного решения на ФГ :(