Сравнение моделей vxlan устройств в ядре Linux
Актуальный frr поддерживает обе модели, и ему не важно как будет настроено ядро.
Traditional vxlan device
Multiple bridge
Frr поддерживает мультбриджовую настройку. При таком подходе бридж будет играть роль SVI-интерфейса. А вместо добавления интерфейса к пользователю в vlan, надо добавлять его в бридж.
# Vni 10010 - vlan 10
ip link add dev br10 type bridge
ip address add 192.168.10.254/24 dev br10
ip link set dev br10 up
ip link add vni-10010 type vxlan local 1.1.1.1 dstport 4789 id 10010 nolearning
ip link set vni-10010 master br10
ip link set vni-10010 up
# Vni 10020 - vlan 20
ip link add dev br20 type bridge
ip address add 192.168.20.254/24 dev br20
ip link set dev br20 up
ip link add vni-10020 type vxlan local 1.1.1.1 dstport 4789 id 10020 nolearning
ip link set vni-10020 master br20
ip link set vni-10020 up
Так как vni-vlan маппинг идет один к одному, а в такой схеме на каждый vlan создается бридж, то и для каждого маппинга нужен свой vxlan-интерфейс.
Single bridge
Другим вариантом является использование одного бриджа в режиме
vlan_filter. В этом режиме бридж будет использовать фильтрацию по vlan,
т.е. пакеты не будут пересылаться между разными vlan в рамках коммутации пакетов.
Это важно, чтобы пакеты между разными vni могли только маршрутизироваться
# Bridge
ip link add dev br0 type bridge
ip link set dev br0 type bridge vlan_filter 1 vlan_default_pvid 0
bridge vlan add dev br0 vid 10 self
bridge vlan add dev br0 vid 20 self
ip link set dev br0 up
Так как бридж в такой схеме один, нужно создавать отдельные SVI-интерфейсы для каждого vlan:
# Svi 10
ip link add link br0 dev vlan10 type vlan id 10
ip address add 192.168.10.254/24 dev vlan10
ip link set dev vlan10 up
# Svi 20
ip link add link br0 dev vlan20 type vlan id 20
ip address add 192.168.20.254/24 dev vlan20
ip link set dev vlan20 up
В традиционной модели vxlan каждый vni-vlan маппинг требует отдельного vxlan интерфейса:
# Vxlan 10
ip link add vni-10010 type vxlan local 1.1.1.1 dstport 4789 id 10010 nolearning
ip link set vni-10010 master br0
bridge vlan del vid 1 dev vni-10010
bridge vlan add vid 10 dev vni-10010
ip link set vni-10010 up
ip link add vni-10020 type vxlan local 1.1.1.1 dstport 4789 id 10020 nolearning
ip link set vni-10020 master br0
bridge vlan del vid 1 dev vni-10020
bridge vlan add vid 20 dev vni-10020
ip link set vni-10020 up
Такой интерфейс должен находиться в бридже в своем vlan. Он выполняет функцию энкапсуляции пакетов. Например, bum-трафик, входящий в бридж, попадет на vxlan-интерфейс. Там он обернется в обычный ip-пакет и будет отправлен на другие vtep с помощью RT-3 маршрутов.
Single vxlan device
Режим одного vxlan-устройства предполагает использование всего одного интерфейса. Такая модель значительно ближе к вендорским прошивкам, и компактнее в плане настройки.
При создании vxlan-интерфейса нужно указать две дополнительные опции:
external и vnifilter. Первая обязательна, а вторая нет, но
с ней будет корректнее.
Также для интерфейса нужно включить vlan_tunnel.
# Bridge
ip link add br0 type bridge vlan_filtering 1 vlan_default_pvid 0
ip link add vxlan0 type vxlan dstport 4789 local 1.1.1.1 nolearning external vnifilter
ip link set br0 up
ip link set vxlan0 up
bridge link set dev vxlan0 vlan_tunnel on
Svi все также нужен
# Vlan 10
ip link add vlan10 link br0 type vlan id 10
ip addr add 192.168.10.254/24 dev vlan10
ip link set vlan10 up
# Vlan 20
ip link add vlan20 link br0 type vlan id 20
ip addr add 192.168.20.254/24 dev vlan20
ip link set vlan20 up
Для установки маппинга между vni и vlan нужно: 1. Добавить бридж в vlan, чтобы пакеты могли выйти из него для маршрутизации 2. Добавить vxlan-интерфейс в vlan 3. Добавить vxlan-интерфейс в vni 4. Установить vni-vlan маппинг для vxlan-интерфейса
# l2vni 110 - vlan 10
bridge vlan add dev br0 vid 10 self
bridge vlan add dev vxlan0 vid 10
bridge vni add dev vxlan0 vni 110
bridge vlan add dev vxlan0 vid 10 tunnel_info id 110
# l2vni 120 - vlan 20
bridge vlan add dev br0 vid 20 self
bridge vlan add dev vxlan0 vid 20
bridge vni add dev vxlan0 vni 120
bridge vlan add dev vxlan0 vid 20 tunnel_info id 120
Примеры конфигурации топологий
Асимметричный irb
Топология
С помощью данной топологии будет продемонстрирована маршрутизация и коммутация с помощью vxlan.
Для T1 и T2, находящихся в одном vlan, пакет будет коммутироваться
Для T1 и T2, находящихся в разных vlan, пакет будет маршрутизироваться
Настройка FRR
router bgp 65000
neighbor 10.0.0.1 remote-as internal
!
address-family ipv4 unicast
network 1.1.1.1/32
exit-address-family
!
address-family l2vpn evpn
neighbor 10.0.0.1 activate
advertise-all-vni
exit-address-family
exit
!
end
router bgp 65000
neighbor 10.0.0.0 remote-as internal
!
address-family ipv4 unicast
network 2.2.2.2/32
exit-address-family
!
address-family l2vpn evpn
neighbor 10.0.0.0 activate
advertise-all-vni
exit-address-family
exit
!
end
Bgp используется как для overlay-сети, так и для underlay-сети. Для упрощения настраивается ibgp, но разницы с ebgp не будет.
Оба устройства:
Находятся в AS 65000
Анонсируют свои loopback-адреса в underlay-сети
Отсылают все свои vni
На этом настройка frr заканчивается. Для старой модели traditional vxlan device конфигурация не отличается.
Настройка Linux
# Loopback
ip link add dev loopback0 type dummy
ip addr add 1.1.1.1/32 dev loopback0
ip link set loopback0 up
# Underlay
ip link set dev eth1 address 00:00:00:00:01:01
ip address add 10.0.0.0/31 dev eth1
# Bridge
ip link add br0 type bridge vlan_filtering 1 vlan_default_pvid 0
ip link add vxlan0 type vxlan dstport 4789 local 1.1.1.1 nolearning external vnifilter
ip link set vxlan0 master br0
ip link set br0 up
ip link set vxlan0 up
bridge link set dev vxlan0 vlan_tunnel on
# l2vni 110 - vlan 10
bridge vlan add dev br0 vid 10 self
bridge vlan add dev vxlan0 vid 10
bridge vni add dev vxlan0 vni 110
bridge vlan add dev vxlan0 vid 10 tunnel_info id 110
ip link add vlan10 link br0 type vlan id 10
ip addr add 192.168.10.254/24 dev vlan10
ip link set vlan10 up
# l2vni 120 - vlan 20
bridge vlan add dev br0 vid 20 self
bridge vlan add dev vxlan0 vid 20
bridge vni add dev vxlan0 vni 120
bridge vlan add dev vxlan0 vid 20 tunnel_info id 120
ip link add vlan20 link br0 type vlan id 20
ip addr add 192.168.20.254/24 dev vlan20
ip link set vlan20 up
# Client link
ip link set dev eth2 master br0
bridge vlan add vid 10 dev eth2 pvid 10 egress untagged
# Loopback
ip link add dev loopback0 type dummy
ip addr add 2.2.2.2/32 dev loopback0
ip link set loopback0 up
# Underlay
ip link set dev eth1 address 00:00:00:00:01:02
ip address add 10.0.0.1/31 dev eth1
# Bridge
ip link add br0 type bridge vlan_filtering 1 vlan_default_pvid 0
ip link add vxlan0 type vxlan dstport 4789 local 2.2.2.2 nolearning external vnifilter
ip link set vxlan0 master br0
ip link set br0 up
ip link set vxlan0 up
bridge link set dev vxlan0 vlan_tunnel on
# l2vni 110 - vlan 10
bridge vlan add dev br0 vid 10 self
bridge vlan add dev vxlan0 vid 10
bridge vni add dev vxlan0 vni 110
bridge vlan add dev vxlan0 vid 10 tunnel_info id 110
ip link add vlan10 link br0 type vlan id 10
ip addr add 192.168.10.253/24 dev vlan10
ip link set vlan10 up
# l2vni 120 - vlan 20
bridge vlan add dev br0 vid 20 self
bridge vlan add dev vxlan0 vid 20
bridge vni add dev vxlan0 vni 120
bridge vlan add dev vxlan0 vid 20 tunnel_info id 120
ip link add vlan20 link br0 type vlan id 20
ip addr add 192.168.20.253/24 dev vlan20
ip link set vlan20 up
# Client links
ip link set dev eth2 master br0
bridge vlan add vid 10 dev eth2 pvid 10 egress untagged
ip link set dev eth3 master br0
bridge vlan add vid 20 dev eth3 pvid 20 egress untagged
ip link set dev eth1 address 00:00:00:01:00:01
ip addr add 192.168.10.1/24 dev eth1
ip route replace default via 192.168.10.254 dev eth1
ip link set dev eth1 address 00:00:00:01:00:02
ip addr add 192.168.10.2/24 dev eth1
ip route replace default via 192.168.10.253 dev eth1
ip link set dev eth1 address 00:00:00:01:00:03
ip addr add 192.168.20.1/24 dev eth1
ip route replace default via 192.168.20.253 dev eth1
Loopback интерфейс нужен для анонсирования RT-3 маршрутов. Для распространения RT=3 маршрутов можно использовать и физический линк, но в таком случае устройство сможет построить evpn-связность только на этом линке. Frr анонсирует ip-адрес loopback-интерфейса в underlay, а на других vtep этот адрес будет использоваться как next-hop для энкапсулированного пакета.
Для underlay интерфейсов используется p2p адресация, что позволяет экономить адресное пространство.
Bridge должен быть сконфигурирован в режиме vlan_filtering 1.
Это нужно, чтобы внутри бриджа пакеты учитывали vlan при коммутации и пакеты между
разными vni могли только маршрутизироваться.
При создании Vxlan интерфейса указывается ip-адрес, он будет использоваться в качестве src-ip в underlay пакете.
Svi интерфейсы для каждого vlan нужны, чтобы пакеты могли выйти из бриджа на маршрутизацию. После чего пакет будет отправлен на svi другого vlan, попадут в этот же бридж, но уже в другой vlan и будут отправлены по vxlan-туннелю.
Перед настройкой vni-vlan mapping нужно добавить vni и vlan на интерфейс.
Состояние стенда
В frr RT-3 маршрут устанавливается на каждый vni, каждым vtep. Поэтому, их будет 4 штуки. Два с локального vtep для vni 110 и 120 и два с удаленного vtep для тех же vlan.
sw1# show bgp l2vpn evpn route type 3
BGP table version is 2, local router ID is 192.168.20.254
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: 192.168.20.253:2
*>i [3]:[0]:[32]:[2.2.2.2]
2.2.2.2 100 0 i
RT:65000:120 ET:8
Route Distinguisher: 192.168.20.253:3
*>i [3]:[0]:[32]:[2.2.2.2]
2.2.2.2 100 0 i
RT:65000:110 ET:8
Route Distinguisher: 192.168.20.254:2
*> [3]:[0]:[32]:[1.1.1.1]
1.1.1.1 32768 i
ET:8 RT:65000:120
Route Distinguisher: 192.168.20.254:3
*> [3]:[0]:[32]:[1.1.1.1]
1.1.1.1 32768 i
ET:8 RT:65000:110
Displayed 4 prefixes (4 paths) (of requested type)
sw2# show bgp l2vpn evpn route type 3
BGP table version is 3, local router ID is 192.168.20.253
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: 192.168.20.253:2
*> [3]:[0]:[32]:[2.2.2.2]
2.2.2.2 32768 i
ET:8 RT:65000:120
Route Distinguisher: 192.168.20.253:3
*> [3]:[0]:[32]:[2.2.2.2]
2.2.2.2 32768 i
ET:8 RT:65000:110
Route Distinguisher: 192.168.20.254:2
*>i [3]:[0]:[32]:[1.1.1.1]
1.1.1.1 100 0 i
RT:65000:120 ET:8
Route Distinguisher: 192.168.20.254:3
*>i [3]:[0]:[32]:[1.1.1.1]
1.1.1.1 100 0 i
RT:65000:110 ET:8
Displayed 4 prefixes (4 paths) (of requested type)
В ядре RT-3 реализованы через специальную запись в fdb-таблице
с маком 00:00:00:00:00:00 и ip удаленного vtep.
sw1:~# bridge fdb show
00:00:00:00:00:00 dev vxlan0 dst 2.2.2.2 src_vni 120 self permanent
00:00:00:00:00:00 dev vxlan0 dst 2.2.2.2 src_vni 110 self permanent
sw2:~# bridge fdb show
00:00:00:00:00:00 dev vxlan0 dst 1.1.1.1 src_vni 120 self permanent
00:00:00:00:00:00 dev vxlan0 dst 1.1.1.1 src_vni 110 self permanent
RT-2 маршруты появятся только после начала общения между устройствами.
Коммутация
Прохождение BUM-трафика
Для демонстрации коммутации будет отправлен пакет от T1 к T2, так как эти клиенты находятся в одном vlan. Здесь будет разобран arp-запрос.
ping -c 1 192.168.10.2
Клиент сгенерирует следующий пакет:
Он придет на интерфейс eth2 SW1. Там к пакету добавится vlan-метка с vid 10. Пакет с меткой попадет в бридж:
Это бродкаст пакет, т.е. бридж отправит его во все порты, кроме того, с которого он прилетел.
В текущей схеме в бридже есть еще один интерфейс - vxlan0.
Пакет попадет на vxlan0, будет энкапсулирован в vxlan пакет и отправлен на все
другие vtep, анонсирующие RT-3 маршрут в этом же vni.
Ip-адреса других vtep будут получаться из специальных записей fdb-таблицы с маками
00:00:00:00:00:00 и ip. В качестве ip-адреса источника будет адрес, указанный при
создании vxlan-устройства.
Так будет сформирована первая часть underlay-пакета:
Чтобы отправить пакет на ip-адрес удаленного vtep, используется таблица маршрутизации:
sw1:~# ip route show
2.2.2.2 nhid 12 via 10.0.0.1 dev eth1 proto bgp metric 20
Для этого пакета next-hop’ом будет underlay-порт удаленного vtep, поэтому для получения мака назначение будет использована arp-таблица:
sw1 ~ ip neigh show
10.0.0.1 dev eth1 lladdr 00:00:00:00:01:02 REACHABLE
А в качестве MAC отправителя будет взят MAC интерфейса eth1: 00:00:00:00:01:01.
Тогда underlay-пакет будет выглядеть так:
На SW2 underlay-пакет попадет на порт eth1. MAC-адрес назначения совпадает с MAC-адресом интерфейса, поэтому пакет поднимется для маршрутизации. Ip-адрес назначения совпадает с адресом vxlan-интерфейса и пакет попадет на него. Vxlan-интерфейс декапсулирует пакет и добавит к нему vlan-тег, на основании vni-vlan маппинга.
В бридж попадет следующий пакет:
Этот пакет будет отправлен на все порты в 10 vlan, кроме vxlan0, т.е. на eth2. При выходе из eth2 будет снят vlan-тег. Клиент T2 получит обычный пакет, который был послан T1:
После прохождения этого пакета на свичах появится RT-2 запись с маком T1:
sw1# show bgp l2vpn evpn route type 2
BGP table version is 2, local router ID is 192.168.20.254
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: 192.168.20.254:3
*> [2]:[0]:[48]:[00:00:00:01:00:01]
1.1.1.1 32768 i
ET:8 RT:65000:110
Displayed 1 prefixes (1 paths) (of requested type)
sw2# show bgp l2vpn evpn route type 2
BGP table version is 2, local router ID is 192.168.20.253
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: 192.168.20.254:3
*>i [2]:[0]:[48]:[00:00:00:01:00:01]
1.1.1.1 100 0 i
RT:65000:110 ET:8
Displayed 1 prefixes (1 paths) (of requested type)
Прохождение unicast-трафика
Unicast трафик будет разобран на примере arp-ответа на запрос из предыдущей главы. После того, как T2 получил arp-запрос, он отправит следующий ответ:
Пакет придет на интерфейс eth2 SW2. Там к пакету добавится vlan-метка с vid 10. После он попадет в бридж:
Т.к это не broacast запрос, ядро проверит fdb-таблицу:
sw2 ~ bridge fdb show
00:00:00:01:00:01 dev vxlan0 dst 1.1.1.1 src_vni 110 self extern_learn
В fdb-таблице находится запись с нужным маком, которую туда добавил frr из-за RT-2 маршрута. Поэтому пакет будет отправлен на интерфейс vxlan0. Там он будет энкапсулирован также, как и при отправке bum-трафика. В underlay изменений не будет.
После декапсуляции пакета на SW1 он попадет в бридж, где будет еще одна проверка fdb-таблицы:
sw1 ~ bridge fdb show
00:00:00:01:00:01 dev eth2 vlan 10 master br0
После чего пакет будет скоммутирован на интерфейс eth2
T1 получит исходный пакет
Маршрутизация
Прохождение BUM-трафика
Для передачи пакетов между разными vlan на клиентах указывается маршрут по умолчанию через svi-интерфейс ближайшего свича.
Для демонстрации коммутации будет отправлен пакет от T1 к T3, так как эти клиенты находятся в разных vlan. Здесь будет разобран arp-запрос.
ping -c 1 192.168.20.1
В таблице маршрутизации нет отдельного маршрута для 20 подсети:
t1 ~ ip route show
default via 192.168.10.254 dev eth1
192.168.10.0/24 dev eth1 proto kernel scope link src 192.168.10.1
Поэтому пакет будет отправлен через маршрут по умолчанию. Для этого клиент
отправит arp-запрос к ip 192.168.10.254 для получения его MAC.
T1 знает MAC next-hop, поэтому дальше будет отправлен ICMP пакет, а не ARP. Пакет к SW1 будет выглядеть следующим образом:
На SW1 этот пакет попадет через eth2, где к нему будет добавлен vlan-тег:
Mac назначения это адрес SVI-интерфейса, поэтому пакет понимется для маршрутизации:
В таблице маршрутов 20 подсеть находится за SVI 20 vlan:
sw1 ~ ip route show
192.168.20.0/24 dev vlan20 proto kernel scope link src 192.168.20.254
Пакет будет отправлен в 20 vlan бриджа. Mac T3 нет на бридже, поэтому дальше будет отправлен broacast arp запрос. Который попадет на интерфейс vxlan0 и будет энкапсулирован.
Пакет будет выглядеть так:
В frr на
Этот пакет будет отправляться по всем RT-3 маршрутам в этом vni. В underlay-сети он будет выглядеть так:
На SW2 этот пакет попадет в vlan 20 бриджа и отправится на eth3.
T3 получит обычный arp-запрос от интерфейса vlan-10 SW1. Клиент отправит ответ, который с помощью коммутации дойдет до SVI 20 vlan на SW1.
После прохождения этого пакета на свичах появится RT-2 запись с маком T1:
sw1# show bgp l2vpn evpn route type 2
BGP table version is 5, local router ID is 192.168.20.254
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: 192.168.20.254:3
*> [2]:[0]:[48]:[00:00:00:01:00:01]
1.1.1.1 32768 i
ET:8 RT:65000:110
*> [2]:[0]:[48]:[00:00:00:01:00:01]:[32]:[192.168.10.1]
1.1.1.1 32768 i
ET:8 RT:65000:110
Displayed 2 prefixes (2 paths) (of requested type)
sw2# show bgp l2vpn evpn route type 2
BGP table version is 3, local router ID is 192.168.20.253
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: 192.168.20.254:3
*>i [2]:[0]:[48]:[00:00:00:01:00:01]
1.1.1.1 100 0 i
RT:65000:110 ET:8
*>i [2]:[0]:[48]:[00:00:00:01:00:01]:[32]:[192.168.10.1]
1.1.1.1 100 0 i
RT:65000:110 ET:8
Displayed 2 prefixes (2 paths) (of requested type)
Устройства изучили MAC T1 и его Ip.
RT-2 запись с одним MAC соответствует fdb-записи:
sw2 ~ bridge fdb show
00:00:00:01:00:01 dev vxlan0 dst 1.1.1.1 src_vni 110 self extern_learn
RT-2 запись MAC + Ip соответсвует arp-записи:
sw2 ~ ip neigh show
192.168.10.1 dev vlan10 lladdr 00:00:00:01:00:01 extern_learn NOARP proto zebra
Прохождение unicast-трафика
Unicast трафик будет разобран на примере icmp-запроса из предыдущей главы. Icmp-пакет в системе остался в таком виде:
После того, как SW1 получит arp ответ от T3, в arp таблице появится запись:
sw1 ~ ip neigh show
192.168.20.1 dev vlan20 lladdr 00:00:00:01:00:03 extern_learn NOARP proto zebra
Система отправит пакет на ip-адрес из arp-таблицы в vlan20. В качестве MAC источника будет взять адрес svi. В бридже будет такой пакет:
Энкапсуляция и декапсуляция на другой стороне будет являться коммутацией.
Cимметричный irb
Топология
Основное назначение симметричного irb в уменьшении количества vni на устройствах. Так как пакеты между vtep будут ходить в одном служебном vni, нет необходимости настраивать все vni на всех vtep.
Информация об RT-2 маршрутах передается между l2vni, т.е. fdb-записи и arp-записи между разными vni не будут передаваться, поэтому при симметричном irb используется l3vni, передающий только маршруты.
Настройка FRR
vrf vrf11000
vni 11000
exit-vrf
!
router bgp 65000
neighbor 10.0.0.1 remote-as internal
!
address-family ipv4 unicast
network 1.1.1.1/32
exit-address-family
!
address-family l2vpn evpn
neighbor 10.0.0.1 activate
advertise-all-vni
advertise-svi-ip
exit-address-family
exit
!
router bgp 65000 vrf vrf11000
!
address-family l2vpn evpn
advertise ipv4 unicast
advertise ipv6 unicast
exit-address-family
exit
!
end
vrf vrf11000
vni 11000
exit-vrf
!
router bgp 65000
neighbor 10.0.0.0 remote-as internal
!
address-family ipv4 unicast
network 2.2.2.2/32
exit-address-family
!
address-family l2vpn evpn
neighbor 10.0.0.0 activate
advertise-all-vni
advertise-svi-ip
exit-address-family
exit
!
router bgp 65000 vrf vrf11000
!
address-family l2vpn evpn
advertise ipv4 unicast
advertise ipv6 unicast
exit-address-family
exit
!
end
Bgp используется как для overlay-сети, так и для underlay-сети. Для упрощения настраивается ibgp, но разницы с ebgp не будет.
Оба устройства:
Находятся в AS 65000
Анонсируют свои loopback-адреса в underlay-сети
Отсылают все свои vni
Отсылают все свои l3vni
Также отправляют маршруты внутри vrf11000
На этом настройка frr заканчивается. Для старой модели traditional vxlan device конфигурация не отличается.
Настройка Linux
# Loopback
ip link add dev loopback0 type dummy
ip addr add 1.1.1.1/32 dev loopback0
ip link set loopback0 up
# Underlay
ip link set dev eth1 address 00:00:00:00:01:01
ip address add 10.0.0.0/31 dev eth1
# Bridge
ip link add br0 type bridge vlan_filtering 1 vlan_default_pvid 0
ip link add vxlan0 type vxlan dstport 4789 local 1.1.1.1 nolearning external vnifilter
ip link set vxlan0 master br0
ip link set br0 up
ip link set vxlan0 up
bridge link set dev vxlan0 vlan_tunnel on
# vrf for l3vni 11000
ip link add vrf11000 type vrf table 11000
ip link set vrf11000 up
# l3vni 11000 - vlan 1100
bridge vlan add dev br0 vid 1100 self
bridge vlan add dev vxlan0 vid 1100
bridge vni add dev vxlan0 vni 11000
bridge vlan add dev vxlan0 vid 1100 tunnel_info id 11000
ip link add vlan1100 link br0 type vlan id 1100
ip link set vlan1100 master vrf11000
ip link set dev vlan1100 address 00:00:11:00:00:01
ip link set vlan1100 up
# l2vni 110 - vlan 10
bridge vlan add dev br0 vid 10 self
bridge vlan add dev vxlan0 vid 10
bridge vni add dev vxlan0 vni 110
bridge vlan add dev vxlan0 vid 10 tunnel_info id 110
ip link add vlan10 link br0 type vlan id 10
ip link set vlan10 master vrf11000
ip link set dev vlan10 address 00:00:00:10:00:01
ip addr add 192.168.10.254/24 dev vlan10
ip link set vlan10 up
# Client link
ip link set dev eth2 master br0
bridge vlan add vid 10 dev eth2 pvid 10 egress untagged
# Loopback
ip link add dev loopback0 type dummy
ip addr add 2.2.2.2/32 dev loopback0
ip link set loopback0 up
# Underlay
ip link set dev eth1 address 00:00:00:00:01:02
ip address add 10.0.0.1/31 dev eth1
# Bridge
ip link add br0 type bridge vlan_filtering 1 vlan_default_pvid 0
ip link add vxlan0 type vxlan dstport 4789 local 2.2.2.2 nolearning external vnifilter
ip link set vxlan0 master br0
ip link set br0 up
ip link set vxlan0 up
bridge link set dev vxlan0 vlan_tunnel on
# vrf for l3vni 11000
ip link add vrf11000 type vrf table 11000
ip link set vrf11000 up
# l3vni 11000 - vlan 1100
bridge vlan add dev br0 vid 1100 self
bridge vlan add dev vxlan0 vid 1100
bridge vni add dev vxlan0 vni 11000
bridge vlan add dev vxlan0 vid 1100 tunnel_info id 11000
ip link add vlan1100 link br0 type vlan id 1100
ip link set vlan1100 master vrf11000
ip link set dev vlan1100 address 00:00:11:00:00:02
ip link set vlan1100 up
# l2vni 120 - vlan 20
bridge vlan add dev br0 vid 20 self
bridge vlan add dev vxlan0 vid 20
bridge vni add dev vxlan0 vni 120
bridge vlan add dev vxlan0 vid 20 tunnel_info id 120
ip link add vlan20 link br0 type vlan id 20
ip link set vlan20 master vrf11000
ip link set dev vlan20 address 00:00:00:20:00:01
ip addr add 192.168.20.254/24 dev vlan20
ip link set vlan20 up
# Client link
ip link set dev eth2 master br0
bridge vlan add vid 20 dev eth2 pvid 20 egress untagged
ip link set dev eth1 address 00:00:00:01:00:01
ip addr add 192.168.10.1/24 dev eth1
ip route replace default via 192.168.10.254 dev eth1
ip link set dev eth1 address 00:00:00:01:00:02
ip addr add 192.168.20.1/24 dev eth1
ip route replace default via 192.168.20.254 dev eth1
Loopback интерфейс нужен для анонсирования RT-3 маршрутов. Для распространения RT=3 маршрутов можно использовать и физический линк, но в таком случае устройство сможет построить evpn-связность только на этом линке. Frr анонсирует ip-адрес loopback-интерфейса в underlay, а на других vtep этот адрес будет использоваться как next-hop для энкапсулированного пакета.
Для underlay интерфейсов используется p2p адресация, что позволяет экономить адресное пространство.
Bridge должен быть сконфигурирован в режиме vlan_filtering 1.
Это нужно, чтобы внутри бриджа пакеты учитывали vlan при коммутации и пакеты между
разными vni могли только маршрутизироваться.
При создании Vxlan интерфейса указывается ip-адрес, он будет использоваться в качестве src-ip в underlay пакете.
Svi интерфейсы для каждого vlan, включая служебны, добавляются в vrf.
Перед настройкой vni-vlan mapping нужно добавить vni и vlan на интерфейс.
Состояние стенда
Vni:
sw1# show evpn vni
VNI Type VxLAN IF # MACs # ARPs # Remote VTEPs Tenant VRF
110 L2 vxlan0 1 1 0 vrf11000
11000 L3 vxlan0 1 1 n/a vrf11000
sw2# show evpn vni
VNI Type VxLAN IF # MACs # ARPs # Remote VTEPs Tenant VRF
120 L2 vxlan0 1 1 0 vrf11000
11000 L3 vxlan0 1 1 n/a vrf11000
Evpn-маршруты:
sw1# show bgp l2vpn evpn
BGP table version is 3, local router ID is 172.20.20.3
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
Route Distinguisher: 172.20.20.3:2
*> [2]:[0]:[48]:[00:00:00:10:00:01]:[32]:[192.168.10.254]
1.1.1.1 32768 i
ET:8 RT:65000:110 RT:65000:11000 Rmac:00:00:11:00:00:01
*> [3]:[0]:[32]:[1.1.1.1]
1.1.1.1 32768 i
ET:8 RT:65000:110
Route Distinguisher: 172.20.20.4:2
*>i [2]:[0]:[48]:[00:00:00:20:00:01]:[32]:[192.168.20.254]
2.2.2.2 100 0 i
RT:65000:120 RT:65000:11000 ET:8 Rmac:00:00:11:00:00:02
*>i [3]:[0]:[32]:[2.2.2.2]
2.2.2.2 100 0 i
RT:65000:120 ET:8
Displayed 4 out of 4 total prefixes
sw2# show bgp l2vpn evpn
BGP table version is 2, local router ID is 172.20.20.4
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
Route Distinguisher: 172.20.20.3:2
*>i [2]:[0]:[48]:[00:00:00:10:00:01]:[32]:[192.168.10.254]
1.1.1.1 100 0 i
RT:65000:110 RT:65000:11000 ET:8 Rmac:00:00:11:00:00:01
*>i [3]:[0]:[32]:[1.1.1.1]
1.1.1.1 100 0 i
RT:65000:110 ET:8
Route Distinguisher: 172.20.20.4:2
*> [2]:[0]:[48]:[00:00:00:20:00:01]:[32]:[192.168.20.254]
2.2.2.2 32768 i
ET:8 RT:65000:120 RT:65000:11000 Rmac:00:00:11:00:00:02
*> [3]:[0]:[32]:[2.2.2.2]
2.2.2.2 32768 i
ET:8 RT:65000:120
Displayed 4 out of 4 total prefixes
Важным параметром является Rmac. Он используется для разграничения l3vni. После того, как пакет пройдет vxlan-интерфейс и декапсулируется, он окажется в бридже в служебном vlan, из которого он не сможет выйти на маршрутизацию. Для того, чтобы пакет поднялся из vlan, в overlay-mac назначения должен быть указан MAC адрес svi-интерфейса служебного vlan. Это позволит пакету подняться из бриджа и попасть в нужный vrf.
Прохождение трафика
Для передачи пакетов между разными vlan на клиентах указывается маршрут по умолчанию через svi-интерфейс ближайшего свича.
Для демонстрации будет отправлен пакет от T1 к T2, так как эти клиенты находятся в одном vlan. Здесь будет разобран arp-запрос.
ping -c 1 192.168.20.1
В таблице маршрутизации нет отдельного маршрута для 20 подсети:
t1 ~ ip route show
default via 192.168.10.254 dev eth1
192.168.10.0/24 dev eth1 proto kernel scope link src 192.168.10.1
Поэтому пакет будет отправлен через маршрут по умолчанию. Для этого клиент
отправит arp-запрос к ip 192.168.10.254 для получения его MAC.
T1 знает MAC next-hop, поэтому дальше будет отправлен ICMP пакет, а не ARP. Пакет к SW1 будет выглядеть следующим образом:
На SW1 этот пакет попадет через eth2, где к нему будет добавлен vlan-тег:
Mac назначения это адрес SVI-интерфейса, поэтому пакет понимется для маршрутизации:
Т.к svi-интерфейс находится в vrf11000, пакет попадет в этот vrf. В его таблице маршрутов нет маршрута для 20 подсети:
sw1 ~ ip route show vrf vrf11000
192.168.10.0/24 dev vlan10 proto kernel scope link src 192.168.10.254
192.168.20.254 nhid 12 via 2.2.2.2 dev vlan1100 proto bgp metric 20 onlink
Поэтому пакет будет терминирован. Но фабрика узнает о T1 и он станет доступным. После того, как T2 отправит пакет, фабрика узнает о нем и T1 сможет достучаться до T2.
Evpn-маршруты:
sw2# show bgp l2vpn evpn route
BGP table version is 3, local router ID is 172.20.20.3
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: 172.20.20.3:2
*> [2]:[0]:[48]:[00:00:00:20:00:01]:[32]:[192.168.20.254]
2.2.2.2 32768 i
ET:8 RT:65000:120 RT:65000:11000 Rmac:00:00:11:00:00:02
*> [3]:[0]:[32]:[2.2.2.2]
2.2.2.2 32768 i
ET:8 RT:65000:120
Route Distinguisher: 172.20.20.4:2
*>i [2]:[0]:[48]:[00:00:00:01:00:01]
1.1.1.1 100 0 i
RT:65000:110 ET:8
*>i [2]:[0]:[48]:[00:00:00:01:00:01]:[32]:[192.168.10.1]
1.1.1.1 100 0 i
RT:65000:110 RT:65000:11000 ET:8 Rmac:00:00:11:00:00:01
*>i [2]:[0]:[48]:[00:00:00:10:00:01]:[32]:[192.168.10.254]
1.1.1.1 100 0 i
RT:65000:110 RT:65000:11000 ET:8 Rmac:00:00:11:00:00:01
*>i [3]:[0]:[32]:[1.1.1.1]
1.1.1.1 100 0 i
RT:65000:110 ET:8
Displayed 6 prefixes (6 paths)
Теперь SW-2 сможет отправить пакет к T1.
Для демонстрации работы всей системы отправим пакет с T2 к T1
ping -c 1 192.168.10.1
В таблице маршрутизации нет отдельного маршрута для 10 подсети:
t2 ~ ip route show
default via 192.168.20.254 dev eth1
192.168.20.0/24 dev eth1 proto kernel scope link src 192.168.20.1
Поэтому пакет будет отправлен через маршрут по умолчанию. Для этого клиент
отправит arp-запрос к ip 192.168.20.254 для получения его MAC.
T2 знает MAC next-hop, поэтому дальше будет отправлен ICMP пакет, а не ARP. Пакет к SW2 будет выглядеть следующим образом:
На SW2 этот пакет попадет через eth2, где к нему будет добавлен vlan-тег:
Mac назначения это адрес SVI-интерфейса, поэтому пакет понимется для маршрутизации:
Т.к svi-интерфейс находится в vrf11000, пакет попадет в этот vrf. В этом vrf есть маршрут к T1:
sw2 ~ ip route show vrf vrf11000
192.168.10.1 nhid 12 via 1.1.1.1 dev vlan1100 proto bgp metric 20 onlink
192.168.10.254 nhid 12 via 1.1.1.1 dev vlan1100 proto bgp metric 20 onlink
192.168.20.0/24 dev vlan20 proto kernel scope link src 192.168.20.254
Систетма отправит пакет к T1 с next-hop 1.1.1.1. MAC назначения будет взят из arp-таблицы:
sw2 ~ ip neigh show vrf vrf11000
1.1.1.1 dev vlan1100 lladdr 00:00:11:00:00:01 extern_learn NOARP proto zebra
Пакет будет отправлен на vlan1100 и будет выглядеть так:
Этот пакет попадет на бридж, через который на vxlan-интерфейс, где будет энкапсулирован. Работа underlay-сети была описана ранее.
На SW1 после декапсуляции пакет окажется в бридже, в vlan 1100:
Его MAC назначения совпадает с адресом svi-интерфейса, поэтому пакет отправится на коммутацию в vrf11000.
В таблице маршрутизации для vrf есть 10 подсетка:
sw1 ~ ip route show vrf vrf11000
192.168.10.0/24 dev vlan10 proto kernel scope link src 192.168.10.254
192.168.20.1 nhid 12 via 2.2.2.2 dev vlan1100 proto bgp metric 20 onlink
192.168.20.254 nhid 12 via 2.2.2.2 dev vlan1100 proto bgp metric 20 onlink
Поэтому пакет будет отправлен в vlan 10 и MAC его svi-интерфейса будет использован как MAC отправителя.
MAC адрес назначения будет взят из arp-таблицы:
sw1 ~ ip neigh show vrf vrf11000
2.2.2.2 dev vlan1100 lladdr 00:00:11:00:00:02 extern_learn NOARP proto zebra
192.168.10.1 dev vlan10 lladdr 00:00:00:01:00:01 REACHABLE
T1 получит обычный пакет:
Ответ пойдет аналогичным образом.