Что такое SD-WAN? Это пересылка разных типов IP трафика в разные каналы в зависимости от разных условий.

Для лучшего понимания Что такое SD-WAN и как оно работает я создал упрощённую модель в симуляторе eve-ng, включающую 6 виртуальных маршрутизаторов Cisco, протокол BGP между R3 и R4.

Между маршрутизаторами R3 и R4 есть два WAN линка (wan1 and wan2).

Для упрощения есть два приложения генерирующих трафик.

Есть красный трафик от R1 до R5, и есть зелёный трафик от R2 до R6.

Упрощённо можно считать что, для красного и зелёного трафика требуется разная пропускная способность, разная задержка, разный jitter.

Есть управляющий сервер SD-WAN, откуда запускается Python программа, которая соединяется с маршрутизатором R3 и проверяет нагрузку на интерфейсах e0/0 e0/1, и в зависимости от заданных условий переключает красный или зелёный трафик соответственно в первый или во второй канал.

Между маршрутизаторами R3 и R4 настроен протокол bgp который позволяет управлять трафиком с маршрутизатора R3 в обе стороны (туда и обратно). С помощью "route-map in" и "route-map out" меняются приоритетность входящего и исходящего трафика для соответствующих префиксов.

В случае отключения одного из каналов конечно весь трафик пойдёт в оставшийся канал.

router bgp 3
 bgp log-neighbor-changes
 network 10.0.1.0 mask 255.255.255.0
 network 10.0.2.0 mask 255.255.255.0
 neighbor 10.0.34.4 remote-as 4
 neighbor 10.0.34.4 route-map fr6 in
 neighbor 10.0.34.4 route-map to5prepend out
 neighbor 10.0.134.4 remote-as 4
 neighbor 10.0.134.4 route-map fr5 in
 neighbor 10.0.134.4 route-map to6prepend out
!
ip prefix-list 1 seq 5 permit 10.0.1.0/24
ip prefix-list 2 seq 5 permit 10.0.2.0/24
ip prefix-list 5 seq 5 permit 10.0.5.0/24
ip prefix-list 6 seq 5 permit 10.0.6.0/24
!
route-map fr5 permit 10
 match ip address prefix-list 5
 set local-preference 150
!
route-map fr5 permit 20
 match ip address prefix-list 6
 continue
!
route-map fr6 permit 10
 match ip address prefix-list 6
 set local-preference 150
!
route-map fr6 permit 20
 match ip address prefix-list 5
 continue
!
route-map to6prepend permit 10
 match ip address prefix-list 2
 set as-path prepend 3
!
route-map to6prepend permit 20
 match ip address prefix-list 1
 continue
!
route-map to5prepend permit 10
 match ip address prefix-list 1
 set as-path prepend 3
!
route-map to5prepend permit 20
 match ip address prefix-list 2
 continue
!
В результате выполнения программ sdw1.py и sdw2.py красный и зеленый трафик переключаются с первого канала во второй и наоборот.
В результате выполнения программ sdw1.py и sdw2.py красный и зеленый трафик переключаются с первого канала во второй и наоборот.

Где практически это можно использовать? Например банкомат подключен к банку через двух разных сотовых провайдеров. Нагрузка на сотовую сеть может меняться в течении дня по разному у обоих провайдеров и управляющая программа SD-WAN будет например каждые 5 минут проверять задержку на каналах и переключать трафик в тот где меньше задержка.

        connection = ConnectHandler(**netmiko_connection)                  # Establish SSH connection
        connection.enable()                                                # Enter enable mode 
                                             
        commands = ['router bgp 3', 'neighbor 10.0.134.4 route-map fr6 in',
          'neighbor 10.0.134.4 route-map to5prepend out', 'neighbor 10.0.34.4 route-map fr5 in',
          'neighbor 10.0.34.4 route-map to6prepend out', 'end' ,'write', 'clear ip bgp * soft' ]
        output = connection.send_config_set(commands)
   
        outputd4  = connection.send_command('show runn | section router')  # 

        connection.disconnect()                                            # Disconnect from device
   

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


  1. jozols
    04.01.2025 16:37

    Салют! А как в этой схеме адекватно оценивать качество канала, например на красном пропадает 10% и jitter низкий, а на зелёном 5% и jitter высокий. Может можно ткнуть в код на питоне где замер jittera. Reggards!


    1. CCNPengineer Автор
      04.01.2025 16:37

      на маршрутизаторе R3 можно настроить

      ip sla 10

      icmp-jitter 10.0.6.2

      и считывать его состояние из python программы

      outputd5 = connection.send_command('show ip sla summ') #