Конфигурирование BGP на Juniper MX

от автора

Приветствую, читатель!

В прошлой статье я обмолвился, что, возможно, опишу конфигурацию присутствующих в решении маршрутизаторов Juniper MX204. Близится конец года, и напоследок я решил написать небольшую статью на эту тему.

Предыстория задачи

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

Архитектура
Архитектура

По ряду причин, которые я описал в прошлой статье, для решения задачи в локации №2 я выбрал связку из двух виртуальных машин OPNsense и установил пакет FRRouting, который выполняет динамическую маршрутизацию, в частности, мне был нужен BGP. В локации №1 задачу динамической маршрутизации решают два Juniper MX204, и я поведаю, как они настроены.

Настройка Juniper

Как и для FRR, я хочу не просто поднять BGP-сессии, но и управлять их параметрами, такими как:

  • контроль префиксов, которые будут добавлены в таблицу маршрутов;

  • выбор приоритетного соседа для приёма и отправки трафика.

Конфигурация в JunOS является структурированной, как JSON, а потому команды применяются в зависимости от вашего текущего положения, я буду показывать команды от «корня». И, дабы не усложнять, я буду приводить примеры команд и конфигураций без использования logical-system и vpn-instance.

eBGP

Для начала настроим группу для eBGP для MX204-01:

set protocols bgp group DC-eBGP type external set protocols bgp group DC-eBGP hold-time 30 set protocols bgp group DC-eBGP log-updown set protocols bgp group DC-eBGP local-as 650000 set protocols bgp group DC-eBGP neighbor 192.168.0.2 description MX204-01-to-M09-CLF-01 set protocols bgp group DC-eBGP neighbor 192.168.0.2 local-address 192.168.0.1 set protocols bgp group DC-eBGP neighbor 192.168.0.2 peer-as 42000001

Полученную конфигурацию можно посмотреть командой show protocols bgp:

group DC-eBGP {     type external;     hold-time 30;     log-updown;     local-as 650000;     neighbor 192.168.0.2 {         description MX204-01-to-M09-CLF-01;         local-address 192.168.0.1;         peer-as 42000001;     } }

Теперь настроим сессию eBGP на MX204-02:

set protocols bgp group DC-eBGP type external set protocols bgp group DC-eBGP hold-time 30 set protocols bgp group DC-eBGP log-updown set protocols bgp group DC-eBGP local-as 650000 set protocols bgp group DC-eBGP neighbor 192.168.1.2 description MX204-02-to-M09-CLF-02 set protocols bgp group DC-eBGP neighbor 192.168.1.2 local-address 192.168.1.1 set protocols bgp group DC-eBGP neighbor 192.168.1.2 peer-as 42000002

И той же командой смотрим результат:

group DC-eBGP {     type external;     hold-time 15;     log-updown;     local-as 650000;     neighbor 192.168.1.2 {         description MX204-02-to-M09-CLF-02;         local-address 192.168.1.1;         peer-as 42000002;     } }

Быстренько пробежимся по использованным параметрам для группы:

  • type — указываем, какой является группа — внешней или внутренней (eBGP/iBGP);

  • hold-time — указываем максимальную продолжительность жизни маршрутов, после чего сосед и полученные от него маршруты считаются недоступными;

  • local-as — номер нашей автономной системы;

  • neighbor — IP-адрес соседа, с которым устанавливаем сессию, их в группе может быть несколько.

Всё, что указано на первом уровне вложения group (type, hold-time и т.д.) применяется ко всем в группе.

В персональных настройках соседа обязательно указываются параметры:

  • local-address — локальный IP-адрес для маршрутизатора , от имени которого строится сессия;

  • peer-as — номер автономной системы соседа.

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

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

set policy-options prefix-list prefix_IP_out 192.168.200.0/24 set policy-options prefix-list prefix_IP_out 192.168.210.0/24 set policy-options prefix-list prefix_IP_out 192.168.220.0/24

Создадим политику для MX204-01:

set policy-options policy-statement DC-eBGP-OUT term 1 from prefix-list prefix_IP_out set policy-options policy-statement DC-eBGP-OUT term 1 then accept set policy-options policy-statement DC-eBGP-OUT term 2 then reject

Вывести результат можно командой show policy-options policy-statement DC-eBGP-OUT:

term 1 {     from {         prefix-list prefix_IP_out;     }     then {         accept;     } } term 2 {     then reject; }

На MX204-02:

set policy-options policy-statement DC-eBGP-OUT term 1 from prefix-list prefix_IP_out set policy-options policy-statement DC-eBGP-OUT term 1 then as-path-prepend "650000 650000" set policy-options policy-statement DC-eBGP-OUT term 1 then accept set policy-options policy-statement DC-eBGP-OUT term 2 then reject
term 1 {     from {         prefix-list prefix_IP_out;     }     then {         as-path-prepend "650000 650000";         accept;     } } term 2 {     then reject; }

