Погодин Евгений — ИТ Заметки
🌐Cisco Обновлено 13.10.2026

Cisco с нуля 15. BGP: подключение к провайдеру

Note

Команды сверены с официальной документацией Cisco (руководства по настройке Cisco IOS XE 17.x для Catalyst 9000 и маршрутизаторов ISR; отличия классической IOS 15.x отмечены в тексте). Перед работой на боевом оборудовании проверьте их на тестовом стенде или сделайте резервную копию.

Когда у предприятия два интернет-канала, а то и собственный блок публичных адресов, статического маршрута по умолчанию становится мало. Он не замечает, что канал вышел из строя, и не даёт влиять на то, откуда к вам придут входящие подключения. Для этого существует BGP (Border Gateway Protocol) — протокол, на котором держится маршрутизация между организациями в Интернете. BGP замечает падение сессии с соседом, но не видит аварию дальше по сети провайдера (подробнее в шаге 7).

В статье вы настроите на R1 две eBGP-сессии (с провайдером 1 и провайдером 2), анонсируете свой блок адресов, примете от провайдеров маршрут по умолчанию и, главное, защитите себя от превращения в транзитный узел между провайдерами. В конце — два коротких приёма управления трафиком: local-preference для исходящего и AS-path prepend для входящего.

Что понадобится

  • Маршрутизатор R1 (ISR с Cisco IOS XE 17.x или классическая IOS 15.x, например ISR G2). Поддержка BGP на коммутаторах Catalyst 9000 зависит от модели и лицензии — уточняйте в документации на вашу платформу.
  • Состояние сети перед началом: GigabitEthernet0/0/0 имеет адрес 203.0.113.2/30 и видит 203.0.113.1 (провайдер 1), GigabitEthernet0/0/2 имеет адрес 198.51.100.2/30 и видит 198.51.100.1 (провайдер 2). Проверьте ping до обоих адресов. Про адреса интерфейсов — статья 03.
  • Это отдельный мини-стенд: HSRP-схема из статьи 13 здесь не нужна. Второй провайдер в этой статье (как и в статьях 16 и 21) подключён к GigabitEthernet0/0/2; если у вас он на GigabitEthernet0/0/3, как в статье 06, подставьте это имя во всех командах. Резервный маршрут ip route 0.0.0.0 0.0.0.0 198.51.100.1 200 из статьи 06 придётся убрать (это сделано в шаге 4).
  • Желательно прочитать статью 06 (статические маршруты и административная дистанция), статью 07 (NAT) и статью 08 (ACL).
  • Консольный доступ к R1 на случай ошибки.
  • Стенд. BGP работает только в паре: вторая сторона каждой сессии — маршрутизатор провайдера. Чтобы повторить статью, нужны R1 и ещё два маршрутизатора, изображающих провайдеров (их настройка — в разделе «Учебные провайдеры для стенда»). Проще всего собрать это в эмуляторе (Cisco Modeling Labs, GNS3, EVE-NG) или на лабораторных маршрутизаторах. Не пробуйте учебные номера и блок на оборудовании, подключённом к настоящим провайдерам: адреса и номера AS из документационных диапазонов в Интернете не работают, а ошибка в политике BGP видна не только вам.
  • Учебные номера: наша AS — 64501, провайдер 1 — AS 64500, провайдер 2 — AS 64502 (диапазон для документации, RFC 5398; в реальной сети вы будете использовать выданные вам номера). Анонсируемый блок — 192.0.2.128/25. Пароль BGP — заглушка <ПАРОЛЬ_BGP>.

Нужен ли вам BGP

Честный ответ — чаще всего нет. BGP оправдан, когда выполняется хотя бы одно из условий:

  • у вас два и более провайдера, и вы хотите, чтобы переключение между ними происходило автоматически и вы могли влиять на выбор канала;
  • у вас собственный блок адресов (provider independent, PI — блок, не привязанный к конкретному провайдеру), который должен «переезжать» вместе с вами от одного провайдера к другому;
  • провайдер сам предлагает отдавать вам маршруты по BGP.

Если канал один, а адреса выданы провайдером, достаточно статического маршрута по умолчанию из статьи 06. Для двух каналов без собственного блока часто хватает статики с отслеживанием (см. старую статью про два провайдера). BGP сложнее и ответственнее: ошибка в вашей политике фильтрации видна не только вам, но и всему Интернету.

Отдельно про получение ресурсов. Собственный номер автономной системы (ASN) и блок адресов не покупаются «у любого»: их выдаёт региональный интернет-регистратор через локального интернет-регистратора (LIR). Для России это RIPE NCC (региональный регистратор для Европы, Ближнего Востока и части Азии); практически обращаются к LIR, который оформляет заявку, договор и оплату. Ни инструкций, ни реальных номеров здесь не будет: учебные 64500–64502 и 192.0.2.128/25 в настоящем Интернете не работают.

Основы за пять минут

Автономная система (AS) — набор сетей под единым управлением и общей политикой маршрутизации. У каждой AS есть номер (ASN), по которому BGP различает, «кто чей».

eBGP и iBGP. Сессия между маршрутизаторами из разных AS — eBGP (external), внутри одной AS — iBGP (internal). Cisco определяет тип по тому, совпадает ли номер в router bgp с номером в neighbor ... remote-as. Наш случай — eBGP: 64501 и 64500/64502.

Сосед (neighbor) — маршрутизатор, с которым вы вручную настраиваете сессию. BGP не ищет соседей сам, как OSPF: адрес и AS нужно указать с обеих сторон. Сессия идёт поверх TCP, порт 179.

Атрибуты маршрута — то, по чему BGP выбирает лучший путь:

Атрибут Что это Как влияет
AS-path Список AS, через которые прошёл маршрут Чем короче, тем лучше
Next-hop Адрес, через который достижим префикс Должен быть достижим по таблице маршрутизации; у eBGP это адрес соседа
Local preference Приоритет внутри вашей AS (по умолчанию 100) Чем больше, тем лучше; сравнивается раньше AS-path
MED «Подсказка» соседней AS, какой вход предпочтителен Чем меньше, тем лучше; обычно сравнивается только между маршрутами из одной соседней AS
Weight Только на Cisco, локален для маршрутизатора Самый приоритетный; чем больше, тем лучше

Порядок выбора пути, упрощённо: weight, затем local preference, затем локально созданные маршруты, затем кратчайший AS-path, затем origin (признак того, как маршрут попал в BGP: i — через network, ? — через редистрибуцию) и MED, затем eBGP лучше iBGP и так далее. Если пути всё ещё равны, действует тай-брейк: для eBGP обычно предпочитается более старый путь, затем путь от соседа с наименьшим router ID. Результат неочевиден, поэтому политику лучше задавать явно. Административная дистанция eBGP — 20, iBGP — 200, статического маршрута — 1.

Important

У статического маршрута дистанция 1, у eBGP — 20. Если на R1 остался статический ip route 0.0.0.0 0.0.0.0 203.0.113.1 из статьи 06, маршрут по умолчанию от BGP в таблицу маршрутизации не попадёт: статический «выиграет». В шаге 4 он заменяется «плавающим» (с дистанцией 250), который включится только при пропаже BGP-маршрута.

Состояния соседа

В show ip bgp summary вы увидите, в каком состоянии сессия:

Состояние Что происходит
Idle BGP ждёт запуска: сосед только что настроен, сессия была сброшена или закрыта из-за ошибки. Рядом может стоять пометка с причиной; у соседа, отключённого командой shutdown, обычно виден Idle (Admin)
Connect Идёт установка TCP-соединения; при успехе — переход в OpenSent, при неудаче — в Active
Active Попытки установить TCP-соединение повторяются. Название обманчиво: это не «всё хорошо»
OpenSent Open-сообщение отправлено, ожидается Open от соседа
OpenConfirm Open получен, ожидается keepalive
Established Сессия поднята, идёт обмен маршрутами

Для Established в последнем столбце вместо слова выводится число принятых префиксов. Если там число (даже 0), сессия работает. Если слово — нет.

Учебные «провайдеры» для стенда

Этот раздел нужен только тем, кто собирает стенд сам: в реальной сети вторую сторону настраивает провайдер и сообщает вам свои параметры (адрес соседа, номер AS, пароль, что он присылает и что готов принимать). Настройки ниже выполняются на двух отдельных маршрутизаторах стенда, а не на R1. Предполагается, что на их интерфейсах уже заданы адреса: 203.0.113.1/30 у провайдера 1 и 198.51.100.1/30 у провайдера 2.

Провайдер 1:

enable
configure terminal
router bgp 64500
 bgp router-id 203.0.113.1
 bgp log-neighbor-changes
 neighbor 203.0.113.2 remote-as 64501
 neighbor 203.0.113.2 description CLIENT
 neighbor 203.0.113.2 password <ПАРОЛЬ_BGP>
 address-family ipv4 unicast
  neighbor 203.0.113.2 activate
  neighbor 203.0.113.2 default-originate
 exit-address-family
end

Провайдер 2 настраивается так же, но с другими номерами и адресами:

enable
configure terminal
router bgp 64502
 bgp router-id 198.51.100.1
 bgp log-neighbor-changes
 neighbor 198.51.100.2 remote-as 64501
 neighbor 198.51.100.2 description CLIENT
 neighbor 198.51.100.2 password <ПАРОЛЬ_BGP>
 address-family ipv4 unicast
  neighbor 198.51.100.2 activate
  neighbor 198.51.100.2 default-originate
 exit-address-family
end

Команда neighbor ... default-originate заставляет маршрутизатор отправить соседу маршрут по умолчанию 0.0.0.0/0: именно так во многих реальных подключениях провайдер «отдаёт» клиенту выход в Интернет (а не полную таблицу). Отдельной команды на стороне R1 для приёма default не нужно: маршрут придёт как обычный BGP-префикс, мы лишь разрешим его входящим фильтром. Если default не пришёл, проверьте на маршрутизаторе стенда show ip bgp neighbors 203.0.113.2 advertised-routes. Пароль на всех концах должен быть одинаковым. Пока R1 не настроен, обе сессии будут в состоянии Idle или Active: так и должно быть.

Шаг 1. Страховка перед настройкой

Вы будете менять маршрут по умолчанию, поэтому ошибка может отрезать вас от Интернета (а при управлении через WAN — и от самого R1). Включите отложенную перезагрузку: пока вы не сохранили конфигурацию, она вернёт устройство в прежнее состояние.

Warning

Команда reload in 30 перезагрузит R1 через 30 минут и отбросит всё, что не сохранено в startup-config. Если всё заработало, отмените её командой reload cancel до истечения времени (раздел «Сохранение конфигурации»). Если шагов не хватило на 30 минут, выполните reload cancel и запланируйте перезагрузку заново. Если вы потеряли доступ — подождите перезагрузки или подключитесь через консоль.

Сначала сохраните рабочую конфигурацию, чтобы после возможной перезагрузки не потерять посторонние несохранённые правки:

enable
copy running-config startup-config

