Здравствуйте, коллеги. Продолжаем освещать разработку UNetLab. В предыдущем посте я рассказывал о новой версии UNetLab 1.0 и анонсировал запуск видео курса. Но время идет и разработчики выпустили очередное значительное обновление — UNetLab 1.0.0-12. Ключевые новшества, которые будут описаны в этой статье:
1) Dynamic nodes connection
2) Интеграция с Docker
Если вас заинтересовала данная тема, добро пожаловать по кат.
Dynamic nodes connection
Функция, которую так ждали все пользователи UNetLab. Наконец-то стало возможным динамическое соединение узлов простым кликом мышки (в видео уроке ниже показан сам процесс).
Теперь нет необходимости создавать сети в ручную. Таким образом создание топологий в UNetLab стало таким же удобным, как и в GNS3.
Если вы еще не успели обновиться, то делается это элементарно:
apt-get update
apt-get install unetlab
Интеграция с Docker
Вообще говоря, реализация Docker-а в UNL еще сыровата и требует серьезной доработки, однако я не могу не затронуть эту тему, т.к. она очень важна. На сколько я знаю, даже новая версия GNS3 так же имеет поддержку Docker-а. У этой технологии очень большой потенциал.
Но прежде чем начать, думаю весьма логично сначала рассказать про сам Docker. Что же это такое? Вопрос не самый простой, но я, как обычно, постараюсь объяснить максимально просто. Описывать буду поверхностно и общими фразами, т.к. данный курс не про виртуализацию, да и я сам не считаю себя экспертом в этой области.
Итак, на сегодняшний день можно выделить три основных вида виртуализации:
1) Полная (аппаратная) виртуализация</4>
Данный тип виртуализации используют VirtualBox, VMware, KVM, QEMU и т.д. Смысл заключается в полной эмуляции компьютера со всеми аппаратными средствами. В данном случае гипервизор распределяет аппаратные средства между виртуальными машинами. И уже в эти виртуальные машины устанавливается Операционная система, практически как на полноценный физический компьютер. Виртуальные машины полностью изолированны друг от друга. Аппаратная виртуализация должна поддерживаться процессором. Многие наверно уже включали в биосе эту функцию. Это либо Intel VT (VT-x) либо AMD-V.
2) Виртуализация уровня операционной системы
Данный тип виртуализации используют OpenVZ, LXC и т.д. В этом случае уже не используется эмуляция аппаратных средств. Создается как бы копия большинства процессов исходной операционной системы. Эти процессы изолируются в отдельный контейнер (отсюда и название — контейнерная виртуализация). При этом в контейнере мы получаем практически полноценную операционную систему, куда могут быть установлены приложения. Такой подход дает выигрыш в производительности по сравнению с полной виртуализацией, т.к. нет необходимости эмулировать аппаратные средства. Вообще есть много плюсов и минусов использования того или иного типа виртуализации, но наш урок не об этом.
3) Виртуализация приложений
Это уже более высокий уровень абстракции, который позволяет еще больше экономить системные ресурсы. Зачем виртуализировать целую операционную систему если нам к примеру нужна только отдельная база данных? Или отдельный web — сервер? Docker решает этот вопрос. Он позволяет создавать копию не всех процессов исходной операционной системы, а копию отдельного приложения и изолировать его в контейнер. Это очень удобно при разработке и тестировании. При этом docker так же умеет виртуализировать операционную систему, как это делает OpenVZ или LXC.
Если есть желание познакомиться с docker поближе, то можете воспользоваться данным ресурсом.
Вкратце рассказал, что есть что. Повторюсь, что я описал все очень поверхностно. Я даже не затрагивал такие вещи, как виртуализация сети или виртуализация систем хранения данных. Вообще виртуализация очень интересная и обширная тема. Если у вас есть свободное время, то по возможности обучайтесь по этому направлению, т.к. без виртуализации сегодня уже никуда!
А мы, тем временем, переходим к docker-у. Кто-то может спросить: «Зачем нам docker, когда есть и QEMU, и внешние виртуалки в виде VMware и тот же VPCS?» Попробую ответить.
Если взять виртуалки в виде QEMU или VMware, то они всем хороши, но, потребляют слишком много ресурсов (память, процессор, жесткий диск).
Казалось бы, есть VPCS, который вообще ничего не потребляет. Но у него весьма скудный функционал. Нет telnet или ssh клиента, нет tcpdump-а, нет nslookup-а и многих других полезных функций. Т.е. на данный момент мы либо тратим много ресурсов, либо испытываем проблемы с нехваткой функционала. Docker призван решить наши проблемы. Docker позволяет запустить практически полноценную Linux подобную систему с довольно скромныными параметрами, как по оперативной памяти, так и по жесткому диску. При этом у нас огромный выбор готовых контейнеров с различными дистрибутивами или приложениями.
В этом уроке мы рассмотрим работу с одним из самых маленьких контейнеров для docker-а — BusyBox. Что это такое, можно почитать вот здесь. Если коротко, то это очень маленький дистрибутив, с очень маленькими системными требованиям. Что ж, начнем.
Для начала нам необходимо установить docker на сервер unetlab, т.к. по умолчанию он отсутствует. Подробная инструкция есть на официальном сайте UNL в разделе howto. Не вижу смысла дублировать здесь эту информацию.
После установки можем перейти к веб-интерфейсу unetlab. Кстати говоря, для подключения к контейнерам используется специальная утилита docker-а. Убедитесь что у вас в папке C:\Program Files\UNetLab присутствуют необходимые файлы: docker.exe, docker_wrapper и win7_64bit_docker. Если нет, то вам нужно установить новый windows integration pack.
Какой же функционал нам дает этот экстремально малый дистрибутив? На самом деле довольно богатый. В busybox нам доступны:
— Клиент и сервер telnet
— Клиент и сервер tftp
— Клиент и сервер ftp
— HTTP сервер
— DNS сервер
— NTP сервер
— Такие утилиты как:
— ifconfig
— ip route
— traceroute
— arp
— nslookup
— netstat
Теперь давайте соберем простенькую схему и воспользуемся доступным нам функционалом. Предположим, что нам в лабораторной работе понадобилось протестировать такие сервисы как DHCP, HTTP, DNS, FTP и Telnet. Все это мы можем сделать с помощью Docker! Для настройки мы будем использовать следующие встроенные сервисы BusyBox:
udhcpd — для DHCP сервера
httpd — для WEB сервера
dnsd — для DNS сервера
ftpd — для FTP сервера
telnetd — для Telnet сервера
Весь процесс настройки можно посмотреть в данном уроке (смотреть с 10-й минуты):
Таким образом, мы подняли Telnet сервер, HTTP сервер, DHCP, FTP и DNS сервер на одном контейнере, образ которого весит всего 1 Мбайт! Впечатляет, правда? И мы рассмотрели всего лишь один образ, а их огромное кол-во с различным софтом внутри. Более того, вы можете с легкостью собрать свой собственный образ с нужным вам набором утилит. Наш урок не про это, но если вам стало интересно, то обязательно изучите эту возможность.
Резюмирую вышесказанное: можно с уверенностью сказать, что UNetLab продолжает динамичное развитие и становится все более функциональным и удобным средством для обучения.
Комментарии (18)
DeeZ
23.07.2016 14:47Дела по мануалам. но почему то нет части команд
root@Docker:/# ipconfig bash: ipconfig: command not found root@Docker:/# ip route bash: ip: command not found root@Docker:/#route bash: route: command not found root@Docker:/# ping bash: ping: command not found
ciiccii
24.07.2016 13:59возможно не тот образ busybox поставился?
DeeZ
24.07.2016 14:22Пробоал ставить убунту (как из мануала на оф сайте) ровно та же картина. может я что то не так делаю… пока в докере не силен. но вроде все по гайдам.
DeeZ
24.07.2016 18:14Разобрался со своей проблемой. У меня до этого был установлен образ убунту, как в официальном доке на UNL. и почему то всегда запускался именно он, даже если выбрать бизибокс (видимо та самая сырость UNL). Удалил убунту, поставил один бизибокс — все стало ок.
DeeZ
24.07.2016 18:48Не заработал сеть. Если старую руками с ключом "--cap-add=NET_ADMIN " все ок. а из UNL не дает поменять IP:
/ # ip addr add 10.0.0.1/24 dev eth0 ip: RTNETLINK answers: Operation not permitted
Как заставить UNL запускать с этим параметром?DeeZ
24.07.2016 20:19Победил.
Честно пока не знаю на сколько это опасно и костыльно (первый день докер трогаю). Но в UNL часть параметров из стартап конфига у меня не применялась. А из-за сырости докера приходилось удалять докер. добавлять снова. добавлять линк, потом идти писать\править стартап, и в Nodes выбирать стартап конфиг (если выбрать его при создании ноды — оно тоже не работает). надоело тратить кучу временина проверку каждой строки, решил рестартануть контейнер.
#Из консоли UNL: docker -H=tcp://127.0.0.1:4243 ps -a #Запущеный UNL-ом контейнер будет с именем типа #NAMES: 82870f34-925a-438f-a17d-1841250497a6-0-5 #ORTS: 47a9753304cc #Удаляем его: docker -H=tcp://127.0.0.1:4243 rm 47a9753304cc #запускаем с атрибутом NET_ADMIN и таким же именем: docker -H=tcp://127.0.0.1:4243 run --cap-add=NET_ADMIN -d --name 82870f34-925a-438f-a17d-1841250497a6-0-5 -i -t busybox /bin/sh
Полагаю если добавить еще один докер, то надо будет рестартануть опять новый контейнер.cooper051
25.07.2016 09:00Через startup config разве не работает?
DeeZ
25.07.2016 10:13Возможно это как раз сырость докера. У меня не срабатывал роут. ни через ip route ни через route add.
На этой же лабе добавил второй докер — создался второй контейнер и все заработало. До этого исопльзовался всегда один, даже если удаляешь ноду.
По этому я долго мучался с образом убунту, из How To, думая что запускаю бизибокс.
Теперь у меня проблема с Windows образом :))
ciiccii
24.07.2016 13:59Интересно!
А как подключится к например busybox если виртуальная машина с unetlab запущена не в виндовс, а в линуксе?
Вебинтерфейс unetlab пытается отктырть ссылку типа «docker://192.168.122.60:4243/ace7062e-b1f3-418e-81db-f8f954ac8ef2-0-1?Docker» но браузер её не распознаёт. Ну это ладно, а через терминал как подключиться к работающему образу busybox? На линксе ведь не поставишь windows integration pack. Спасибо!DeeZ
24.07.2016 14:23в статье есть об этом.надо запустить рег файл, что бы ассоциировать ссылки типа docker:// с docker_warper.bat
Тогда все ок.ciiccii
24.07.2016 15:22хе-хе, это если виртуальная машина в виндовсе запущена. я пытаюсь сделать это в линуксе.
DeeZ
24.07.2016 15:25Если FF то добавьте вручную ассоциацию на протокол
Наверняка понадобится поставить докер, и напистаь срипт, который будет цепляться у кдаленому хосту. хотя може есть уже готовй пакет для линуксов.ciiccii
24.07.2016 17:40Спасибо, ещё бы узнать команду для которую нужно передавать для локального докера(docker установлен). Если бы удалось вручную подключиться…
Я пробовал docker attach но что-то не получается.DeeZ
24.07.2016 17:59docker.exe -H=%H% attach %I%
H — берется из ссылки, адрес куда цеплсять.
I — ID докера.Передается в ссылкеciiccii
24.07.2016 20:17+1Если кому интересно, то я навелосипедил скриптик, который запускает команду соответственно протоколу.
cat ./protocol_handler.sh #!/bin/bash protocol=$(echo $1 | cut -d : -f 1) address=$(echo $1 | cut -d / -f 3) user=$(echo $address | grep @ | cut -d @ -f 1) port=$(echo $address | grep : | cut -d : -f 2) host=$(echo $address | cut -d @ -f 2 | cut -d : -f 1) case $protocol in ssh) connectstring=$(echo "$([ -z $user ] || echo "$user@")$host$([ -z $port ] || echo "-p $port")") konsole --new-tab -e "$protocol $connectstring" ;; telnet) connectstring=$(echo "$host $([ -z $port ] || echo "$port")$([ -z $user ] || echo "-l $user")") konsole --new-tab -e "$protocol $connectstring" ;; rdesktop) connectstring=$(echo "$([ -z $user ] || echo "-u $user ")$host$([ -z $port ] || echo ":$port")") rdesktop -g 1280x960 $connectstring ;; vnc) connectstring=$(echo "$host$([ -z $port ] || echo":$port")") vncviewer $connectstring ;; docker) konsole --new-tab -e docker -H=$address attach $(echo $1 | cut -d / -f 4 | cut -d \? -f 1) ;; esa
chemtech
Может расскажите/напишите создание лабы где будет подключение IPSEC VPN между Linux в Docker и Cisco?
Также интересная тема: Учет трафика Cisco ASA с помощью NetFlow на Linux в Docker.
Заранее спасибо.