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

Условие
Представьте: вы — создатель онлайн-игры, которая в последнее время набрала завидную популярность. Ваши игровые серверы доступны 24/7, и аудитория стремительно растет. Все вроде бы хорошо, пока не случается это: в офисе пропадает интернет…
Тут вы вспоминаете, что серверы находятся где-то в каморке в офисе. И доступны всему миру только через одного провайдера. Пора это исправить!
Вы настроены решительно, поэтому переезжаете в ЦОД — осталось подумать над резервированием каналов связи. Вы зарегистрировали LIR в региональном интернет-регистраторе RIPE, получили собственную автономную систему (AS 64500) и блок IP адресов: 203.0.113.0/24.
Существует возможность подключиться по BGP к двум операторам связи и к точке обмена трафиком (IX):
Провайдер | Номер AS | IP ISP | IP клиента | Стоимость трафика |
IX | 64508 | 198.18.100.100/24 | 198.18.100.10/24 | 1 Гбит/с бесплатно |
ISP1 | 64510 | 198.51.100.5/30 | 198.51.100.6/30 | X рублей за 1мбит/с |
ISP2 | 64511 | 198.51.100.9/30 | 198.51.100.10/30 | 3X рублей за 1 мбит/с |
ISP1 и ISP2 анонсируют по BGP маршрут по умолчанию (0.0.0.0/0). Через IX доступны только подсети участников этого IX.
ISP2 поддерживает управляющие Community:
Blackhole Community | 64511:666 |
Local Preference Change | 64511:50 — установить LP=50 (минимальный на сети) |
Local Preference Change | 64511: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 будет недоступен.
Задача решена!