term — это, по сути, шаг с условиями, на совпадение с которыми проверяется трафик. У меня они пронумерованы, но это ничего не значит, название может быть любым, порядок проверки условий идёт сверху вниз, как в ACL. Чтобы новый term проверялся не последним, а в определённом месте политики, используется команда insert term ИМЯ before|after term ИМЯ.

Если условие в term будет True, то выполнится действие в then. В term 1 для MX204-01 префикс анонсируется соседу без дополнительных манипуляций, а в term 1 для MX204-02 атрибут as-path передаваемого префикса будет увеличен на две автономные системы командой as-path-prepend "650000 650000", т.е. сосед получит информацию, что для этого префикса as-path равен 650000 650000 650000. Таким образом, я рассчитываю, что сосед будет отправлять трафик в MX204-01, так как MX204-02 для него будет «дальше». Если условие в term 1 будет False, то проверка перейдёт в term 2 и выполнится действие reject.

Почему я рассчитываю на такое поведение, а не уверен в нём, описано в прошлой статье.

С экспортом маршрутов разобрались, переходим к их импорту в таблицу маршрутизации, и начнём опять с создания списка префиксов на обоих MX204:

set policy-options prefix-list prefix_IP_in 10.0.200.0/24 set policy-options prefix-list prefix_IP_in 10.0.210.0/24 set policy-options prefix-list prefix_IP_in 10.0.220.0/24

Создадим политику на MX204-01:

set policy-options policy-statement DC-eBGP-IN term 1 from prefix-list prefix_IP_in set policy-options policy-statement DC-eBGP-IN term 1 then local-preference 200 set policy-options policy-statement DC-eBGP-IN term 1 then accept set policy-options policy-statement DC-eBGP-IN term 2 then reject
term 1 {     from {         prefix-list prefix_IP_in;     }     then {         local-preference 200;         accept;     } } term 2 {     then reject; }

Повторим для MX204-02, но поменяем значение local-preference:

set policy-options policy-statement DC-eBGP-IN term 1 from prefix-list prefix_IP_in set policy-options policy-statement DC-eBGP-IN term 1 then local-preference 100 set policy-options policy-statement DC-eBGP-IN term 1 then accept set policy-options policy-statement DC-eBGP-IN term 2 then reject
term 1 {     from {         prefix-list prefix_IP_in;     }     then {         local-preference 100;         accept;     } } term 2 {     then reject; }

Логика такая же, как и при анонсировании, но тут подпадая под условие мы меняем атрибут local-preference. Опять же, если условие в term 1 не выполняется, то выполнится reject в term 2.

Я знаю, что в этой архитектуре выставление local-preference не несёт фактической пользы, но хотелось показать, как эту манипуляцию выполнять, потому что это зачастую необходимо.

Теперь добавим созданные нами политики в конфигурацию eBGP на MX204-01:

set protocols bgp group DC-eBGP neighbor 192.168.0.2 import DC-eBGP-IN set protocols bgp group DC-eBGP neighbor 192.168.0.2 export DC-eBGP-OUT

На MX204-02:

set protocols bgp group DC-eBGP neighbor 192.168.1.2 import DC-eBGP-IN set protocols bgp group DC-eBGP neighbor 192.168.1.2 export DC-eBGP-OUT

iBGP

Настало время организовать iBGP-связь между нашими MX204, чтобы получить отказоустойчивую схему. Создадим базовую конфигурацию iBGP на MX204-01:

set protocols bgp group DC-iBGP type internal set protocols bgp group DC-iBGP log-updown set protocols bgp group DC-iBGP local-as 650000 set protocols bgp group DC-iBGP neighbor 192.168.255.254 description MX204-02 set protocols bgp group DC-iBGP neighbor 192.168.255.254 local-address 192.168.255.253 set protocols bgp group DC-iBGP neighbor 192.168.255.254 peer-as 650000
group DC-iBGP {     type internal;     log-updown;     local-as 650000;     neighbor 192.168.255.254 {         description MX204-02;         local-address 192.168.255.253;         peer-as 650000;     } }

На MX204-02:

set protocols bgp group DC-iBGP type internal set protocols bgp group DC-iBGP log-updown set protocols bgp group DC-iBGP local-as 650000 set protocols bgp group DC-iBGP neighbor 192.168.255.253 description MX204-01 set protocols bgp group DC-iBGP neighbor 192.168.255.253 local-address 192.168.255.254 set protocols bgp group DC-iBGP neighbor 192.168.255.253 peer-as 650000
group DC-iBGP {     type internal;     log-updown;     local-as 650000;     neighbor 192.168.255.253 {         description MX204-01;         local-address 192.168.255.254;         peer-as 650000;     } }

