Задача о пропавшем интернете — для любителей сетей

Задача о пропавшем интернете и резервировании каналов связи

Никита Степанов
Никита Степанов Ведущий сетевой инженер
26 февраля 2025

Хитрая задача для всех, кто интересуется сетями.

Изображение записи

Условие 

Представьте: вы — создатель онлайн-игры, которая в последнее время набрала завидную популярность. Ваши игровые серверы доступны 24/7, и аудитория стремительно растет. Все вроде бы хорошо, пока не случается это: в офисе пропадает интернет…

Тут вы вспоминаете, что серверы находятся где-то в каморке в офисе. И доступны всему миру только через одного провайдера. Пора это исправить!

Вы настроены решительно, поэтому переезжаете в ЦОД — осталось подумать над резервированием каналов связи. Вы зарегистрировали LIR в региональном интернет-регистраторе RIPE, получили собственную автономную систему (AS 64500) и блок IP адресов:  203.0.113.0/24. 

Существует возможность подключиться по BGP к двум операторам связи и к точке обмена трафиком (IX): 

ПровайдерНомер ASIP ISPIP клиентаСтоимость трафика
IX64508198.18.100.100/24198.18.100.10/241 Гбит/с бесплатно
ISP164510198.51.100.5/30198.51.100.6/30X рублей за 1мбит/с
ISP264511198.51.100.9/30198.51.100.10/303X рублей за 1 мбит/с

ISP1 и ISP2 анонсируют по BGP маршрут по умолчанию (0.0.0.0/0). Через IX доступны только подсети участников этого IX. 

ISP2 поддерживает управляющие Community: 

Blackhole Community64511:666
Local Preference Change64511:50 — установить LP=50 (минимальный на сети)
Local Preference Change64511:200 — установить LP=150 (максимальный на сети)

Задача

Настройте BGP и политики маршрутизации так, чтобы стоимость интернет-трафика оказалась минимальной, но доступ в интернет был зарезервирован от аварий у любого из операторов связи.

Решение на примере маршрутизаторов Juniper

Дисклеймер: конфигурация интерфейсов пропущена.

Для начала настроим на наших маршрутизаторах AS и router-id. Сразу создадим агрегированный маршрут для сети 203.0.113.0/24, который будем анонсировать нашим аплинкам.


      
Общий конфиг:
set routing-options aggregate route 203.0.113.0/24 discard set routing-options autonomous-system 64500

 


      
R1:
set routing-options router-id 203.0.113.254

      
R2:
set routing-options router-id 203.0.113.255

Далее поднимем между R1 и R2 iBGP сессию для обмена маршрутами, полученными по BGP от наших аплинков: 


      
Общий конфиг: 
set policy-options policy-statement iBGP-EXPORT term bgp from protocol bgp set policy-options policy-statement iBGP-EXPORT term bgp then next-hop self set policy-options policy-statement iBGP-EXPORT term bgp then accept set protocols bgp group iBGP type internal set protocols bgp group iBGP export iBGP-EXPORT set protocols bgp group iBGP peer-as 64500

      
R1:
set protocols bgp group iBGP neighbor 203.0.113.255 description R2

      
R2:
set protocols bgp group iBGP neighbor 203.0.113.254 description R1

Подготовим политики маршрутизации, которые будем в дальнейшем использовать на BGP-сессиях с аплинками. 


      
R1: 
set policy-options policy-statement ISP1-EXPORT from protocol aggregate set policy-options policy-statement ISP1-EXPORT from protocol bgp set policy-options policy-statement ISP1-EXPORT from route-filter 203.0.113.0/24 exact set policy-options policy-statement ISP1-EXPORT then accept set policy-options policy-statement ISP1-IMPORT from route-filter 0.0.0.0/0 exact set policy-options policy-statement ISP1-IMPORT then local-preference 100 set policy-options policy-statement ISP1-IMPORT then accept set policy-options policy-statement REJECT-OTHER then reject

      
R2:
set policy-options community ISP2-BACKUP members 64511:50 set policy-options policy-statement ISP2-EXPORT from protocol bgp set policy-options policy-statement ISP2-EXPORT from protocol aggregate set policy-options policy-statement ISP2-EXPORT from route-filter 203.0.113.0/24 exact set policy-options policy-statement ISP2-EXPORT then community set ISP2-BACKUP set policy-options policy-statement ISP2-EXPORT then accept set policy-options policy-statement ISP2-IMPORT from protocol bgp set policy-options policy-statement ISP2-IMPORT from route-filter 0.0.0.0/0 exact set policy-options policy-statement ISP2-IMPORT then local-preference 50 set policy-options policy-statement ISP2-IMPORT then accept set policy-options policy-statement IX-EXPORT from protocol bgp set policy-options policy-statement IX-EXPORT from protocol aggregate set policy-options policy-statement IX-EXPORT from route-filter 203.0.113.0/24 exact set policy-options policy-statement IX-EXPORT then accept set policy-options policy-statement IX-IMPORT from protocol bgp set policy-options policy-statement IX-IMPORT from route-filter 0.0.0.0/0 longer set policy-options policy-statement IX-IMPORT then local-preference 200 set policy-options policy-statement IX-IMPORT then accept set policy-options policy-statement REJECT-OTHER then reject

