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

от автора

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 в реальных сетевых проектах.

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


ссылка на оригинал статьи https://habr.com/ru/articles/916516/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *