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).
Визуализация сетевой топологии (Containerlab).

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


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

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

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

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