Команда спросит Destination filename [startup-config]?: нажмите Enter. Поэтому следующую команду вводите отдельно, а не в одной вставке с этой.

enable
reload in 30

Если вас спросят Save? [yes/no], ответьте no. На вопрос Proceed with reload? [confirm] нажмите Enter, иначе перезагрузка не запланируется. Проверить: show reload. Подробнее о резервной копии — в статье 12 и статье о резервном копировании конфигурации.

Шаг 2. Маршрут Null0 для нашего блока

Команда network в BGP не «создаёт» сеть, а лишь говорит: «анонсируй этот префикс, если он есть в таблице маршрутизации с тем же адресом и той же маской». В учебной сети блок 192.0.2.128/25 пока ни на одном интерфейсе не настроен, а в реальной он обычно делится на подсети и отдельные адреса. В обоих случаях точного маршрута /25 в таблице нет, и network молча ничего не сделает.

Решение — статический маршрут на «чёрную дыру» Null0 (что это, разобрано в статье 06):

enable
configure terminal
ip route 192.0.2.128 255.255.255.128 Null0
end

Почему это безопасно. Адреса внутри блока, которые реально используются, имеют более специфичные маршруты (подключённые подсети, /32), а в таблице побеждает самый длинный префикс. Маршрут Null0 обрабатывает только то, чего больше нигде нет. Без него трафик к неиспользуемым адресам блока ушёл бы по маршруту по умолчанию обратно к провайдеру, а тот вернул бы его вам — получилась бы петля.

Note

Блок /25 взят для учебной сети. В реальном Интернете минимальным анонсируемым блоком обычно считается /24: более мелкие префиксы провайдеры чаще всего отфильтровывают.

Как проверить:

enable
show ip route 192.0.2.128 255.255.255.128

Пример вывода (формат зависит от версии IOS):

Routing entry for 192.0.2.128/25
  Known via "static", distance 1, metric 0 (connected)
  Routing Descriptor Blocks:
  * directly connected, via Null0
      Route metric is 0, traffic share count is 1

Строка via Null0 означает, что точный маршрут для анонса есть.

Шаг 3. Фильтры: только свой блок наружу

Это самая важная часть статьи. Без фильтров R1 анонсирует провайдеру 2 всё, что узнал от провайдера 1, и наоборот. Для провайдеров вы окажетесь удобным путём между ними, и трафик третьих лиц пойдёт через ваш канал и ваш маршрутизатор. Cisco в руководстве по multihoming (подключению к нескольким провайдерам) прямо предупреждает: если вы не провайдер, планируйте маршрутизацию так, чтобы интернет-трафик не шёл через вашу AS.

Warning

Правило выхода: наружу уходит только 192.0.2.128/25, ничего больше. Правило входа: принимаем только то, что нам нужно (здесь — маршрут по умолчанию 0.0.0.0/0). Фильтры применяются до подъёма сессий: в шаге 4 соседи для этого временно отключаются командой shutdown.

Заранее уточните у провайдера, что он будет присылать именно 0.0.0.0/0. Если он отдаёт частичную или полную таблицу, фильтр DEFAULT-ONLY нужно изменить (и тогда обязательны фильтры из раздела про bogon-префиксы ниже). Если не отдаёт ничего, вернитесь к статическому маршруту по умолчанию из статьи 06: иначе сессия поднимется, но в столбце State/PfxRcd будет 0.

Фильтрация строится из двух частей:

  • ip prefix-list — список разрешённых префиксов. В конце списка неявный deny: всё, что не перечислено, отбрасывается. Подробно — в статье 16.
  • route-map — набор правил «если совпало — разрешить/запретить (и, возможно, изменить атрибуты)». Непрописанные совпадения отбрасываются.

Для каждого провайдера нужны свои route-map: на выход (TO-ISP1, TO-ISP2) и на вход (FROM-ISP1, FROM-ISP2). Сразу делаем провайдера 1 основным: в FROM-ISP1 стоит set local-preference 200 (как это работает — в шаге 7). Тогда с первой секунды выбор канала не зависит от того, чья сессия поднялась раньше.

enable
configure terminal
ip prefix-list OUR-BLOCK seq 5 permit 192.0.2.128/25
ip prefix-list DEFAULT-ONLY seq 5 permit 0.0.0.0/0
!
route-map TO-ISP1 permit 10
 match ip address prefix-list OUR-BLOCK
!
route-map TO-ISP2 permit 10
 match ip address prefix-list OUR-BLOCK
!
route-map FROM-ISP1 permit 10
 match ip address prefix-list DEFAULT-ONLY
 set local-preference 200
!
route-map FROM-ISP2 permit 10
 match ip address prefix-list DEFAULT-ONLY
end

permit 0.0.0.0/0 без ge и le совпадает только с самим маршрутом по умолчанию, а не со всеми префиксами. Число после permit в route-map (10) — порядковый номер правила; подробнее в статье 16.

Шаг 4. Настройка BGP

Что делает каждая команда:

  • router bgp 64501 — запускает процесс BGP с нашим номером AS (на маршрутизаторе возможен только один процесс BGP);
  • bgp router-id — идентификатор маршрутизатора. Если его не указать, выбирается адрес loopback-интерфейса, а если loopback нет — наибольший IPv4-адрес на физических интерфейсах. Лучше задать явно и не менять при работающих сессиях: смена их пересоздаёт. Здесь для краткости взят адрес WAN-интерфейса 203.0.113.2, в боевой сети обычно берут Loopback0;
  • bgp log-neighbor-changes — писать в журнал поднятие и падение сессий (%BGP-5-ADJCHANGE);
  • neighbor ... shutdown — временно отключает соседа, не удаляя настройки. Включаем в начале блока и снимаем в конце, чтобы политика была применена до подъёма сессии;
  • neighbor ... remote-as — адрес соседа и его AS;
  • neighbor ... description — подпись соседа для show;
  • neighbor ... password — пароль для защиты TCP-сессии по MD5 (подробности ниже);
  • address-family ipv4 unicast и neighbor ... activate — включают обмен IPv4-маршрутами с соседом;
  • network ... mask — анонс нашего блока.

Caution

Если на WAN-интерфейсе есть входящий ACL (например, из статьи 08), разрешите в нём TCP 179 между вами и соседом до снятия shutdown, иначе сессия застрянет в Active. Как это сделать, показано сразу ниже. Если входящего ACL на WAN-интерфейсах нет, подраздел можно пропустить.

Разрешаем TCP 179 во входящем ACL (если он есть)

Нужны два правила на каждого соседа: соединение может быть начато с любой стороны, поэтому порт 179 бывает и порт назначения (мы подключаемся к соседу), и порт источника (сосед подключается к нам). Для провайдера 1 список из статьи 08 называется OUTSIDE-IN и стоит на GigabitEthernet0/0/0. Сначала посмотрите, что в нём уже есть, и убедитесь, что номера строк 1 и 2 свободны (в списке из статьи 08 строки пронумерованы с 10, 20 и так далее); иначе будет Duplicate sequence number, и строка не добавится:

enable
show ip access-lists OUTSIDE-IN

Теперь добавьте правила. Они вводятся в режиме настройки именованного списка, и порядковые номера 1 и 2 ставят их выше остальных строк, включая финальный deny ip any any:

enable
configure terminal
ip access-list extended OUTSIDE-IN
 1 permit tcp host 203.0.113.1 host 203.0.113.2 eq 179
 2 permit tcp host 203.0.113.1 eq 179 host 203.0.113.2
end

Как проверить: show ip access-lists OUTSIDE-IN должен показать строки 1 и 2 в начале списка. Счётчики совпадений (matches) у них появятся, когда сессия начнёт подниматься.

Для провайдера 2 действуйте так же, но с адресами 198.51.100.1 и 198.51.100.2 и в том списке, который стоит на GigabitEthernet0/0/2. В нашем учебном стенде отдельного списка на этом порту нет; если он есть у вас, подставьте его имя вместо <ИМЯ_СПИСКА>:

enable
configure terminal
ip access-list extended <ИМЯ_СПИСКА>
 1 permit tcp host 198.51.100.1 host 198.51.100.2 eq 179
 2 permit tcp host 198.51.100.1 eq 179 host 198.51.100.2
end

Если списка на GigabitEthernet0/0/2 нет, ничего добавлять не нужно: порт ничем не закрыт.

Warning

Входящие подключения из Интернета к серверам в блоке 192.0.2.128/25 список из статьи 08 запрещает, пока вы не разрешите их порты отдельно. Ответы по UDP ограничены перечнем из статьи 08. Без ACL и без зонного межсетевого экрана (статья 23) порт TCP 179 открыт всем, поэтому на боевом маршрутизаторе закройте WAN-интерфейсы, а доступ по SSH ограничьте через access-class (статья 02). Если ZBFW уже включён, TCP 179 разрешается там, а оба WAN-интерфейса должны быть в зоне OUTSIDE; подробности в статье 23.

Сначала посмотрите, как именно задан статический маршрут по умолчанию из статьи 06:

enable
show running-config | include ip route 0.0.0.0

Удаляйте ту форму записи, которая реально есть в этом выводе: если она задана иначе, чем в блоке ниже (например, с указанием интерфейса), подставьте её в no ip route, иначе старый маршрут с дистанцией 1 продолжит перебивать BGP.

Основная настройка. Статический маршрут по умолчанию заменяется «плавающим» с дистанцией 250, чтобы BGP-маршрут (дистанция 20) имел приоритет:

enable
configure terminal
no ip route 0.0.0.0 0.0.0.0 203.0.113.1
ip route 0.0.0.0 0.0.0.0 203.0.113.1 250
no ip route 0.0.0.0 0.0.0.0 198.51.100.1 200
!
router bgp 64501
 bgp router-id 203.0.113.2
 bgp log-neighbor-changes
 neighbor 203.0.113.1 remote-as 64500
 neighbor 203.0.113.1 shutdown
 neighbor 203.0.113.1 description ISP1
 neighbor 203.0.113.1 password <ПАРОЛЬ_BGP>
 neighbor 198.51.100.1 remote-as 64502
 neighbor 198.51.100.1 shutdown
 neighbor 198.51.100.1 description ISP2
 neighbor 198.51.100.1 password <ПАРОЛЬ_BGP>
 address-family ipv4 unicast
  network 192.0.2.128 mask 255.255.255.128
  neighbor 203.0.113.1 activate
  neighbor 203.0.113.1 route-map FROM-ISP1 in
  neighbor 203.0.113.1 route-map TO-ISP1 out
  neighbor 203.0.113.1 maximum-prefix 10 80
  neighbor 198.51.100.1 activate
  neighbor 198.51.100.1 route-map FROM-ISP2 in
  neighbor 198.51.100.1 route-map TO-ISP2 out
  neighbor 198.51.100.1 maximum-prefix 10 80
 exit-address-family
 no neighbor 203.0.113.1 shutdown
 no neighbor 198.51.100.1 shutdown
end