Политика экспорта маршрутов соседу по iBGP также основана на списке префиксов и одинакова для обоих MX204:

set policy-options policy-statement DC-iBGP-OUT term 1 from prefix-list prefix_IP_out set policy-options policy-statement DC-iBGP-OUT term 1 then reject set policy-options policy-statement DC-iBGP-OUT term next-hop-self then next-hop self
term 1 {     from {         prefix-list prefix_IP_out;     }     then reject; } term next-hop-self {     then {         next-hop self;     } }

В term 1 мы сверяемся с тем же списком префиксов, который используется при анонсировании в eBGP, но здесь запрещаем анонсировать их соседу, всё остальное попадает в term next-hop-self, который меняет значение атрибута next-hop в анонсе на локальный IP маршрутизатора.

Политика импорта в iBGP почти одинакова для обоих MX204, начнём с MX204-01:

set policy-options policy-statement DC-iBGP-IN term 1 from protocol bgp set policy-options policy-statement DC-iBGP-IN term 1 from next-hop 192.168.255.254 ### 192.168.255.253 для MX204-02 set policy-options policy-statement DC-iBGP-IN term 1 then local-preference 50 set policy-options policy-statement DC-iBGP-IN term 1 then accept set policy-options policy-statement DC-iBGP-IN term 2 then reject
term 1 {     from {         protocol bgp;         next-hop 192.168.255.254;     }     then {         local-preference 50;         accept;     } } term 2 {     then reject; }

На MX204-02:

set policy-options policy-statement DC-iBGP-IN term 1 from protocol bgp set policy-options policy-statement DC-iBGP-IN term 1 from next-hop 192.168.255.253 set policy-options policy-statement DC-iBGP-IN term 1 then local-preference 50 set policy-options policy-statement DC-iBGP-IN term 1 then accept set policy-options policy-statement DC-iBGP-IN term 2 then reject
term 1 {     from {         protocol bgp;         next-hop 192.168.255.253;     }     then {         local-preference 50;         accept;     } } term 2 {     then reject; }

В term 1 импортируем только те анонсы, которые были «изучены» по BGP и имеют в атрибуте next-hop IP-адрес нашего iBGP-соседа, затем присваиваем им пониженный local-preference, чтобы трафик пошёл по этому пути только при исчезновении маршрута в локальной сессии eBGP. Всё остальное попадает в reject.

Напоследок добавим политики импорта и экспорта в ранее созданную группу iBGP, по традиции начинаем с MX204-01:

set protocols bgp group DC-iBGP neighbor 192.168.255.254 import DC-iBGP-IN set protocols bgp group DC-iBGP neighbor 192.168.255.254 export DC-iBGP-OUT

На MX204-02:

set protocols bgp group DC-iBGP neighbor 192.168.255.253 import DC-iBGP-IN set protocols bgp group DC-iBGP neighbor 192.168.255.253 export DC-iBGP-OUT

Итоговая конфигурация BGP на MX204-01 выглядит так:

group DC-eBGP {     type external;     hold-time 30;     log-updown;     local-as 650000;     neighbor 192.168.0.2 {         description MX204-01-to-M09-CLF-01;         local-address 192.168.0.1;         import DC-eBGP-IN;         export DC-eBGP-OUT;         peer-as 42000001;     } } group DC-iBGP {     type internal;     log-updown;     local-as 650000;     neighbor 192.168.255.254 {         description MX204-02;         local-address 192.168.255.253;         import DC-iBGP-IN;         export DC-iBGP-OUT;         peer-as 650000;     } }

На MX204-02:

group DC-eBGP {     type external;     hold-time 15;     log-updown;     local-as 650000;     neighbor 192.168.1.2 {         description MX204-02-to-M09-CLF-02;         local-address 192.168.1.1;         import DC-eBGP-IN;         export DC-eBGP-OUT;         peer-as 42000002;     } } group DC-iBGP {     type internal;     log-updown;     local-as 650000;     neighbor 192.168.255.253 {         description MX204-01;         local-address 192.168.255.254;         import DC-iBGP-IN;         export DC-iBGP-OUT;         peer-as 650000;     } }

Послесловие

Задача получилась интересной, и я получил хороший опыт при её решении. К сожалению, многое осталось за рамками, но очень рассчитываю, что кому-нибудь статья будет полезна! В этом году я прощаюсь с тобой, читатель, и надеюсь, что мы снова встретимся в новом году на бескрайних полях Хабра!

Live long and prosper!


ссылка на оригинал статьи https://habr.com/ru/company/domclick/blog/704940/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *