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 в реальных сетевых проектах.
Если у вас есть замечания и предложения по содержанию статьи — я буду благодарен за любые отзывы и критику.