Linux VRF and Namespaces: различия между версиями

Материал из noname.com.ua
Перейти к навигацииПерейти к поиску
Строка 154: Строка 154:
 
* внешний интерфейс
 
* внешний интерфейс
 
==Настройка==
 
==Настройка==
  +
  +
===CE1 - "виртуальный клиентский роутер"===
  +
В реальной жизни вместо интерфейса veth был бы физический интерфейс, но для тестирования сойдет и так. А вместо CE1 было б отдельное устройство
  +
Создать network namespace ce1
 
<PRE>
 
<PRE>
  +
ip netns add ce1
 
</PRE>
 
</PRE>
   
  +
  +
  +
Добавить в него интерфейс ce1
 
<PRE>
 
<PRE>
  +
ip link set ce1 netns ce1
  +
</PRE>
  +
Интерфес типа veth должен быть предварительно создан, например используя netplan
  +
<PRE>
  +
</PRE>
  +
Дальнейшие шаги уже требуется выполнять внутри network namespace ce1
  +
<BR>
  +
"Поднять" интерфейсы lo и ce1
  +
<PRE>
  +
ip netns exec ce1 ip link set up dev lo
 
</PRE>
 
</PRE>
   
 
<PRE>
 
<PRE>
  +
ip netns exec ce1 ip link set up dev ce1
  +
<PRE>
  +
Назначить адрес на интерфейс ce1
  +
<PRE>
  +
ip netns exec ce1 ip addr add 192.168.98.1/24 dev ce1
 
</PRE>
 
</PRE>
  +
  +
Добавить на виртуальном "клиентском роутере" шлюз "в провайдера"
 
<PRE>
 
<PRE>
  +
ip netns exec ce1 ip ro add 0.0.0.0/0 via 192.168.98.101
 
</PRE>
 
</PRE>
  +
  +
На этом настройка CE1 завершена
  +
===111===
 
<PRE>
 
<PRE>
 
</PRE>
 
</PRE>
  +
 
<PRE>
 
<PRE>
 
</PRE>
 
</PRE>
  +
 
<PRE>
 
<PRE>
 
</PRE>
 
</PRE>
  +
 
<PRE>
 
<PRE>
 
</PRE>
 
</PRE>
  +
 
<PRE>
 
<PRE>
 
</PRE>
 
</PRE>
  +
  +
<PRE>
  +
</PRE>
  +
  +
<PRE>
  +
</PRE>
  +
 
<PRE>
 
<PRE>
 
</PRE>
 
</PRE>

Версия 17:22, 30 апреля 2025

Network Namespaces или VRF

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

Зачем нужен VRF

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

  • Есть 2 группу клиентов
    • Беспроводные (картинка с 2 антенами это точка доступа). Им нужно строго ограничивать скорость - гонять через выделенный роутер который делает шейпинг. Если их не шейпить, то один клиент сможет занять всю полосу в эфире, остальные на той же базовой станции работать не смогут.
    • Проводные, включены на скорости порта. Гонять их трафик через шейпер не только безсмысленно но и вредно - шейпер плохо работает на скоростях выше 50Мбит

Icon-caution.gif

Вместо шейпера тут может быть например файрволл для гостевой сети, суть от этого не меняется

  • Роутер/L3 свитч куда включены эти клиенты
  • Шейпер, пограничный роутер и "интернет" добавлены для наглядности


(тут я не касаюсь L3VPN и вообще VPN ни в каком виде)

Задача описанная выше решается просто на любом более-менее современном L3 коммутаторе

  • Для каждой группы клиентов создается свой VRF, своя таблица маршрутизации со своим шлюзом
  • Так как шлюзы в разных VRF разные то часть клиентов можно направить через шейпер а другую часть мимо
  • На Cisco при желании можно сделать маршрутизацию между VRF - Route Leaking что б клиенты из разных VRF могли общаться друг с другом (в случае интернет-провайдера это сделать можно, в случае с гостевой сетью конечно не желательно)

Это все было банально и все это все и так знают (VRF без MPLS в Cisco называют VRF-Lite)

Вопрос как это все сделать используя Linux

VRF в Linux

Прежде чем говорить о VRF перечислим проблемы которые решает VRF

  • Изоляция на уровне L3 - разные VRF имеют независимые таблицы маршрутизации

Icon-caution.gif

C некоторой натяжкой можно считать VRF реализацией Policy Routing

В Linux есть три способа получить разные таблицы маршрутизации для разных групп source адресов

ip rule

Первый, самый старый способ - использовать несколько таблиц маршрутизации
Насколько я помню он был "всегда" :) (пишут что с 99 года, те раньше чем я познакомился с Linux)
Для этого требуется создать табличку маршрутизации (прописывать в /etc/iproute2/rt_tables ну или зависит от дистрибутива если хочется именования)

echo «123 testtable» >> /etc/iproute2/rt_tables
ip route add default via 192.168.22.254 table testtable

Создаем правило, отправляющее нужные пакеты в нужную таблицу:

ip rule add from 192.168.1.20 table testtable 

Или даже вот так

ip rule add iif eth1 table testtable

Недостатки ip rule

Это самый неудобный способ, и он не решает следующие проблемы

  • Пересечение диапазонов IP адресов. Этой проблемы нет в примере, так как адреса клиентов одинаковые, но при желании делать L3VPN она обязательно возникнет
  • Сложность управление и нагромождение ip rule и как следствие линейный поиск по списку с соответвующим падением производительности
  • Проблемы с выбором исходящего интерфейса для локального софта

В целом для относительно небольших и не сложных конфигураций это решение можно применять и оно работает.

ip netns

Примерно с 2009 года для изоляции сети в Linux используют Network Namespaces

  • Полная изоляция (в том числе можно иметь дублирование адресов в разных VRF)
  • Гироко применяется, и более-менее документировано
  • Используют всякие Докеры, Кубернетесы и прочие контейнеры


Подробно описывать я это все конечно не буду (документации просто полно), остановлючь не недостатках

Недостатки ip netns

Я просто оставлю цитаты со своими комментариями: Network Namespace as a VRF? Just say No

  • Сложно делать Route Leaking (когда нужно часть или весь трафик пускать между VRF). Понадобится "виртуальный патчкорд" veth между VRF. Сделать конечно можно, масштабируемость только очень сомнительная.
  • Слишком полная изоляция
  • VRF решает задачу изоляции FIB (при этом не стоит путать FIB и таблицу маршрутизации, FIB содержит лучшие маршруты, тогда как таблица маршрутизации - все маршруты, в том числе полученные от протоколов динамической маршрутизации но не используемые прямо в данный момент как неоптимальные)
  • Неудобно работать - такая простая задача как просмотр всех интерфейсов требует сначала ip netns а потом смотреть отдельно по каждому неймспейсу
  • В целом - управление сетью с netns вместо vrf становится слишком сложный - тот же процесс lldp должен будет запустить столько своих экземпляров сколько есть VRF и это же касается BGPв, и (кроме того что нужно будет написать сои расширения для всех демонов) еще и требует "пропихивания"в апстрим.

ip link add vrf-1

Тут все относительно несложно

Приведу тестовую схему:

VRF 2.drawio.png
(Файл:VRF 2.drawio)

На ней есть

  • CE1 - роутер, имитирующий клиента ( реализован с помощью network namespace)
  • PE1 - виртуальный интерфейс, соединенный с CE1 и добавленный к vrf-Red
  • Глобальная таблица маршрутизации (в общем случае это еще один VRF, просто в него добавлены все интерфейсы по-умолчанию)
  • внешний интерфейс

Настройка

CE1 - "виртуальный клиентский роутер"

В реальной жизни вместо интерфейса veth был бы физический интерфейс, но для тестирования сойдет и так. А вместо CE1 было б отдельное устройство Создать network namespace ce1

ip netns add ce1


Добавить в него интерфейс ce1

ip link set ce1 netns ce1

Интерфес типа veth должен быть предварительно создан, например используя netplan


Дальнейшие шаги уже требуется выполнять внутри network namespace ce1
"Поднять" интерфейсы lo и ce1

ip netns exec ce1 ip link set up dev lo
ip netns exec ce1 ip link set up dev ce1
<PRE>
Назначить адрес на интерфейс ce1
<PRE>
ip netns exec ce1 ip addr add 192.168.98.1/24 dev ce1

Добавить на виртуальном "клиентском роутере" шлюз "в провайдера"

ip netns exec ce1 ip ro add 0.0.0.0/0 via 192.168.98.101

На этом настройка CE1 завершена

111









Ссылки