AI Обзорная экскурсия в мир сетевых контейнеров

AI

Редактор
Регистрация
23 Август 2023
Сообщения
2 962
Лучшие ответы
0
Реакции
0
Баллы
51
Offline
#1
ContainerLab


Приветствую профессиональное сообщество. Здравствуй, Хабр! Это первая обзорная статья из серии, посвящённой ContainerLab.

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


Для начала — что такое ContainerLab?

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

Проект написан на Go, развивается с 2020 года, является бесплатным, имеет открытый исходный код.


Сферы применения ContainerLab:

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

Вы так же можете использовать ContainerLab для изучения сетевых технологий и возможностей сетевого оборудования.

Установка ContainerLab


Скрипт быстрой установки с официального сайта позволяет выполнить установку за считанные секунды на любой системе, основанной на RHEL или Debian.

curl -sL https://containerlab.dev/setup | sudo -E bash -s "all"

Установите Docker, если он ещё не установлен. Я наблюдал некоторые проблемы с последней версией — 28.0. Так что рекомендую установить Docker более ранней стабильной версии (я использую docker version 27.1.2, build d01f264) по инструкции, или:

sudo -i
curl -fsSL https://get.docker.com -o install-docker.sh
sh install-docker.sh --version 27.1
ContainerLab. Пример простой топологии


В контексте ContainerLab топология сети — это схема расположения и соединения сетевых устройств (узлов) и связей между ними. Топология сети описывается в простом YAML-файле.

Структура файла topology.yml для ContainerLab:


YAML-файл топологии имеет чёткую структуру с явным разделением на узлы (nodes) и связи (links), что делает её интуитивно понятной. Такой синтаксис позволяет быстро развернуть тестовую среду для проверки базовых сетевых взаимодействий.

name: clab-example # Название

topology: # Топология сети - узлы и их связи
nodes: # Узлы
node-1: # Узел 1
kind: linux # Тип, например - Linux
image: alpine:latest # Docker-образ
exec: # Команды:
- start service # Пример команды

node-2: # Узел 2
kind: linux # Тип, например - Linux
image: alpine:latest # Docker-образ

links: # Связь между интерфейсами узлов
- endpoints: ["node-1:eth0", "node-2:eth0"]
Раализация простой сетевой топологии в ContainerLab.


Базовая сетевая топология: подключение локального узла к интернету через маршрутизатор

Для демонстрации типового подключения к интернету я использовал FRRouting (FRR) — ПО для маршрутизации с открытым исходным кодом. В роли интернет-провайдера (ISP) и домашнего маршрутизатора выступают docker-контейнеры на базе образа frrouting/frr, а в роли клиентского устройства (PC) — docker-контейнер на базе образа alpine:latest (Alpine Linux).

name: clab-base-example

topology:
nodes:
ISP: # Узел интернет-провайдера
kind: linux
image: frrouting/frr:latest
binds:
# Подключаем конфигурацию маршрутизации
- ./config/isp/frr.conf:/etc/frr/frr.conf
exec:
# Включаем NAT для приватных сетей
- iptables -t nat -A POSTROUTING -s 10.0.0.0/8 -o eth0 -j MASQUERADE

# Устанавливаем шлюз в глобальный интернет
- ip route replace default via 172.20.20.1 dev eth0

Router: # Узел маршрутизатора
kind: linux
image: frrouting/frr:latest
binds:
# Подключаем конфиг сетевых интерфейсов
- ./config/router/frr.conf:/etc/frr/frr.conf
exec:
# Разрешаем трансляцию пакетов между интерфейсами
- sysctl -w net.ipv4.ip_forward=1

# Назначаем шлюз по умолчанию к провайдеру
- ip route replace default via 54.56.3.49 dev eth1

PC: # Узел клиента
kind: linux
image: alpine:latest
exec:
# Прописываем статический IP в локальной сети
- ip addr add 10.0.2.2/24 dev eth1

# Указываем шлюзом маршрутизатор
- ip route replace default via 10.0.2.1 dev eth1

links:
# Соединяем ISP и Router (WAN-сегмент)
- endpoints: ["ISP:eth1", "Router:eth1"]

# Соединяем Router и PC (LAN-сегмент)
- endpoints: ["Router:eth2", "PC:eth1"]

— Конфигурационные файлы frr.conf загружаются при запуске контейнеров через привязку томов в topology.yml. Полный справочник команд конфигурации доступен в официальной документации FRR.

!Конфигурация узла провайдера
hostname ISP

interface eth1
! Назначаем публичный IP-адрес для соединения с маршрутизатором
ip address 54.56.3.49/30

! Прописываем маршрут к частной сети клиента
ip route 10.0.2.0/24 54.56.3.50

! Включаем пересылку пакетов между интерфейсами
ip forwarding

! Конфигурация пограничного маршрутизатора
hostname Router # Идентификация устройства

interface eth1
! Настраиваем WAN-интерфейс для подключения к ISP
ip address 54.56.3.50/30

interface eth2
! Настраиваем LAN-интерфейс для локальной сети
ip address 10.0.2.1/24

! Активируем маршрутизацию между интерфейсами
ip forwarding
Полезные команды:


  • Запустить сетевую модель: containerlab deploy -t topology.yml


  • Остановить: containerlab destroy -t topology.yml


  • Построить граф топологии: containerlab graph -s 0.0.0.0:50080 -t topology.yml - при выполнении команды запускается веб-сервер на указанном порту (по умолчанию порт — 50080) с возможность перейти по ссылке: http://0.0.0.0:50080, где можно будет увидеть сетевую модель вида:

Визуализация сетевой топологии (Containerlab).

Пример из этой статьи вы можете найти в моём Git-репозитории.


На этом я, пожалуй, завершу обзорную экскурсию в мир сетевых контейнеров. Надеюсь, что статья была полезной для вас.

В следующих публикациях я планирую разобрать более сложные сценарии настройки, и показать, как эффективно использовать возможности Containerlab в реальных сетевых проектах.

Если у вас есть замечания и предложения по содержанию статьи — я буду благодарен за любые отзывы и критику.
 
Сверху Снизу