Строка no ip route ... 198.51.100.1 200 убирает резервный маршрут из статьи 06 (если вы его создавали): пока он есть, при потере BGP-маршрутов трафик уйдёт к провайдеру 2 по нему (дистанция 200 лучше, чем 250 у плавающего маршрута), а вы рассчитывали на обратное. Если такого маршрута нет, команда ничего не изменит. Пока сессии не подняты, на R1 действует плавающий статический default (дистанция 250), поэтому связь не пропадёт; когда придёт BGP-маршрут по умолчанию (дистанция 20), трафик переключится на него. Отложенная перезагрузка нужна на случай, если ошибки в фильтрах, пароле, ACL или NAT оставят пользователей без Интернета или отрежут доступ к R1. После подъёма сессий основным станет провайдер 1 (local-preference 200), а NAT для него уже настроен в статье 07.

Note

Плавающий статический маршрут (дистанция 250) попадёт в таблицу только тогда, когда на R1 не останется ни одного BGP-маршрута по умолчанию: упали обе сессии либо оба провайдера перестали присылать 0.0.0.0/0 (например, из-за ошибки пароля или фильтра). Пока жив хотя бы один провайдер, трафик идёт по BGP, в том числе через провайдера 2, если сессия с провайдером 1 упала. Если сессия жива, а у провайдера авария выше по сети, BGP-маршрут остаётся в таблице и трафик уйдёт в пустоту: от этого защищает только внешний контроль доступности (IP SLA, статья 21). Если страховка не нужна, а провайдеры стабильно отдают 0.0.0.0/0, статический маршрут можно удалить совсем. Не добавляйте к этой схеме отдельный статический default с track из статьи 21: выберите что-то одно.

Если на вашей версии команды neighbor ... route-map или neighbor ... maximum-prefix внутри address-family не принимаются, задайте их прямо в режиме router bgp — результат тот же.

Про пароль

Команда neighbor ... password включает аутентификацию TCP-сегментов по MD5. Правила простые:

  • пароль должен совпадать на обоих концах (его согласовывают с провайдером), регистр важен, пробелы лучше не использовать;
  • если на одной стороне пароля нет, а на другой есть, или они различаются, в журнале появятся сообщения %TCP-6-BADAUTH: No MD5 digest from ... или %TCP-6-BADAUTH: Invalid MD5 digest from ..., а сессия не поднимется;
  • если вы меняете пароль на работающей сессии, её нужно сбросить: clear ip bgp 203.0.113.1;
  • без service password-encryption (см. статью 02) пароль виден в show running-config открытым текстом; с этой командой он хранится в обратимом виде (type 7), то есть тоже не защищён. Ограничьте доступ к конфигурации и резервным копиям и не публикуйте их.

В новых релизах IOS XE 17.x появилась альтернатива — аутентификация TCP-AO; доступность зависит от платформы, релиза и поддержки на стороне провайдера, поэтому здесь она не разбирается.

Про maximum-prefix

Команда neighbor ... maximum-prefix 10 80 ограничивает число принимаемых префиксов: на 80% от лимита (8 префиксов) в журнал придёт предупреждение (%BGP-4-MAXPFX), при превышении лимита сессия закрывается (%BGP-3-MAXPFXEXCEED). Если порог в процентах не указать, по умолчанию он равен 75%. Мы ждём от провайдера одну запись — маршрут по умолчанию, поэтому 10 с запасом. Считает ли лимит префиксы до или после входящего route-map, зависит от версии и от того, включён ли soft-reconfiguration inbound, поэтому не рассчитывайте на него как на фильтр: это предохранитель и сигнал в журнале, особенно полезный при приёме частичной или полной таблицы. Защищает вас route-map FROM-ISPx. Если ожидается полная таблица, лимит должен быть заметно больше её размера — уточните у провайдера.

После срабатывания лимита сессия сама не вернётся: нужен clear ip bgp 203.0.113.1. Либо добавьте параметр restart <минуты>, и маршрутизатор попробует поднять сессию заново сам. Параметр warning-only только пишет предупреждения и сессию не рвёт.

Шаг 5. Проверка

Подождите минуту (BGP не торопится) и посмотрите краткую сводку:

enable
show ip bgp summary

Пример вывода (значения вымышленные, строки со счётчиками памяти зависят от версии):

BGP router identifier 203.0.113.2, local AS number 64501
BGP table version is 4, main routing table version 4
2 network entries using 496 bytes of memory
3 path entries using 240 bytes of memory
4/2 BGP path/bestpath attribute entries using 1152 bytes of memory
2 BGP AS-PATH entries using 64 bytes of memory
0 BGP route-map cache entries using 0 bytes of memory
0 BGP filter-list cache entries using 0 bytes of memory
BGP using 1952 total bytes of memory
BGP activity 2/0 prefixes, 3/0 paths, scan interval 60 secs

Neighbor        V           AS MsgRcvd MsgSent   TblVer  InQ OutQ Up/Down  State/PfxRcd
198.51.100.1    4        64502      12      12        4    0    0 00:05:41        1
203.0.113.1     4        64500      13      13        4    0    0 00:06:02        1

Как читать: в столбце State/PfxRcd стоят числа 1 — сессии в состоянии Established, от каждого провайдера принят один префикс (default). Если там Idle или Active — переходите к разделу «Типичные ошибки».

Теперь таблица BGP и итоговая таблица маршрутизации:

enable
show ip bgp
show ip route bgp

Пример вывода команды show ip bgp (формат зависит от версии; в IOS XE 17.x шапка длиннее: добавлены дополнительные коды статуса и коды проверки RPKI):

BGP table version is 4, local router ID is 203.0.113.2
Status codes: s suppressed, d damped, h history, * valid, > best, i - internal,
              r RIB-failure, S Stale
Origin codes: i - IGP, e - EGP, ? - incomplete

     Network          Next Hop            Metric LocPrf Weight Path
 *>   0.0.0.0          203.0.113.1              0    200      0 64500 i
 *                     198.51.100.1             0             0 64502 i
 *>   192.0.2.128/25   0.0.0.0                  0         32768 i

Пример вывода команды show ip route bgp (легенда кодов опущена, формат зависит от версии):

Gateway of last resort is 203.0.113.1 to network 0.0.0.0

B*    0.0.0.0/0 [20/0] via 203.0.113.1, 00:06:02

Пояснения: знак > отмечает лучший путь, * — допустимый. Лучшим выбран путь через провайдера 1, потому что у него LocPrf 200, а у пути провайдера 2 значение по умолчанию 100 (в колонке не показано). Для 192.0.2.128/25 Next Hop 0.0.0.0 и Weight 32768 означают, что маршрут создан локально командой network. В таблицу маршрутизации попадает только лучший путь (B* — кандидат на default).

Что мы анонсируем и что получаем:

enable
show ip bgp neighbors 203.0.113.1 advertised-routes
show ip bgp neighbors 203.0.113.1 routes

Пример вывода первой команды:

BGP table version is 4, local router ID is 203.0.113.2
Status codes: s suppressed, d damped, h history, * valid, > best, i - internal,
              r RIB-failure, S Stale
Origin codes: i - IGP, e - EGP, ? - incomplete

   Network          Next Hop            Metric LocPrf Weight Path
*> 192.0.2.128/25   0.0.0.0                  0         32768 i

Total number of prefixes 1

Это главная проверка защиты. В advertised-routes должен быть один префикс — ваш блок. Если вы видите там маршрут по умолчанию или чужие префиксы, фильтр на выход не применён, и вы рискуете стать транзитом. Для провайдера 2 проверьте то же самое командой с адресом 198.51.100.1.

Команда routes показывает маршруты, принятые от соседа после фильтров на входе. Команда received-routes показывает все присланные соседом маршруты, в том числе отброшенные вашим фильтром; для неё в IOS обычно требуется хранить необработанные обновления: включите neighbor <сосед> soft-reconfiguration inbound (в address-family ipv4 unicast, если команды соседа заданы там). Опция расходует память, поэтому включайте её на время диагностики. Разница между received-routes и routes — то, что отбросил ваш фильтр.

Страховку из шага 1 пока не отменяйте: впереди NAT для второго канала (шаг 6) и проверка отказа.

Шаг 6. NAT для второго провайдера

Без этого шага резерв есть «на бумаге», а на деле нет: если сессия с провайдером 1 упадёт, пакеты пользователей уйдут через GigabitEthernet0/0/2 без подходящей трансляции, и провайдер 2 их отбросит. BGP при этом будет в состоянии Established, а интернета у пользователей не будет. Два одинаковых правила ip nat inside source list ... overload на один ACL не получатся: для двух выходов правила привязывают к route-map с match interface. Подробный разбор — в статье 16; если вы делали NAT по ней, шаг пропустите. Адреса блока 192.0.2.128/25, если вы раздаёте их внутренним хостам, транслировать не нужно.

Warning

Очистка трансляций оборвёт активные соединения пользователей: они откроются заново. Старое правило list 1 IOS XE не удаляет, пока по нему есть трансляции (Dynamic mapping in use, cannot remove). Работайте с консоли или из сети управления, не через NAT. Предполагается, что access-list 1 из статьи 07 содержит ваши внутренние сети, а на подинтерфейсах VLAN стоит ip nat inside.

enable
configure terminal
interface GigabitEthernet0/0/2
 ip nat outside
exit
route-map NAT-ISP1 permit 10
 match ip address 1
 match interface GigabitEthernet0/0/0
route-map NAT-ISP2 permit 10
 match ip address 1
 match interface GigabitEthernet0/0/2
do clear ip nat translation *
no ip nat inside source list 1 interface GigabitEthernet0/0/0 overload
ip nat inside source route-map NAT-ISP1 interface GigabitEthernet0/0/0 overload
ip nat inside source route-map NAT-ISP2 interface GigabitEthernet0/0/2 overload
end

Как проверить: show running-config | include ip nat inside source показывает два правила с route-map, без старого list 1; show ip nat statistics — оба WAN-интерфейса в списке outside. Если на no ip nat inside source list 1 ... пришёл ответ Dynamic mapping in use, повторите clear ip nat translation * и сразу удалите правило. С клиента из VLAN 10 проверьте доступ в Интернет.

Шаг 7. Управление трафиком при двух провайдерах

Обычно один канал основной, второй резервный. Для этого есть два независимых приёма, потому что направления разные.

Исходящий трафик: local-preference

Исходящий (из вашей сети в Интернет) выбирает ваш R1. Вы повышаете local preference у маршрутов от нужного провайдера. По умолчанию значение 100, больше — лучше. Мы уже сделали это в шаге 3: строка set local-preference 200 в FROM-ISP1 делает провайдера 1 основным, а маршрут провайдера 2 со значением 100 остаётся резервным. В show ip bgp для первого пути в колонке LocPrf стоит 200. Если канал или сессия с провайдером 1 пропадут, в игру вступит путь через провайдера 2.

Чтобы изменить политику позже, поменяйте значение в route-map и перечитайте маршруты без разрыва сессии:

enable
configure terminal
route-map FROM-ISP1 permit 10
 set local-preference 150
end
clear ip bgp 203.0.113.1 soft in

Это пример смены значения: пока оно остаётся выше 100, провайдер 1 остаётся основным. Верните 200 тем же способом, если не хотите менять схему.

Входящий трафик: AS-path prepend

Входящий (к вашему блоку из Интернета) выбирают чужие сети — вы можете только «подсказать». Самая простая подсказка — удлинить AS-path в анонсах резервному провайдеру: чем длиннее путь, тем он менее привлекателен. Команда set as-path prepend добавляет нашу AS несколько раз:

enable
configure terminal
route-map TO-ISP2 permit 10
 match ip address prefix-list OUR-BLOCK
 set as-path prepend 64501 64501
end
clear ip bgp 198.51.100.1 soft out

Теперь через провайдера 2 ваш блок виден как 64502 64501 64501 64501, а через провайдера 1 — 64500 64501. Три копии 64501, а не две, потому что R1 при отправке по eBGP всегда сам добавляет свою AS ещё раз. Остальной Интернет, при прочих равных, предпочтёт более короткий путь через провайдера 1. Prepend — не приказ, а просьба: у других операторов могут быть свои политики.

Ещё два инструмента: set metric (MED) тоже влияет на входящий трафик, но обычно сравнивается только между маршрутами из одной соседней AS, поэтому для двух разных провайдеров не годится; neighbor ... weight — особый атрибут Cisco, действующий только на самом R1. Подробнее о route-map — в статье 16.

После любой смены политики нужно переотправить или перечитать маршруты: clear ip bgp <сосед> soft in — перечитать принятые, clear ip bgp <сосед> soft out — заново отправить соседу свои анонсы. Это «мягкий» сброс: сессия не рвётся (для soft in нужна поддержка route refresh — возможности попросить соседа повторно прислать маршруты — на обеих сторонах; её видно в show ip bgp neighbors). Жёсткий clear ip bgp <сосед> рвёт TCP-сессию и сбрасывает все маршруты.

Проверка отказоустойчивости

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

Warning

Команда shutdown для соседа разрывает сессию с провайдером 1, и весь трафик уйдёт через провайдера 2. Если управление R1 идёт через канал провайдера 1, вы потеряете доступ. Работайте с консоли или из LAN, а команду no neighbor 203.0.113.1 shutdown приготовьте заранее.

enable
configure terminal
router bgp 64501
 neighbor 203.0.113.1 shutdown
end
show ip bgp summary
show ip route bgp

В show ip bgp summary строка провайдера 1 перейдёт в Idle (Admin), а в show ip route bgp маршрут по умолчанию укажет на 198.51.100.1. Вернуть всё обратно:

enable
configure terminal
router bgp 64501
 no neighbor 203.0.113.1 shutdown
end
show ip bgp summary

Через минуту сессия вернётся в Established, а маршрутом по умолчанию снова станет путь через провайдера 1. В журнале будут сообщения %BGP-5-ADJCHANGE о падении и подъёме соседа. Если трафик пошёл не так, как вы ожидали, проверьте LocPrf в show ip bgp.

Учтите ограничение: BGP узнаёт о проблеме, когда пропадает сама сессия (по физическому отказу канала — сразу, иначе по истечении holdtime, то есть времени ожидания сообщений от соседа, по умолчанию 180 секунд). Об аварии выше по сети провайдера при живой сессии он не узнает — см. примечание в шаге 4.

Сохранение конфигурации

Когда сессии подняты, фильтры проверены, NAT работает и проверка отказа прошла, отмените отложенную перезагрузку и сохраните конфигурацию:

enable
reload cancel
copy running-config startup-config

Последняя команда спросит Destination filename [startup-config]?: нажмите Enter. Если забыть про reload cancel, R1 перезагрузится по таймеру в самый неподходящий момент. Если сохранить конфигурацию позже срока перезагрузки, R1 вернётся к состоянию из шага 1, и настройку придётся повторить.

Дополнительная защита

Tip

Можно пропустить, если вы только знакомитесь с BGP: минимальная защита уже настроена в шагах 3 и 4 (фильтры и maximum-prefix). Вернитесь к этому разделу перед подключением к реальным провайдерам.

ttl-security. Команда neighbor 203.0.113.1 ttl-security hops 1 (в режиме router bgp) включает защиту GTSM (Generalized TTL Security Mechanism, защита по TTL): сессию принимают, только если TTL пакетов не меньше ожидаемого для соседа за один хоп (хоп — один маршрутизатор на пути пакета; здесь сосед подключён напрямую). Остальное молча отбрасывается, и процессор защищён от пакетов «издалека». Механизм рассчитан на применение обеими сторонами, поэтому заранее согласуйте это с провайдером: если он ничего не включил, сессия может не подняться. Не используйте её вместе с ebgp-multihop: команды взаимоисключающие.

enable
configure terminal
router bgp 64501
 neighbor 203.0.113.1 ttl-security hops 1
end

После изменения сессия может пересоздаться; при необходимости выполните clear ip bgp 203.0.113.1 в согласованное окно. Если сессия не поднялась, уберите команду (no neighbor 203.0.113.1 ttl-security hops 1 в режиме router bgp) и при необходимости снова сбросьте сессию.

Фильтр bogon-префиксов. Bogon — префикс, который в глобальном Интернете появляться не должен. Если вы принимаете только маршрут по умолчанию (как у нас), фильтр не нужен: все остальные префиксы и так отбрасываются. Если вы принимаете частичную или полную таблицу, фильтруйте частные адреса (RFC 1918), 100.64.0.0/10, loopback, link-local, multicast, блоки для документации и так далее. Единый список здесь не приводится: ориентируйтесь на рекомендации провайдера или регистратора.

Для иллюстрации принципа вот начало такого списка. Это набросок, а не боевой фильтр: в нём нет 0.0.0.0/8, multicast 224.0.0.0/3 и блоков для документации. Он запрещает частные адреса, 100.64.0.0/10, loopback и link-local с любой длиной префикса, а остальное пропускает при длине не больше /24 (ge и le задают допустимый диапазон длин):

enable
configure terminal
ip prefix-list BOGONS seq 5 deny 10.0.0.0/8 le 32
ip prefix-list BOGONS seq 10 deny 172.16.0.0/12 le 32
ip prefix-list BOGONS seq 15 deny 192.168.0.0/16 le 32
ip prefix-list BOGONS seq 20 deny 100.64.0.0/10 le 32
ip prefix-list BOGONS seq 25 deny 127.0.0.0/8 le 32
ip prefix-list BOGONS seq 30 deny 169.254.0.0/16 le 32
ip prefix-list BOGONS seq 35 permit 0.0.0.0/0 le 24
end

Такой список подключают к входящему route-map вместо DEFAULT-ONLY: match ip address prefix-list BOGONS. В нашей схеме он не применяется.

Как вернуть прежнюю схему

Статья меняет то, что настроено в статьях 06–07: статический default стал плавающим, NAT переведён на два правила, добавлен маршрут Null0. Если BGP не подошёл, сначала верните обычный статический default, а потом удаляйте BGP: так связь не прерывается. Действуйте в согласованное окно, с консоли, при включённой отложенной перезагрузке, и предупредите провайдеров: сессии пропадут без их ведома. Сначала перечень того, что удаляется: процесс router bgp, маршрут Null0, route-map TO-ISP1, TO-ISP2, FROM-ISP1, FROM-ISP2, NAT-ISP1, NAT-ISP2, prefix-list OUR-BLOCK, DEFAULT-ONLY, строки 1 и 2 в ACL, а также ip nat outside на втором порту.

enable
configure terminal
no ip route 0.0.0.0 0.0.0.0 203.0.113.1 250
ip route 0.0.0.0 0.0.0.0 203.0.113.1
no router bgp 64501
no ip route 192.0.2.128 255.255.255.128 Null0
no route-map TO-ISP1
no route-map TO-ISP2
no route-map FROM-ISP1
no route-map FROM-ISP2
no ip prefix-list OUR-BLOCK
no ip prefix-list DEFAULT-ONLY
do clear ip nat translation *
no ip nat inside source route-map NAT-ISP1 interface GigabitEthernet0/0/0 overload
no ip nat inside source route-map NAT-ISP2 interface GigabitEthernet0/0/2 overload
ip nat inside source list 1 interface GigabitEthernet0/0/0 overload
no route-map NAT-ISP1
no route-map NAT-ISP2
interface GigabitEthernet0/0/2
 no ip nat outside
end

Строки ACL, добавленные в этой статье, удаляются так: ip access-list extended OUTSIDE-IN, затем no 1 и no 2 (то же сделайте в списке на GigabitEthernet0/0/2, если добавляли строки и туда). Если в статье 06 у вас был резервный маршрут через провайдера 2, верните его: ip route 0.0.0.0 0.0.0.0 198.51.100.1 200 (порт подставьте свой). Как проверить: show ip route 0.0.0.0 показывает статический маршрут, show ip bgp summary сообщает, что BGP не запущен, а show running-config | include ip nat inside source — одно правило list 1. Когда результат устроит, отмените reload in и сохраните конфигурацию, как в разделе выше.

Типичные ошибки

  1. Сосед в Idle или Active. Сначала проверьте связность: ping 203.0.113.1. Затем ACL: пропускает ли он TCP 179 в обе стороны (если при добавлении строк было Duplicate sequence number, строка не добавилась: проверьте show ip access-lists и выберите свободный номер); при включённом ZBFW — разрешён ли BGP в парах с self. Затем адрес и AS: провайдер должен ждать именно адрес 203.0.113.2 и AS 64501, а вы — его AS в remote-as. Неверный remote-as приводит к тому, что сессия открывается и тут же закрывается сообщением об ошибке; причину последнего сброса ищите в show ip bgp neighbors. Active означает «пытаюсь установить TCP», а не «всё в порядке».
  2. Не совпадает пароль. В журнале сообщения %TCP-6-BADAUTH: Invalid MD5 digest (пароли различаются) или No MD5 digest (на одной стороне пароля нет). Сверьте пароль с провайдером, после исправления сделайте clear ip bgp <сосед>.
  3. Блок не анонсируется. show ip bgp neighbors <X> advertised-routes пуст или без вашего префикса. Проверьте, что в show ip route есть точный маршрут с той же маской, что в network (для нашего блока — ip route ... Null0).
  4. Нет фильтров на выход. Без route-map ... out с prefix-list вы анонсируете провайдеру лишнее и становитесь транзитом. Всегда проверяйте advertised-routes.
  5. Политику изменили, а ничего не поменялось. Забыли clear ip bgp <сосед> soft in или soft out.
  6. Статический default «перебивает» BGP или сессия не возвращается после maximum-prefix. Дистанция статики 1, у eBGP — 20: пока на R1 есть обычный статический default, BGP-маршрут по умолчанию не появится в show ip route. А после срабатывания лимита нужен ручной clear ip bgp <сосед> либо параметр restart.

Что дальше

Ещё по теме «Cisco»