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

В прошлой статье я обмолвился, что, возможно, опишу конфигурацию присутствующих в решении маршрутизаторов 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!

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


  1. Alex_333
    15.12.2022 11:26

    Тот самый случай, когда КДПВ абсолютно по делу)