И наконец, настроим BGP-сессии. 


      
R1: 
set protocols bgp group ISP1 type external set protocols bgp group ISP1 import ISP1-IMPORT set protocols bgp group ISP1 import REJECT-OTHER set protocols bgp group ISP1 export ISP1-EXPORT set protocols bgp group ISP1 export REJECT-OTHER set protocols bgp group ISP1 peer-as 64510 set protocols bgp group ISP1 neighbor 198.51.100.5 description ISP1

      
R2:
set protocols bgp group IX type external set protocols bgp group IX import IX-IMPORT set protocols bgp group IX import REJECT-OTHER set protocols bgp group IX export IX-EXPORT set protocols bgp group IX export REJECT-OTHER set protocols bgp group IX peer-as 64508 set protocols bgp group IX neighbor 198.18.100.100 description IX set protocols bgp group ISP2 type external set protocols bgp group ISP2 import ISP2-IMPORT set protocols bgp group ISP2 import REJECT-OTHER set protocols bgp group ISP2 export ISP2-EXPORT set protocols bgp group ISP2 export REJECT-OTHER set protocols bgp group ISP2 peer-as 64511 set protocols bgp group ISP2 neighbor 198.51.100.9 description ISP2

Итоговая конфигурация для R1: 


    routing-options {
    aggregate {
        route 203.0.113.0/24 discard;
    }
    router-id 203.0.113.254;
    autonomous-system 64500;
}
protocols {
    bgp {
        group iBGP {
            type internal;
            export iBGP-EXPORT;
            peer-as 64500;
            neighbor 203.0.113.255 {
                description R2;
            }
        }
        group ISP1 {
            type external;
            import [ ISP1-IMPORT REJECT-OTHER ];
            export [ ISP1-EXPORT REJECT-OTHER ];
            peer-as 64510;
            neighbor 198.51.100.5 {
                description ISP1;
            }
        }
    }
}
policy-options {
    policy-statement ISP1-EXPORT {
        from {
            protocol [ aggregate bgp ];
            route-filter 203.0.113.0/24 exact;
        }
        then accept;
    }
    policy-statement ISP1-IMPORT {
        from {
            route-filter 0.0.0.0/0 exact;
        }
        then {
            local-preference 100;
            accept;
        }
    }
    policy-statement REJECT-OTHER {
        then reject;
    }
    policy-statement iBGP-EXPORT {
        term bgp {
            from protocol bgp;
            then {
                next-hop self;
                accept;
            }
        }
    }
}

Итоговая конфигурация для R2: 


    routing-options {
    aggregate {
        route 203.0.113.0/24 discard;
    }
    router-id 203.0.113.255;
    autonomous-system 64500;
}
protocols {
    bgp {
        group iBGP {
            type internal;
            export iBGP-EXPORT;
            peer-as 64500;
            neighbor 203.0.113.254 {
                description R1;
            }
        }
        group IX {
            type external;
            import [ IX-IMPORT REJECT-OTHER ];
            export [ IX-EXPORT REJECT-OTHER ];
            peer-as 64508;
            neighbor 198.18.100.100 {
                description IX;
            }
        }
        group ISP2 {
            type external;
            import [ ISP2-IMPORT REJECT-OTHER ];
            export [ ISP2-EXPORT REJECT-OTHER ];
            peer-as 64511;
            neighbor 198.51.100.9 {
                description ISP2;
            }
        }
    }
}
policy-options {
    policy-statement ISP2-EXPORT {
        from {
            protocol [ bgp aggregate ];
            route-filter 203.0.113.0/24 exact;
        }
        then {
            community set ISP2-BACKUP;
            accept;
        }
    }
    policy-statement ISP2-IMPORT {
        from {
            protocol bgp;
            route-filter 0.0.0.0/0 exact;
        }
        then {
            local-preference 50;
            accept;
        }
    }
    policy-statement IX-EXPORT {
        from {
            protocol [ bgp aggregate ];
            route-filter 203.0.113.0/24 exact;
        }
        then accept;
    }
    policy-statement IX-IMPORT {
        from {
            protocol bgp;
            route-filter 0.0.0.0/0 longer;
        }
        then {
            local-preference 200;
            accept;
        }
    }
    policy-statement REJECT-OTHER {
        then reject;
    }
    policy-statement iBGP-EXPORT {
        term bgp {
            from protocol bgp;
            then {
                next-hop self;
                accept;
            }
        }
    }
    community ISP2-BACKUP members 64511:50;

Пояснение к решению

Чтобы минимизировать затраты на интернет-трафик, настроим политики маршрутизации в соответствии с требованиями: 

  • маршруты через IX должны быть приоритетными,
  • трафик в интернет и из него должен ходить через ISP1, 
  • ISP2 используется только в случае недоступности ISP1. 

Установим в нашей сети два пограничных маршрутизатора для резервирования. 

Подключим канал к ISP1 в маршрутизатор R1, а ISP2 и IX — в маршрутизатор R2.

Так мы защитим сеть как от недоступности любого из операторов связи, так и от выхода из строя любого из наших роутеров. 

Итоговая схема сети.

Управлять исходящим трафиком нам поможет один из атрибутов протокола BGP: Local Preference. Согласно алгоритму выбора лучшего маршрута в BGP, лучшим будет выбран маршрут с наибольшим значением этого атрибута.

Установим следующие значения Local Preference: 

  • 200 — маршруты, полученные от роут-серверов IX;
  • 100 — маршруты, полученные от ISP1;
  • 50 — маршруты, полученные от ISP2.

Один из вариантов управления входящим трафиком — использование управляющих community аплинка. 
Промаркировав анонсы в сторону ISP2 community 64511:50, мы добьемся того, что через ISP2 трафик будет проходить, только если маршрут в нашу автономную систему через ISP1 будет недоступен.

Задача решена!

Другие задачи про сети