Всем привет!
В этой статье, я вам расскажу про свой личный опыт работы с виртуальными сетевыми лабораториями. Хочу начать своё повествование с небольшой предыстории — как я пришёл к теме.
Начну с себя — я студент направления ИБ. На момент написания статьи заканчиваю третий курс. Не по секрету вам скажу, в моём учебном процессе немало внимания уделяется устройству компьютерных сетей — от базового понимания до вполне прикладных задач.
В случае нашего университета знакомство с компьютерными сетями начинается с Cisco Packet Tracer — наглядного, простого, но довольно ограниченного инструмента, предназначенного для освоения базы. У нас был целый семестр вместе с Cisco.
Но потом у нас появился новый преподаватель, который предложил проявить инициативу, и заняться чем то интересным. Я решил подойти и узнать у него по подробнее. Задание было переписать методическое пособие по Моделированию компьютерных сетей и адаптировать всё содержимое под PNETLab. Он подметил, что документации на русском языке по этой теме очень мало, и если я возьмусь за это, то буду одним из первооткрывателей. Я согласился на эту авантюру.
До этого я не сталкивался с этой технологией. Появилось чувство новизны и приключений. Начал гуглить, смотреть, находить материал.
Спустя семестр, когда надо было отчитаться о проделанной работе, я сделал для себя вывод, что даже у PNETLAB есть свои минусы. И не всё так радужно, как я думал.
К тому моменту нам дали курсовую работу по проектированию сети. Из инструментов проектирования были только Packet Tracer и PNETLab.
Во время работы над курсовой, само собой, возникало много вопросов, приходилось гуглить — искал ответы на вопросы по настройке, примеры, советы. В какой-то момент, совершенно случайно, наткнулся на упоминание Containerlab. Само название сначала ничего особенного не сказало. Так получилось, что я открыл эту ссылку — и тут я понял, что это то, что мне надо!
Всё основано на контейнерах. Топология описывается обычным YAML-файлом, а настройка — через пару CLI-команд. Никаких долгих загрузок, никаких виртуалок, минимум движений.
На фоне этого PNETLab начал казаться громоздким и неудобным, а Packet Tracer — и вовсе учебной игрушкой. Добавлю, что у каждого инструмента есть своё место, каждый хорош в своём, лишних нет: Packet Tracer отлично подходит для первых шагов, PNETLab — если хочется ближе к реальности, но всё ещё с GUI. А вот Containerlab — это на голову выше. Он даёт не только знания, но и практику, максимально приближенную к тому, как это делается в реальных инфраструктурах. А если вы еще и хотите освоить контейнеры, то это прекрасная практика для начинающих «сетевиков».
С этого момента я понял, что хочу поделиться этим опытом. Ведь если бы я наткнулся на такую статью раньше — сэкономил бы кучу времени и нервов.
Дальше — сравнение трёх инструментов, плюсы и минусы каждого, и почему Containerlab — не просто альтернатива, а настоящий шаг вперёд.
Cisco Packet Tracer
Cisco Packet Tracer — единственный на сегодня проект в данной статье, для которого нужно покупать лицензию. Несомненно, является одним из самых популярных инструментов в мире для сетей. Сам я тоже начинал с него — и тогда казалось самой крутой реализацией программы: можно соединить компьютеры, свитчи, роутеры и наглядно увидеть как это работает.
Одним словом — очень низкий порог входа. Скачал, установил, запустил — и сразу накидал первую топологию. Образы присутствуют сразу из коробки, не нужно возиться с виртуалками или искать образы — все устройства уже встроены.
Со временем, когда углубляешься в реальные технологии и сценарии, осознаешь, что это не настоящий Cisco IOS. Тут нет полноценной операционной системы, часть команд либо отсутствует, либо просто ведёт себя «странно». Многие привычные вещи из CLI просто недоступны. Плюс к этому, нулевая поддержка других вендоров. Только Cisco.
Кооперативная работа в Packet Tracer также невозможна. Это чисто оффлайновый инструмент, рассчитанный на одного пользователя. О контейнерах можно полностью забыть. Нет возможности автоматизировать развертывание конфигураций, использовать Ansible, Git, CI/CD или другие DevOps‑подходы. Ни о какой инфраструктуре, как код речи не идёт.
Если вы только начинаете, или вам нужно быстро «накидать» идею, проверить базовую связность — Packet Tracer справиться. Но когда вы выходите за рамки «настроить VLAN и пропинговать», и хотите работать с настоящими образами, более сложными протоколами, автоматизацией и DevOps‑инструментами — этот этап нужно пройти и двигаться дальше.
PNETLab
Сам «пнет», по существу, как инструмент проектирования сетей, очень хорош.
Можно использовать реальные образы Cisco IOSv, IOS‑XRv, ASA, Juniper vSRX, Fortinet FortiGate, VyOS, Arista, и других.
Возможность использовать Dynamips, QEMU, IOL, Docker и Wireshark. Можно эмулировать реальные протоколы, взаимодействие на уровне L2/L3, более точно моделировать отказоустойчивость, маршрутизацию, firewall, NAT и т. д.
Он хорош тем, что его просто развернуть на сервере и дать доступ нескольким студентам — у каждого будет своя учётка и свой набор лабораторий.
Сайт с полной документацией по PNETLab.
На этом фоне предыдущего оппонента выглядит гораздо серьёзнее: реальные образы, настоящие операционные системы, поддержка разных вендоров. Но поработав с ним, я заметил проблему с конфигурацией устройств:
Если вы работаете локально, то знаете, что в «пнете» приходиться постоянно запускать виртуальную машину. После перезапуска могло что то не сохраниться, поломаться, а при экспорте — конфигурации устройств полностью слетали. В основном это происходит, если конфигурировать устройства в интерактивном режиме.
За всё время работы с «пнетом», я пробовал разные методы действий, который позволяет не потерять конфигурации. Для этого вам нужно разобраться с Startup Configs, но по себе скажу, это не гарантирует какой то стабильности в работе. Я считаю, что такие вещи, как автосохранение конфигурации устройств, должны работать на автоматизме. Без всяких костылей.
Еще одна проблема «пнета» — его производительность. На простых ноутбуках не очень удобно работать. В одной виртуальной машине запускаются другие виртуальные машины (через QEMU, Dynamips, IOL и т. д.).
Запуск 4–5 устройств одновременно легко загружает процессор на 70–100%, особенно если у вас не передовое устройство. Я работаю на 8 ядерном, 16 поточном ноутбуке, для виртуалки выделяю половину ресурсов процессора. Если конфигурация стенда становится хоть немного сложнее (10+ устройств), начинает тупить интерфейс, система "пнета" становиться непослушной. Это была моя "точка кипения". Я не мог спокойно продолжать работать с такой проблемой.
Почему Containerlab?
Когда я впервые ворвался в Linux Сommunity, мне было много чего не понятно. Интерес крутился вокруг могущества командной строки терминала. Так я стал привыкать работать исключительно в терминале, без графической оболочки GUI. В этом есть какой то шарм.
В какой то момент я пришел к Docker. Мне изначально понравилась концепция контейнеров, открывающие большие просторы возможностей быстро поднимать тестовые среды.
Так всё же, что такое Containerlab?
Containerlab (сокр. clab) — это инструмент от команды Nokia Srlinux, предназначенный для создания виртуальных сетей с использованием контейнеров. Если цитировать официальную документацию:
С ростом числа контейнеризированных сетевых операционных систем растет и потребность в их легком запуске в определяемых пользователем универсальных лабораторных топологиях.
К сожалению, инструменты оркестровки контейнеров, такие как Docker-compose, не подходят для этой цели, поскольку они не позволяют пользователю легко создавать соединения между контейнерами, определяющими топологию.
Containerlab предоставляет CLI для оркестровки и управления сетевыми лабораториями на основе контейнеров. Он запускает контейнеры, создает виртуальную проводку между ними для создания топологий лабораторий по выбору пользователей и управляет жизненным циклом лабораторий.
Возможностьсоздания «виртуальных связей» между контейнерами — визитная карточка clab. Официальная страница проекта.
Установка производиться в одну команду (Для Debian и RHEL-like дистрибутивов):
bash -c "$(wget -qO - https://get.containerlab.dev)"
Топология задается через YAML-файл. Пример файла представлен ниже:
name: network
topology:
nodes:
isp1:
kind: linux
image: frrouting/frr:latest
binds:
- ./config/isp1/frr.conf:/etc/frr/frr.conf
- ./config/isp1/vtysh.conf:/etc/frr/vtysh.conf
exec:
- /usr/lib/frr/frrinit.sh start
m1:
kind: linux
image: frr-for-vrrp-config:0.1.0
binds:
- ./config/m1/frr.conf:/etc/frr/frr.conf
- ./config/m1/vtysh.conf:/etc/frr/vtysh.conf
env:
IS_MASTER: "1"
exec:
- /usr/lib/frr/frrinit.sh start
m2:
kind: linux
image: frr-for-vrrp-config:0.1.0
binds:
- ./config/m2/frr.conf:/etc/frr/frr.conf
- ./config/m2/vtysh.conf:/etc/frr/vtysh.conf
exec:
- /usr/lib/frr/frrinit.sh start
sw1:
kind: linux
image: v-switch:v1
links:
- endpoints: ["m1:eth1", "sw1:eth1"]
- endpoints: ["m2:eth1", "sw1:eth2"]
- endpoints: ["isp1:eth1", "sw1:eth3"]
У clab'a явное преимущество, на которое я обратил внимание — это возможность очень быстро и понятно взаимодействовать, управлять топологией.
mish@debian:~$ clab --help
deploy container based lab environments with a user-defined interconnections
Usage:
containerlab [command]
Aliases:
containerlab, clab
Available Commands:
completion generate completion script
config configure a lab
deploy deploy a lab
destroy destroy a lab
exec execute a command on one or multiple containers
generate generate a Clos topology file, based on provided flags
graph generate a topology graph
help Help about any command
inspect inspect lab details
redeploy destroy and redeploy a lab
save save containers configuration
tools various tools your lab might need
version Show containerlab version or upgrade
Flags:
-d, --debug count enable debug mode
-h, --help help for containerlab
--log-level string logging level; one of [trace, debug, info, warning, error, fatal] (default "info")
--name string lab name
-r, --runtime string container runtime
--timeout duration timeout for external API requests (e.g. container runtimes), e.g: 30s, 1m, 2m30s (default 2m0s)
-t, --topo string path to the topology definition file, a directory containing one, 'stdin', or a URL
--vars string path to the topology template variables file
Так же хочется выделить производительность. Контейнеры используют намного меньше ресурсов, чем полноценная виртуальная машина. За счет этого, топологию можно быстро включать, выключать, перезагружать и т. д.
Даже не смотря на то что вся работа происходит в терминале, есть возможность визуализации через команду graph. Clab предоставляет возможность экспорта графа в различных форматах: drawio, mermaid и т. д. Также есть возможность отобразить топологию в браузере.
Если обобщить всё мною сказанное в единую таблицу, то выйдет примерно вот так:
Возможности / Инструмент |
Cisco Packet Tracer |
PNETLab |
Containerlab |
---|---|---|---|
Поддержка реальных образов |
Только эмуляция Cisco |
Cisco IOS, ASA, Juniper, Microtik, др. |
Cisco, Microtik, Juniper, FRR, Nokia, Arista, VyOS и др. (через Docker) |
Приближенность к реальности |
Базовая эмуляция |
Реальные образы, протоколы |
Реальные образы, протоколы в контейнерах |
GUI |
Имеется |
Имеется |
Отсутствует |
Лёгкость запуска и установки |
Очень простой |
Средней сложности |
Простой (если дружить с Docker) |
Автоматизация |
Отсутствует |
Частичная (через CLI) |
YAML-конфигурации, CI/CD, Git, Ansible и др. |
Поддержка Docker и контейнеров |
Отсутствует |
Только как один из типов образов |
Основной принцип работы |
Производительность / ресурсоёмкость |
Легкий |
Высокая нагрузка (особенно с несколькими ВМ) |
Очень лёгкий (всё в контейнерах) |
Заключение
В данной статье я не стал копать слишком глубоко. Здесь был проведён анализ на почве опыта. Возможно кому то, кто ищет альтернативу, это облегчит жизнь.
Благодарю за прочтение статьи. Если у вас есть схожий опыт — буду рад обменяться.
Roman2dot0
Там всё, что не "ванильный" linux, запускается в виртуалках и виртуалки запускаются в контейнерах.