Привет, Хабр! Меня зовут Алексей, я участвую в разработке операционной системы для линейки коммутаторов KORNFELD в YADRO. Ранее я писал об организации L2-связности — она покрывает только часть потребностей, и рано или поздно требуется связать VXLAN-сегменты между собой или с внешними сетями. В этой статье рассмотрим варианты решения такой задачи. Все примеры беру из практики работы с KORNFELD, ��ак как логика настройки и синтаксис схожи с популярными вендорами.

В прошлой публикации я описал примеры настройки L2 EVPN/VXLAN и привел глоссарий. Там можно посмотреть значения терминов, которые я использую и в этой статье.

Вариантов создать L3-связность не так много:

  • централизованная модель:

    • централизованный шлюз (centralized gateway),

  • распределенная модель:

    • асимметричный шлюз (asymmetric IRB),

    • симметричный шлюз (symmetric IRB).

Все эти решения поддерживаются в Kornfeld OS. Разберемся, как в теории работает каждое из них.

Централизованный шлюз

Эта схема похожа на inter-vlan routing, когда необходимо дотянуть VLAN до устройства, которое будет маршрутизировать пакеты между интерфейсами. Только в случае централизованного шлюза дотянуть нужно VXLAN-сегменты, то есть придется создать все EVI, для которых делаем маршрутизацию. Кроме того, необходимо анонсировать RT-2-маршрут с информацией о MAC- и IP-адресах шлюза. Трафик к шлюзу и от него доставляется в пользовательских сегментах. Резервирование работает с помощью VRRP или SAG-интерфейсов.

Асимметричный шлюз

Схема работы асимментричного шлюза
Схема работы асимментричного шлюза

Чтобы было понятнее: на картинке все VTEP выполняют роль шлюза, но на деле не всегда это именно так. Могут быть задействованы только те VTEP, к которым присоединен сегмент, участвующий в маршрутизации. Видно, что есть отличие от централизованной модели, но в чем особенности?

Так как модель распределенная, то маршрутизация (L3-lookup) выполняется на нескольких устройствах. В асимметричном варианте — на входящем VTEP с последующей коммутацией трафика в целевом EVI. То есть исходящий VTEP получает трафик в том EVI, в котором находится получатель, и ему нужно только выполнить декапсуляцию. В этом заключается асимметричность.

Роли VTEP:

  • Входящий (ingress) VTEP — тот, что получил трафик от хоста и выполнил инкапсуляцию VXLAN.

  • Исходящий (egress) VTEP — тот, что выполнил декапсуляцию VXLAN и передал трафик в сторону хоста.

Эти роли справедливы исключительно относительно конкретного VXLAN-туннеля.

На каждом VTEP, выполняющем роль шлюза, создаются EVI, для ко��орых обеспечивается маршрутизация, даже если локальных подключений для этого EVI на VTEP не существует. Анонсировать информацию о шлюзе не требуется, адресация шлюза имеет значение в пределах VTEP и используется локально подключенными ресурсами.

Симметричный шлюз

Схема работы симметричного шлюза
Схема работы симметричного шлюза

Особенность метода — для маршрутизации между сегментами и внешними сетями используется дополнительный служебный сегмент L3 EVI, с которым через VRF объединяются пользовательские сегменты, а передача трафика между VTEP производится на основе VNI служебного сегмента. На каждом VTEP создается экземпляр L3 EVI. Таким образом, маршрутизация (L3-lookup) выполняется дважды: на входящем и исходящем VTEP.

Любой из вариантов шлюза может использовать как уникальную адресацию (IP- и MAC-адреса), так и SAG-интерфейсы с идентичными IP- и MAC-адресами. Далее будем рассматривать шлюзы совместно с SAG.

Если хотите работать сетевым инженером в KORNFELD, оставьте заявку на эти вакансии:

Настройка L3 overlay-сети

Перед нами стоит задача обеспечить взаимодействие между изолированными пользовательским сегментами через L3 overlay-сеть, а также выход во внешние сети. Для экспериментов будем использовать ту же топологию, что и в прошлый раз, добавив к ней имитацию внешней сети.

L3 overlay-сеть
L3 overlay-сеть

В ней уже организованы связность в underlay-сети на основе EBGP и L2 overlay-сегменты для подключенн��х клиентов. EVPN-сессии активны:

spine1# show bgp l2vpn evpn summary
BGP router ID    : 10.113.0.1
Local AS number  : 1000
BGP table version: 0
RIB entries      : 9
---------------------------------------------------------------------------------------------------------
Neighbor    Description    AS    State/PfxRcd    Up/Down    TblVer    MsgRcvd    MsgSent    InQ    OutQ
----------  -------------  ----  --------------  ---------  --------  ---------  ---------  -----  ------
10.113.1.1  LEAF-1         100   2               01w0d17h   2092      19519      19521      0      0
10.113.1.3  LEAF-2         200   2               01w0d17h   2092      19517      19521      0      0
10.113.1.5  LEAF-3         300   3               01w0d17h   2092      19520      19520      0      0
10.113.1.7  LEAF-4         400   2               01w0d17h   2092      19518      19520      0      0

Total: 4

MAC-адреса по фабрике разошлись:

leaf3# show evpn mac
Flags: D - duplicate, G - default gateway, I - local-inactive, P - peer-active,
       S - sticky, V - SVI, X - peer-proxy
------------------------------------------------------------------------------
VNI    MAC                VLAN    Origin    Intf/VTEP/ESI    MM Seq    Flags
-----  -----------------  ------  --------  ---------------  --------  -------
1001   52:A8:00:01:01:10  101     remote    10.113.100.1     0/0
1001   52:A8:00:01:01:31  101     local     Ethernet10       0/0
1001   52:A8:00:01:01:40  101     remote    10.113.100.4     0/0
1002   52:A8:00:01:02:20  102     remote    10.113.100.2     0/0
1002   52:A8:00:01:02:32  102     local     Ethernet11       0/0
Total: 5

Далее посмотрим, как в Kornfeld OS запустить такие шлюзы.

Централизованный шлюз

Шлюз можно разместить на одном устройстве, но лучше предусмотреть два или более — для повышения отказоустойчивости. Будем использовать leaf-1 и leaf-2. Для этого дотянем до них недостающие VXLAN-сегменты и создадим SVI-интерфейсы с адресацией из нужных нам сетей.

По конфигурации нужно сделать следующее:

  • создать сегменты на leaf-1 и leaf-2,

  • создать SVI (SAG), поместить в нужный VRF,

  • анонсировать адресацию шлюза.

На примере leaf-1 это будет выглядеть так:

1. Создали нужный нам VLAN с любым ID и добавили его к VXLAN-сегменту, который дотягиваем:

configure terminal 
vlan 102
!
interface vxlan vtep1
 map vni 1002 vlan 102
!
end

2. Создали VRF и поместили в него шлюзы. Хоть SAG и выглядит как SVI-интерфейс, но настраивается немного иначе. MAC-адрес, используемый SAG-интерфейсами внутри одной коробки, задается глобально:

configure terminal
!
ip vrf Vrf1
!
ip anycast-address enable
ip anycast-mac-address 00:00:5E:00:01:12
!
interface Vlan101
ip vrf forwarding Vrf1
ip anycast-address 192.168.101.1/24
!
interface Vlan102
 ip vrf forwarding Vrf1
 ip anycast-address 192.168.102.1/24
!
end

Предпочтительнее использовать MAC-адрес из диапазона 00-00-5E-00-01-xx, чтобы избежать конфликтов с адресацией подключенных ресурсов, так как MAC-адрес SAG-интерфейса не изучается в VLAN, которому соответствует SVI.

Посмотрим, что получилось.

leaf1# show ip static-anycast-gateway
Static anycast gateway enabled: yes
Anycast gateway MAC address   : 00:00:5E:00:01:12
Total number of gateways      : 2
In administrative UP state    : 2
In operational UP state       : 2
------------------------------------------------------
Interface    Gateway address    VRF    Admin    Oper
-----------  -----------------  -----  -------  ------
Vlan101       192.168.101.1/24  Vrf1   up       up
Vlan102       192.168.102.1/24  Vrf1   up       up

leaf1# show ip route vrf Vrf1
Codes:  K - kernel route, C - connected, S - static, B - BGP, O - OSPF
        > - selected route, * - FIB route, q - queued route, r - rejected route, # - not installed in hardware
       Destination       Gateway  Interface  Dist/Metric  Uptime    Tag
-------------------------------------------------------------------------
 C>*   192.168.101.0/24  Direct   Vlan101    0/0          00:00:43
 C>*   192.168.102.0/24  Direct   Vlan102    0/0          00:00:43

С этим можно работать. Но для чего мы планировали анонсировать адресацию шлюза? Если на данном шаге отправить трафик на шлюз или в другой сегмент, например, с srv4, то на leaf4 увидим не очень приятную картину:

11:55:53.352966 52:a8:00:00:44:44 > 52:a8:00:00:10:00, ethertype IPv4 (0x0800), length 148: (tos 0x0, ttl 64, id 56005, offset 0, flags [none], proto UDP (17), length 134)
    10.113.100.4.50958 > 10.113.100.1.4789: VXLAN, flags [I] (0x08), vni 1001
52:a8:00:01:01:40 > 00:00:5e:00:01:12, ethertype IPv4 (0x0800), length 98: (tos 0x0, ttl 64, id 29069, offset 0, flags [DF], proto ICMP (1), length 84)
    192.168.101.40 > 192.168.101.1: ICMP echo request, id 3, seq 134, length 64

11:55:54.355139 52:a8:00:00:44:44 > 52:a8:00:00:10:00, ethertype IPv4 (0x0800), length 148: (tos 0x0, ttl 64, id 59885, offset 0, flags [none], proto UDP (17), length 134)
    10.113.100.4.50958 > 10.113.100.3.4789: VXLAN, flags [I] (0x08), vni 1001
52:a8:00:01:01:40 > 00:00:5e:00:01:12, ethertype IPv4 (0x0800), length 98: (tos 0x0, ttl 64, id 29250, offset 0, flags [DF], proto ICMP (1), length 84)
    192.168.101.40 > 192.168.101.1: ICMP echo request, id 3, seq 135, length 64

Один и тот же запрос отправляется на 10.113.100.1 и 10.113.100.3. Это работает ingress replication для BUM-трафика. Но откуда BUM в запросе unicast-адреса? Нет EVPN-маршрутов на L2-VTEP до шлюза, а значит, нет и данных в EVPN.

leaf4# show evpn mac
Flags: D - duplicate, G - default gateway, I - local-inactive, P - peer-active,
       S - sticky, V - SVI, X - peer-proxy
------------------------------------------------------------------------------
VNI    MAC                VLAN    Origin    Intf/VTEP/ESI    MM Seq    Flags
-----  -----------------  ------  --------  ---------------  --------  -------
1001   52:A8:00:01:01:10  101     remote    10.113.100.1     0/0
1001   52:A8:00:01:01:31  101     remote    10.113.100.3     0/0
1001   52:A8:00:01:01:40  101     local     Ethernet10       0/0
Total: 3

