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, где можно будет увидеть сетевую модель вида:
Пример из этой статьи вы можете найти в моём Git-репозитории.
На этом я, пожалуй, завершу обзорную экскурсию в мир сетевых контейнеров. Надеюсь, что статья была полезной для вас.
В следующих публикациях я планирую разобрать более сложные сценарии настройки, и показать, как эффективно использовать возможности Containerlab в реальных сетевых проектах.
Если у вас есть замечания и предложения по содержанию статьи — я буду благодарен за любые отзывы и критику.
ссылка на оригинал статьи https://habr.com/ru/articles/916516/
Добавить комментарий