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