Включим анонсы и перепроверим.

configure terminal
!
router bgp 100
 !
 address-family l2vpn evpn
  advertise-default-gw
!
end

Появилась запись шлюза.

leaf4# show evpn mac
Flags: D - duplicate, G - default gateway, I - local-inactive, P - peer-active,
       S - sticky, V - SVI, X - peer-proxy
------------------------------------------------------------------------------
VNI    MAC                VLAN    Origin    Intf/VTEP/ESI    MM Seq    Flags
-----  -----------------  ------  --------  ---------------  --------  -------
1001   00:00:5E:00:01:12  101     remote    10.113.100.1     0/0       G
1001   52:A8:00:01:01:10  101     remote    10.113.100.1     0/0
1001   52:A8:00:01:01:31  101     remote    10.113.100.3     0/0
1001   52:A8:00:01:01:40  101     local     Ethernet10       0/0
Total: 4

Она сформировалась на основании одного из полученных маршрутов — от leaf1 или leaf2. Поэтому пока один из них «жив», мы можем роутить трафик.

Route Distinguisher: 10.113.100.1:2
 *  [2]:[0]:[48]:[00:00:5E:00:01:12]:[32]:[192.168.101.1]
                    10.113.100.1                           0 1000 100 i
                    RT:100:1001 ET:8 Default Gateway
 *> [2]:[0]:[48]:[00:00:5E:00:01:12]:[32]:[192.168.101.1]
                    10.113.100.1                           0 1000 100 i
                    RT:100:1001 ET:8 Default Gateway

***************************вывод сокращен************************** 

Route Distinguisher: 10.113.100.2:3
 *> [2]:[0]:[48]:[00:00:5E:00:01:12]:[32]:[192.168.101.1]
                    10.113.100.2                           0 1000 200 i
                    RT:200:1001 ET:8 Default Gateway
 *  [2]:[0]:[48]:[00:00:5E:00:01:12]:[32]:[192.168.101.1]
                    10.113.100.2                           0 1000 200 i
                    RT:200:1001 ET:8 Default Gateway

Путей четыре, так как маршрут от leaf1 и leaf2 мы получаем от spine1 и spine2.

У резервирования централизованного шлюза на SAG есть небольшой нюанс, который нужно учесть: в случае разрешения IP-адреса клиента одним из SAG (например, leaf1), ARP-reply от клиента может приземлиться на другой SAG (leaf2). В результате SAG (leaf1), пославший запрос, будет продолжать попытки разрешения. Обойти это можно, используя ARP Suppression на L2-VTEP. Таким образом, они будут распространять RT-2-маршрут для искомого узла, что позволит установить ARP-запись на всех SAG. Для этого нужно добавить такие настройки на leaf3 и leaf4, именно они в нашей схеме реализуют L2-VTEP. Пример для leaf3:

configure terminal
!
interface Vlan 101
!
interface Vlan 102
!
interface vxlan vtep1
 arp-suppression interface Vlan101
 arp-suppression interface Vlan102
!
end

Также это уменьшит количество флуда в фабрике, позволит VTEP явно анонсировать локальные ARP-записи.

В целом все готово. Осталось добавить маршруты на шлюз на хостах и проверить связность. Выход на внешние сети организуется непосредственно на Border leaf при помощи какого-нибудь протокола маршрутизации или размещением статического маршрута на внешний ресурс. Сейчас внешний мир имитирует сеть 192.168.0.255/32 на WAN/EDGE-устройстве, на Border leaf на нее установлен статический маршрут по умолчанию.

[root@srv4 ~]$ ping -c 2 192.168.102.20
PING 192.168.102.20 (192.168.102.20) 56(84) bytes of data.
64 bytes from 192.168.102.20: icmp_seq=1 ttl=63 time=3.48 ms
64 bytes from 192.168.102.20: icmp_seq=2 ttl=63 time=3.20 ms

--- 192.168.102.20 ping statistics ---

2 packets transmitted, 2 received, 0% packet loss, time 1002ms
rtt min/avg/max/mdev = 3.199/3.340/3.481/0.141 ms

[root@srv4 ~]$ ping -c 2 192.168.102.32
PING 192.168.102.32 (192.168.102.32) 56(84) bytes of data.
64 bytes from 192.168.102.32: icmp_seq=1 ttl=63 time=4.97 ms
64 bytes from 192.168.102.32: icmp_seq=2 ttl=63 time=3.65 ms

--- 192.168.102.32 ping statistics ---

2 packets transmitted, 2 received, 0% packet loss, time 1002ms
rtt min/avg/max/mdev = 3.653/4.310/4.967/0.657 ms

[root@srv4 ~]$ ping -c 2 192.168.0.255
PING 192.168.0.255 (192.168.0.255) 56(84) bytes of data.
64 bytes from 192.168.0.255: icmp_seq=1 ttl=63 time=3.71 ms
64 bytes from 192.168.0.255: icmp_seq=2 ttl=63 time=3.44 ms

--- 192.168.0.255 ping statistics ---

2 packets transmitted, 2 received, 0% packet loss, time 1001ms
rtt min/avg/max/mdev = 3.438/3.572/3.706/0.134 ms

srv4 (192.168.101.40) -> 192.168.0.255 (192.168.0.255) 2025-12-05T11:42:41+0300
Keys:  Help   Display mode   Restart statistics   Order of fields   quit

                                       Packets               Pings

 Host                                Loss%   Snt   Last   Avg  Best  Wrst StDev
 1. 192.168.101.1                     0.0%    33    2.2   1.7   1.1   5.3   0.7
 2. 192.168.0.255                     0.0%    33    4.1   3.7   3.3   4.2   0.3

Маршрутизация выполняется в Vrf1 между SVI-интерфейсами на leaf1 или leaf2, доставка трафика — в VNI, которому принадлежит узел-получатель.

Схематично процесс выглядит так:

Процесс работы централизованного шлюза
Процесс работы централизованного шлюза
  1. SRV A1 инициирует передачу данных на шлюз согласно своей таблице маршрутизации в пользовательском VLAN A.

  2. Входящий VTEP A получает кадр в клиентском VLAN, в поле DST_MAC которого содержится MAC-адрес его SVI-интерфейса, выполняет декапсуляцию трафика  и передает пакет на маршрутизацию. Взаимосвязь между EVI и VRF определяется связкой SVI-VLAN-VNI и размещением данного SVI в VRF. Так определяется набор AC, для которых шлюз будет обеспечивать маршрутизацию в рамках конкретного VRF.

  3. По таблице маршрутизации VRF определяется исходящий интерфейс — SVI B.

  4. Связка SVI-VLAN-VNI определит целевой EVI, метку VNI которого следует использовать при создании VXLAN-туннеля для доставки трафика на удаленный VTEP. Трафик от шлюза к получателю доставляется в VXLAN-сегменте получателя.

  5. Исходящий VTEP B получает трафик в том EVI, в котором получатель, выполняет декапсуляцию трафика (терминацию VXLAN-заголовка) и коммутацию кадра в клиентский интерфейс.

  6. SRV B2 принимает данные от шлюза в VLAN B.

У этой конструкции есть недостаток: то, как устроена передача данных через фабрику до шлюза и обратно, даже если сегменты подключены к одному коммутатору.

Распределенный асимметричный шлюз

В асимметричной модели у каждого VTEP должны быть все используемые связки VLAN-VNI, а также все шлюзы для маршрутизации внутри overlay-сети. Анонсировать информацию о шлюзе не нужно, поскольку он и так будет настроен на каждом VTEP. Для адресации также используем SAG. Перейдем к настройкам, используем схему в исходном состоянии.

Для возврата к начальном�� состоянию загрузим ранее сохраненную конфигурацию командой copy saved-configuration <saved-config-name> running-configuration.

На каждом leaf-коммутаторе приведем конфигурацию к следующему виду:

configure terminal
!
ip anycast-mac-address 00:00:5e:00:01:12
ip anycast-address enable
!
ip vrf Vrf1
!
vlan 101-102
!
interface Vlan101
 ip vrf forwarding Vrf1
 ip anycast-address 192.168.101.1/24
!
interface Vlan102
 ip vrf forwarding Vrf1
 ip anycast-address 192.168.102.1/24
!
interface vxlan vtep1
 source-ip <loopback_ip>
 map vni 1001 vlan 101
 map vni 1002 vlan 102
!
end

Для всех VTEP настройки идентичны, кроме параметра source-ip. На этом настройка закончена. У VTEP есть набор интерфейсов, каждый из которых, с одной стороны, связан с уникальным VXLAN-сегментом, с другой — входит в общее пространство Vrf1. Таким образом, каждый VTEP принимает решение о маршрутизации исключительно локально, перекладывая трафик между присоединенными к VRF интерфейсами. В отличие от централизованной модели, трафик не ходит к шлюзу по фабрике, целевой сегмент определяется на входящем VTEP.

Выход на внешние сети внутри чистой асимметричной модели реализовать проблематично. Главная проблема — как доставлять маршруты в VRF на VTEP. Так или иначе, для этого понадобится L3 EVI, а также поддержка overlay-index, который не доступен в релизе Kornfeld OS 1.7 и пока только в планах. Оставим эту задачу для симметричной модели и проверим состояние фабрики после введенной конфигурации.

Посмотрим, что вышло из конфигурации. show evpn vni detail говорит, что на остальных VTEP есть тот же набор EVI.

leaf1# show evpn vni detail
------------------------------------------------
VNI 1001
------------------------------------------------
Type                              : L2
VRF                               : Vrf1
Mapped VLAN ID                    : 101
SVI interface                     : Vlan101
Source VTEP IP                    : 10.113.100.1
ARP suppression                   : disabled
Advertisement of SVI MAC/IP       : disabled
Advertisement of default GW MAC/IP: disabled
MACs learned in VN                : 3
ARPs learned in VN                : 3
Remote VTEPs                      : 10.113.100.2
                                    10.113.100.3
                                    10.113.100.4

------------------------------------------------
VNI 1002
------------------------------------------------
Type                              : L2
VRF                               : Vrf1
Mapped VLAN ID                    : 102
SVI interface                     : Vlan102
Source VTEP IP                    : 10.113.100.1
ARP suppression                   : disabled
Advertisement of SVI MAC/IP       : disabled
Advertisement of default GW MAC/IP: disabled
MACs learned in VN                : 2
ARPs learned in VN                : 2
Remote VTEPs                      : 10.113.100.2
                                    10.113.100.3
                                    10.113.100.4

Информация о MAC-адресах, ARP-записях из EVPN-маршрутов RT-2 (MAC + IP), попадает в таблицы соответствующего EVI.

leaf1# show evpn mac
Flags: D - duplicate, G - default gateway, S - sticky, V - SVI
-------------------------------------------------------------------------------
VNI    MAC                VLAN    Origin    Interface/VTEP    MM Seq    Flags
-----  -----------------  ------  --------  ----------------  --------  -------
1001   52:A8:00:01:01:10  101     local     Ethernet43        0/0
1001   52:A8:00:01:01:31  101     remote    10.113.100.3      0/0
1001   52:A8:00:01:01:40  101     remote    10.113.100.4      0/0
1002   52:A8:00:01:02:20  102     remote    10.113.100.2      0/0
1002   52:A8:00:01:02:32  102     remote    10.113.100.3      0/0

Total: 5

leaf1# show evpn arp-cache
Flags: D - duplicate, G - default gateway, V - SVI
-------------------------------------------------------------------------------------------
VNI    IP address      MAC address        Origin    State    MM Seq    Flags    VTEP
-----  --------------  -----------------  --------  -------  --------  -------  ------------
1001   192.168.101.10  52:A8:00:01:01:10  local     active   0/0
1001   192.168.101.31  52:A8:00:01:01:31  remote    active   0/0                10.113.100.3
1001   192.168.101.40  52:A8:00:01:01:40  remote    active   0/0                10.113.100.4
1002   192.168.102.20  52:A8:00:01:02:20  remote    active   0/0                10.113.100.2
1002   192.168.102.32  52:A8:00:01:02:32  remote    active   0/0                10.113.100.3

Total: 5

Это нам дает связь между сегментами.

[root@srv2 ~]$ ip neighbor
192.168.102.1 dev eth2 lladdr 00:00:5e:00:01:12 STALE
192.168.102.32 dev eth2 lladdr 52:a8:00:01:02:32 REACHABLE

[root@srv2 ~]$ ping -c 2 192.168.101.10
PING 192.168.101.10 (192.168.101.10) 56(84) bytes of data.
64 bytes from 192.168.101.10: icmp_seq=1 ttl=63 time=0.088 ms
64 bytes from 192.168.101.10: icmp_seq=2 ttl=63 time=0.269 ms

--- 192.168.101.10 ping statistics ---

2 packets transmitted, 2 received, 0% packet loss, time 1011ms
rtt min/avg/max/mdev = 0.088/0.178/0.269/0.090 ms

[root@srv2 ~]$ ping -c 2 192.168.101.31

PING 192.168.101.31 (192.168.101.31) 56(84) bytes of data.
64 bytes from 192.168.101.31: icmp_seq=1 ttl=63 time=0.337 ms
64 bytes from 192.168.101.31: icmp_seq=2 ttl=63 time=0.294 ms

--- 192.168.101.31 ping statistics ---

2 packets transmitted, 2 received, 0% packet loss, time 1012ms
rtt min/avg/max/mdev = 0.294/0.315/0.337/0.021 ms
[root@srv2 ~]$ ping -c 2 192.168.101.40

PING 192.168.101.40 (192.168.101.40) 56(84) bytes of data.
64 bytes from 192.168.101.40: icmp_seq=1 ttl=63 time=0.893 ms
64 bytes from 192.168.101.40: icmp_seq=2 ttl=63 time=0.192 ms

--- 192.168.101.40 ping statistics ---

2 packets transmitted, 2 received, 0% packet loss, time 1011ms
rtt min/avg/max/mdev = 0.192/0.542/0.893/0.350 ms

Маршрутизация выполняется в Vrf1 между SVI-интерфейсами на входящем VTEP, доставка трафика — в VNI, которому принадлежит получатель.

Схематично процесс выглядит так:

Процесс работы распределенного асимментричного шлюза
Процесс работы распределенного асимментричного шлюза
  1. SRV A1 инициирует передачу данных на шлюз в VLAN A согласно своей таблице маршрутизации.

  2. Входящий VTEP A, получая кадр в клиентском VLAN, в поле DST_MAC которого содержится MAC-адрес его SVI-интерфейса, выполняет декапсуляцию трафика (терминацию L2-заголовка) и передает пакет на маршрутизацию. Взаимосвязь между EVI и VRF определяется связкой SVI-VLAN-VNI и размещением данного SVI в VRF. Таким образом, определяется набор AC, для которых шлюз будет обеспечивать маршрутизацию в рамках конкретного VRF.

  3. По таблице маршрутизации VRF определяет исходящий интерфейс — SVI B.

  4. Связка SVI-VLAN-VNI определит целевой EVI, метку VNI которого следует использовать при создании VXLAN-туннеля для доставки трафика на удаленный VTEP. Трафик от шлюза к получателю доставляется в VXLAN-сегменте получателя.

  5. Исходящий VTEP B получает трафик в том EVI, в котором находится получатель, выполняет декапсуляцию трафика (терминацию VXLAN-заголовка) и коммутацию кадра в клиентский интерфейс.

  6. SRV B2 принимает данные от шлюза в VLAN B.

  7. SRV B2 отвечает, отправляя данные на собственный шлюз — SVI B.

  8. Входящий VTEP B терминирует L2-заголовок.

  9. По таблице маршрутизации локального VRF определяет исходящий интерфейс — SVI A.

  10. VRF отправляет трафик на VTEP A в сегменте получателя.

  11. Исходящий VTEP A выполняет декапсуляцию трафика и коммутацию кадра в клиентский интерфейс.

  12. SRV A1 принимает данные от шлюза в VLAN A.

Распределенный симметричный шлюз

При использовании симметричной модели шлюза, в отличие от асимметричной, нет  необходимости настраивать все связки VLAN-VNI на каждом VTEP. Вместо этого нужно сделать отдельный сегмент, который свяжет все остальные. Также нужно будет донастроить секцию BGP. Откатим схему в начало и начнем. Роль шлюзов выполнят SAG-интерфейсы. На коммутаторах leaf1 и leaf2 организуем связь с внешними сетями.

Добавим на каждый leaf-коммутатор такую конфигурацию:

configure terminal
!
vlan 301
!
ip vrf Vrf1
!
ip anycast-address enable
ip anycast-mac-address 00:00:5E:00:01:12
!
interface Vlan102
 ip vrf forwarding Vrf1
 ip anycast-address 192.168.102.1/24
!
interface Vlan301
 no autostate
 ip vrf forwarding Vrf1
!
interface vxlan vtep1
 map vni 3001 vlan 301
 map vni 3001 vrf Vrf1
!
end

Подведем итог.

  • Создали новый VLAN, который будем ассо��иировать с сервисным EVI (L3 VNI).

  • Создали VRF, который свяжет интерфейсы клиентских шлюзов c L3 сегментом.

  • Включили поддержку Anycast-адресации и установим MAC-адрес SAG-интерфейса.

  • Создали клиентский и сервисный SVI-интерфейсы (клиентские создаем те, которые подключены к VTEP).

  • Связали сервисный VLAN и пользовательский VRF с экземпляром EVI.

Так как сервисный сегмент будет передавать не только трафик, но и маршруты, то в BGP нужно создать инстанс для нашего Vrf1. Делаем на примере leaf1:

configure terminal
!
router bgp 100 vrf Vrf1
 !
 address-family ipv4 unicast
  redistribute connected
  maximum-paths 8
 !
 address-family l2vpn evpn
  advertise ipv4 unicast
  rd 10.113.100.1:3001
!
end

Поскольку все шлюзы — это присоединенные сети, импортируем их через redistribute connected и попросим EVPN анонсировать их в своих маршрутах. Для передачи IP-префиксов произвольной длины используем маршрут RT-5. Также в этой секции можно задать параметры RD и RT для маршрутов данного VRF. В этом примере зададим RD, чтобы принять анонсы от всех VTEP, поскольку адресация пересекается.

Для Border leaf добавим еще конфигурацию пиринга с EDGE-устройством.

configure terminal
!
ip prefix-list default-route seq 1 permit 0.0.0.0/0
!
route-map DEFAULT_ONLY permit 1
 match ip address prefix-list default-route
!
router bgp 100 vrf Vrf1
 !
 neighbor 10.113.15.0
  remote-as external
  !
  address-family ipv4 unicast
   activate
   route-map DEFAULT_ONLY in
!
end

Пора посмотреть, что же вышло. Начнем с сервисного сегмента: он в рабочем состоянии и связан с нужным VRF, RD сформировались автоматом, RMAC есть, о нем позже.

leaf1# show bgp l2vpn evpn vni 3001
---------------------------------------
VNI 3001
---------------------------------------
Mapped to VLAN      : yes
Type                : L3
VRF                 : Vrf1
Route distinguisher : 10.113.100.1:3001
Originator IP       : 10.113.100.1
Router's MAC        : 52:A8:00:00:11:11
Import route targets: 100:3001
Export route targets: 100:3001

А тут в последней строке будет список сегментов, с которыми связан сервисный внутри VTEP.

leaf1# show evpn vni 3001
------------------------------------
VNI 3001
------------------------------------
Type             : L3
VRF              : Vrf1
Mapped VLAN ID   : 301
SVI interface    : Vlan301
Source VTEP IP   : 10.113.100.1
Router's MAC     : 52:A8:00:00:11:11
Connected L2 VNIs: 1001

Еще интересно, что с префиксами, которые импортировали в BGP, и где те самые RT-5? Заглянем в таблицу Vrf1.

leaf1# show ip route vrf Vrf1
Codes:  K - kernel route, C - connected, S - static, B - BGP, O - OSPF
        > - selected route, * - FIB route, q - queued route, r - rejected route, # - not installed ine
       Destination        Gateway           Interface  Dist/Metric  Uptime    Tag
-----------------------------------------------------------------------------------
 B>*   0.0.0.0/0          via 10.113.15.0   Ethernet5  20/0         00:02:33
 C>*   10.113.15.0/31     Direct            Ethernet5  0/0          00:02:33
 B>*   10.113.25.0/31     via 10.113.100.2  Vlan301    20/0         00:02:03
 C>*   192.168.101.0/24   Direct            Vlan101    0/0          00:02:32
 B>*   192.168.101.40/32  via 10.113.100.4  Vlan301    20/0         00:01:06
 B>*   192.168.102.0/24   via 10.113.100.2  Vlan301    20/0         00:02:03
   *                      via 10.113.100.3  Vlan301
 B>*   192.168.102.32/32  via 10.113.100.3  Vlan301    20/0         00:01:13

Есть импортированная сеть 192.168.102.0/24, и известна она стала как раз за счет RT-5, которые прислали leaf2 и leaf3.

leaf1# show bgp l2vpn evpn route  192.168.102.0/24
BGP routing table entry for 10.113.100.2:3001:[5]:[0]:[24]:[192.168.102.0]
Paths: (2 available, best #2)
  Advertised to non peer-group peers:
  kornfeld(10.113.1.0) kornfeld(10.113.2.0)
  Route [5]:[0]:[24]:[192.168.102.0] VNI 3001
  1000 200
    10.113.100.2 from kornfeld(10.113.2.0) (10.113.0.2)
      Origin incomplete, valid, external
      Extended Community: RT:200:3001 ET:8 RMAC:52:A8:00:00:22:22
      Last update: Fri Dec  5 13:12:52 2025
  Route [5]:[0]:[24]:[192.168.102.0] VNI 3001
  1000 200
    10.113.100.2 from kornfeld(10.113.1.0) (10.113.0.1)
      Origin incomplete, valid, external, bestpath-from-AS 1000, best (Older Path)
      Extended Community: RT:200:3001 ET:8 RMAC:52:A8:00:00:22:22
      Last update: Fri Dec  5 13:12:52 2025
BGP routing table entry for 10.113.100.3:3001:[5]:[0]:[24]:[192.168.102.0]
Paths: (2 available, best #2)
  Advertised to non peer-group peers:
  kornfeld(10.113.1.0) kornfeld(10.113.2.0)
  Route [5]:[0]:[24]:[192.168.102.0] VNI 3001
  1000 300
    10.113.100.3 from kornfeld(10.113.2.0) (10.113.0.2)
      Origin incomplete, valid, external
      Extended Community: RT:300:3001 ET:8 RMAC:52:A8:00:00:33:33
      Last update: Fri Dec  5 13:12:42 2025
  Route [5]:[0]:[24]:[192.168.102.0] VNI 3001
  1000 300
    10.113.100.3 from kornfeld(10.113.1.0) (10.113.0.1)
      Origin incomplete, valid, external, bestpath-from-AS 1000, best (Older Path)
      Extended Community: RT:300:3001 ET:8 RMAC:52:A8:00:00:33:33
      Last update: Fri Dec  5 13:12:42 2025

Аналогично и дефолт анонсируется пограничными коммутаторами, как RT-5. Таким образом можно анонсировать в фабрику внешние маршруты.

leaf1# show bgp l2vpn evpn route 0.0.0.0
BGP routing table entry for 10.113.100.1:3001:[5]:[0]:[0]:[0.0.0.0]
Paths: (1 available, best #1)
  Advertised to non peer-group peers:
  spine1(10.113.1.0) spine2(10.113.2.0)
  Route [5]:[0]:[0]:[0.0.0.0] VNI 3001
  4294967295
    10.113.100.1 from 0.0.0.0 (10.113.100.1)
      Origin incomplete, valid, sourced, local, bestpath-from-AS 4294967295, best (First path receive)
      Extended Community: ET:8 RT:100:3001 RMAC:52:A8:00:00:11:11
      Last update: Fri Dec  5 16:28:50 2025
BGP routing table entry for 10.113.100.2:3001:[5]:[0]:[0]:[0.0.0.0]
Paths: (2 available, best #2)
  Advertised to non peer-group peers:
  spine1(10.113.1.0) spine2(10.113.2.0)
  Route [5]:[0]:[0]:[0.0.0.0] VNI 3001
  1000 200 4294967295
    10.113.100.2 from spine2(10.113.2.0) (10.113.0.2)
      Origin incomplete, valid, external
      Extended Community: RT:200:3001 ET:8 RMAC:52:A8:00:00:22:22
      Last update: Fri Dec  5 16:29:29 2025
  Route [5]:[0]:[0]:[0.0.0.0] VNI 3001
  1000 200 4294967295
    10.113.100.2 from spine1(10.113.1.0) (10.113.0.1)
      Origin incomplete, valid, external, bestpath-from-AS 1000, best (Older Path)
      Extended Community: RT:200:3001 ET:8 RMAC:52:A8:00:00:22:22
      Last update: Fri Dec  5 16:29:20 2025

Хорошо, но откуда еще /32? Это по сути ARP-записи, которые изучили VTEP и распространили в маршрутах RT-2. А в VRF они попали по наличию в них RT нашего Vrf1.

leaf1# show bgp l2vpn evpn vrf-import-rt
--------------------------------
Route target    Importing VRFs
--------------  ----------------
100:3001        Vrf1

Total: 1

leaf1# show bgp l2vpn evpn route type 2 self-originate
BGP table version is 168, local router ID is 10.113.100.1
Status codes: s suppressed, d damped, h history, * valid, > best, i - internal
Origin codes: i - IGP, e - EGP, ? - incomplete
EVPN type-1 prefix: [1]:[EthTag]:[ESI]:[IPlen]:[VTEP-IP]:[Frag-id]
EVPN type-2 prefix: [2]:[EthTag]:[MAClen]:[MAC]:[IPlen]:[IP]
EVPN type-3 prefix: [3]:[EthTag]:[IPlen]:[OrigIP]
EVPN type-4 prefix: [4]:[ESI]:[IPlen]:[OrigIP]
EVPN type-5 prefix: [5]:[EthTag]:[IPlen]:[IP]
   Network          Next Hop            Metric LocPrf Weight Path
                    Extended Community
Route Distinguisher: 10.113.100.1:2
 *> [2]:[0]:[48]:[52:A8:00:01:01:10]
                    10.113.100.1                       32768 i
                    ET:8 RT:100:1001
 *> [2]:[0]:[48]:[52:A8:00:01:01:10]:[32]:[192.168.101.10]
                    10.113.100.1                       32768 i
                    ET:8 RT:100:1001 RT:100:3001 RMAC:52:A8:00:00:11:11
Displayed 2 prefixes (2 paths) (of requested type)

На примере leaf1 видим, что он конструирует маршрут с двумя RT: 

  1. RT:100:1001 — для L2VNI, чтобы запись попала в ARP-кэш EVPN на других VTEP.

  2. RT:100:3001 — чтобы запись попала в VRF в виде /32-маршрута.

Маршрутов видим значительно больше, чем в предыдущих моделях — так и должно быть. Удаленные узлы могут доставлять IP-префиксы, как подключенные, так и пришедшие извне. Кроме того, локально изученные удаленными VTEP ARP-записи присутствуют в виде /32 маршрутов.

Напоследок попробуем разобраться с RMAC, который упоминали ранее. Посмотрим на ARP-кеш Vrf1.

leaf1# show ip arp vrf Vrf1
---------------------------------------------------------------------------------
Address         Hardware address    Interface    Egress Interface         Type
--------------  ------------------  -----------  -----------------------  -------
10.113.15.0     50:20:00:BA:F0:50   Ethernet5    -                        Dynamic
10.113.100.2    52:A8:00:00:22:22   Vlan301      -                        Remote
10.113.100.3    52:A8:00:00:33:33   Vlan301      -                        Remote
10.113.100.4    52:A8:00:00:44:44   Vlan301      -                        Remote
192.168.101.10  52:A8:00:01:01:10   Vlan101      Ethernet10               Dynamic
192.168.101.31  52:A8:00:01:01:31   Vlan101      VxLAN DIP: 10.113.100.3  Remote
192.168.101.40  52:A8:00:01:01:40   Vlan101      VxLAN DIP: 10.113.100.4  Remote

Total: 7

В ARP-кеше содержатся записи, указывающие на адреса loopback-интерфейсов удаленных VTEP. Для чего это нужно? В отличие от двух других моделей шлюза, в симметричной отсутствует прямая L2-связь с получателем в другом сегменте, трафик передается через L3 VNI. Это означает, что на стороне входящего VTEP после выполнения L3-lookup внутренний L2-заголовок пакета должен быть заполнен так, чтобы пакет мог быть принят L3-интерфейсом исходящего VTEP. То есть он должен обнаружить в поле DST_MAC собственный MAC-адрес.

В общем, можно сказать, что этот процесс похож на обычный сопровождающийся сменой L2-заголовка переход пакета из одного L2-сегмента в другой, только без использования ARP-протокола для разрешения MAC-адреса следующего перехода. В EVPN для этой цели используется RMAC, который передается через extended community. Он и позволяет разрешить адрес перехода, указанный в таблице маршрутизации. Схематично процесс выглядит так:

Процесс работы распределенного симметричного шлюза
Процесс работы распределенного симметричного шлюза

Исходящий VTEP  на основе поля DST_MAC проверяет, что пакет предназначен ему. Если проверка успешна, то для пакета выполняется L3-lookup и последующая обработка. Если в поле DST_MAC указан не его MAC-адрес, то исходящий VTEP отбросит такой пакет.

Осталось проверить, работает ли коммуникация оборудования в разных VNI и с внешним ресурсом.

[root@srv4 ~]$ ip neighbor
192.168.101.1 dev ens3 lladdr 00:00:5e:00:01:12 REACHABLE
192.168.101.31 dev ens3 lladdr 52:a8:00:01:01:31 STALE
192.168.101.10 dev ens3 lladdr 52:a8:00:01:01:10 STALE

[root@srv4 ~]$ ping -c 2 192.168.102.20
PING 192.168.102.20 (192.168.102.20) 56(84) bytes of data.
64 bytes from 192.168.102.20: icmp_seq=1 ttl=62 time=2.14 ms
64 bytes from 192.168.102.20: icmp_seq=2 ttl=62 time=2.63 ms

--- 192.168.102.20 ping statistics ---

2 packets transmitted, 2 received, 0% packet loss, time 1001ms
rtt min/avg/max/mdev = 2.144/2.389/2.634/0.245 ms

[root@srv4 ~]$ ping -c 2 192.168.0.255
PING 192.168.0.255 (192.168.0.255) 56(84) bytes of data.
64 bytes from 192.168.0.255: icmp_seq=1 ttl=62 time=3.46 ms
64 bytes from 192.168.0.255: icmp_seq=2 ttl=62 time=3.42 ms

--- 192.168.0.255 ping statistics ---

2 packets transmitted, 2 received, 0% packet loss, time 1002ms
rtt min/avg/max/mdev = 3.416/3.437/3.458/0.021 ms

srv4 (192.168.101.40) -> 192.168.0.255 (192.168.0.255) 2025-12-05T20:51:51+0300
Keys:  Help   Display mode   Restart statistics   Order of fields   quit

                                     Packets               Pings

 Host                                Loss%   Snt   Last   Avg  Best  Wrst StDev

 1. 192.168.101.1                     0.0%     7    0.5   0.5   0.4   0.7   0.1
 2. 10.113.25.1                       0.0%     7    1.8   1.8   1.5   2.4   0.3
 3. 192.168.0.255                     0.0%     6    3.3   3.3   3.1   3.5   0.1
Схема процесса
Схема процесса
  1. SRV B1 инициирует передачу данных на шлюз согласно своей таблице маршрутизации в VLAN B.

  2. Входящий VTEP A, получая кадр в клиентском VLAN, в поле DST_MAC которого содержится MAC-адрес его SVI-интерфейса, выполняет декапсуляцию трафика (терминацию L2-заголовка) и передает пакет на маршрутизацию.

  3. По таблице маршрутизации VRF определяет исходящий интерфейс, в данном случае интерфейс L3 EVI.

  4. Заполняет внутренний L2-заголовок, используя RMAC. Инкапсулирует трафик с меткой L3 VNI.

  5. Исходящий VTEP B выполняет декапсуляцию трафика (терминацию VXLAN-заголовка) и на основе DST_MAC проверяет, что пакет предназначен ему. Если так, терминирует L2-заголовок и передает пакет на маршрутизацию.

  6. По таблице маршрутизации VRF определяет исходящий интерфейс.

  7. Опционально  VRF выполняет разрешение адреса с использованием ARP. Заполняет L2-заголовок, используя данные ARP, отправляет пакет в L2-сегмент.

  8. SRV A2 принимает данные от шлюза в пользовательском VLAN A.

Чтобы правильно выбрать модель маршрутизации, стоит отталкиваться от набора решаемых задач. Кроме того, ограничений на совместное использование в пределах одной фабрике тоже нет. Если остались вопросы о моделях и их настройке в коммутаторах, задавайте их в комментариях.