Сегодня мы рассмотрим разнесение на разные компьютеры оболочки GNS3 и эмулятора Cisco IOS Dynamips.
Дано:
мощный сервер (дом/работа/Hetzner/Amazone) и достаточно слабое рабочее место (ноутбук/нетбук/etc.).
Задача:
перенести нагрузку от эмуляции большого числа IOS на сервер для комфортной работы.
Решение:
Будут рассмотрены несколько вариантов — штатный (! Да, вы не замечали в настройках вкладку «Гипервизоры»? ) и работающие с костылями [unix way], но на мой взгляд несколько удобней.
Для работы будем использовать следующее ПО:
— GNS3 0.8.2-BETA, но должно работать и на ветке 0.7.x
— Dinamips 0.2.8-RC2
— Linux Ununtu 11.10 / Windows 7
— bash, tmux, ssh
<a rel="nofollow" name="habracut">
- Вариант 1 — штатный
— Server: Linux
— Server: Windows
— Client: Linux
— Client: Windows - Вариант 2 — unix way
- Вариант 3 — unix way/ part 2
- PS1 — baseconfig.txt
- PS2 — tmux
Вариант 1 — штатный
Как это работает.
На сервере запускается dynamips в режиме гипервизора. На клиенте (рабочая станция с GNS3) отключается управление локальными гипервизорами и прописываются удаленные.
Server: Linux
$ sudo apt-get install dynamips $ cd /tmp $ dynamips -H 7220 Cisco Router Simulation Platform (version 0.2.8-RC2-amd64) Copyright (c) 2005-2007 Christophe Fillot. Build date: Jan 18 2011 19:25:29 Hypervisor TCP control server started (port 7220).
Если вы видите подобное сообщение о запуске сервера — все работает.
Перед запуском гипервизора необходимо перейти в «рабочую» директорию, т.к. в процессе работы он создает много временных файлов. В данном случае они нас не интересуют, поэтому будем работать в папке tmp.
Можно оставить сервер и перейти в другой терминал или остановить гипервизор.
^CHypervisor: closing control sockets. Hypervisor: closing remote client connections. Shutdown in progress... Shutdown completed.
Для удобства советую использовать tmux.
Также при использовании брандмауэра не забудьте сделать в нем исключения на входящий порт гипервизора (в данном случае TCP 7220) и консольные соединения (настраиваются в GNS3).
Гипервизор готов, осталось подготовить образы IOS.
Скачиваем образ с сайта cisco.com или, в случает отсутствия подписки, с известного торрент трекера.
Не забываем для ускорения загрузки распаковывать образы, для этого с сайта GNS3 скачиваем "Cisco image unpacker 0.1 source code".
$ mkdir ~/IOS $ cd ~/IOS $ mv ~/Downloads/Unpack-0.1_src.tar.bz2 ./ $ mv ~/Downloads/c2600-ipbasek9-mz.124-17.bin ./ $ tar -xjf Unpack-0.1_src.tar.bz2 $ rm Unpack-0.1_src.tar.bz2 $ python ./Unpack/unpack.py --format=IOS c2600-ipbasek9-mz.124-17.bin warning [c2600-ipbasek9-mz.124-17.bin]: 17812 extra bytes at beginning or within zipfile (attempting to process anyway) IOS binary image successfully unpacked in c2600-ipbasek9-mz.124-17.bin.unpacked
Server: Windows
Как говорят знающие люди — dynamips под win работает стабильно хуже, но приступим к установке.
Качаем "GNS3 v0.8.2 BETA all-in-one".
После установки открываем папку с GNS3 и dynamips и находим .bat файл для запуска гипервизора.
Можно вынести ярлык в удобное место, например на рабочий стол, т.к. запускать его придется часто.
Далее в редакторе правим порт с стандартного 7200 на 7220:
rem Launch a local copy of dynamips set dynamips=%CD%dynamips.exe cd %TEMP% start /belownormal /B /wait "Dynamips" "%dynamips%" -H 7220 pause
После запуска окно консоли должно выглядеть подобным образом
Все остальные действия не сильно отличаются от таковых под Linux (см. выше):
— открыть порты в брандмауэре;
— скачать образы IOS;
— распаковать образ, распаковщик.
Client: Linux
В Ubuntu можно установить GNS3 через пакеты
$ sudo apt-get install gns3
Но там довольно старая версия (0.7.4), поэтому скачаем исходники. Компилировать ничего не придется, т.к. он написан на питоне. Для удовлетворения всех зависимостей сначала установим GNS3 из пакета, затем скачаем последнюю версию из репазитория.
$ sudo apt-get install gns3 $ sudo apt-get install mercurial $ cd ~/IOS/ $ hg clone http://code.gns3.net/gns3-devel $ cd gns3-devel $ ./gns3.pyw
Edit->Preferences проверяем настройки локального динамипса.
Не забываем нажать «Test Settings»
Edit->IOS images and hypervisors
В поле HOST вводим ip адрес нашего сервера с dynamips, PORT — порт, выбранный для ручного запуска dynamips.
Теперь во вкладке IOS images добавляем образ.
ВАЖНО. Путь к «Image file» и «Base config» указываются на сервере. Для пользователя, из-под которого запущен dynamips, эти файлы должны быть доступны на чтение.
Локально таких файлов может не существовать.
Убираем пункт «Use the hypervisor manager» и выделяем нужный сервер.
После чего сохраняем. В списке образов мы видим что обращение будут идти не на локальный гипервизор, а на таковой на сервере 172.16.1.1.
Долее как обычно создаем топологию и работаем.
Client: Windows
Отсюда качаем и устанавливаем "GNS3 v0.8.2 BETA all-in-one" — собранную последюю версию GNS3.
Все настройки соответствуют клиенту под Linux.
Вариант 2 — unix way
Минусов у штатного решения два:
— необходимость вручную логиниться на удаленный сервер для запуска гипервизора;
— открытый канал управляющего соединения с гипирвизором и консолями.
При запуске гипирвизора с ключем "-H 7220" dynamips открывает прослушивающий сокет на всех доступных адресах:
$ sudo netstat --numeric --listening --program | grep dynamips tcp 0 0 0.0.0.0:7220 0.0.0.0:* LISTEN 12756/dynamips
Никакой авторизации и шифрования не предусмотрено и, при включенном режиме «паранойя», такое в интернет не выставляется. Возможности повесить гипервизор на определенный ip, например 127.0.0.1, нет, и порт в любом случае необходимо закрывать брандмауэром.
На первый взгляд, необходимо использовать VPN, что выходит за рамки данной стати.
Так же при локальной работе менеджер гипирвизоров при некоторых обстоятельствах запускает несколько копий dynamips на разных портах.
Вариант решения — настраиваем GNS3 на работу с локальным dynamips, но создаем прослойку, которая открывает удаленное соединение по ssh до сервера, автоматически запускает там гипервизор и пробрасывает порты поверх своего шифрованного соединения. Фактически это будет один скрип, запускаемый с разными ключами — для управляющего соединения и для удаленной консоли.
Приступим!
NOTE. Для корректной работы должна быть настроена аутентификация в SSH по ключам || править скрипт.
NOTE. Версия GNS3 должна быть выше 0.8.2 beta2(например из репазитория), т.к. в ней присутвует баг, при котором управляющий скрипт не может правильно погасить удаленный dynamips.
Edit->Preferences в настройки локального dynamips и вместо его бинарника пишем путь до нашего скрипта
/home/%username%/IOS/rdyn.sh
Также изменяем строку подключения к консоли
gnome-terminal -t %d -e '/home/%username%/rdyn.sh -R %p' >/dev/null 2>&1 &
Не забываем выставитт полный путь к файлу в комманде и заменить переменные в скрипте.
#!/usr/bin/env bash HOST=host.tld #HOST=2001:470::1 PORT=4444 USER=username ####################################### WRKDIR='/tmp' DYNAMIPS='/usr/bin/dynamips' RCMD=$1 RPORT=$2 SSHOPT="-a -T -q -x -o ExitOnForwardFailure=yes -o TCPKeepAlive=yes -o BatchMode=yes -o ControlPersist=10 -o ControlPath=/tmp/rdyn.%h.%p.%r -p $PORT $USER@$HOST " TELNETCMD="ssh -N -f -L 127.0.0.1:$2:127.0.0.1:$2 $SSHOPT" ######################################## trap quit INT TERM HUP KILL function quit { if [ $RCMD = '-H' ] ; then ssh $SSHOPT "pkill -f "$DYNAMIPS -H $RPORT"" & else pkill -f "$TELNETCMD" fi exit } ######################################## if [ "$1" = '' ] ; then echo 'Error: script expects some commands.' exit fi ssh -M -f $SSHOPT exit > /dev/null 2>&1 if [ "$1" = '--help' ] ; then ssh $SSHOPT "$DYNAMIPS --help" else if [ "$1" = '-H' ] ; then ssh -L 127.0.0.1:$2:127.0.0.1:$2 $SSHOPT "cd $WRKDIR ; $DYNAMIPS -H $2" 2> /dev/null & while : ; do wait; sleep 1; done else $TELNETCMD > /dev/null 2>&1 telnet 127.0.0.1 $2 pkill -f "$TELNETCMD" read fi fi
Принцип работы:
— попытка запустить мастер соединение с сервером (завершается по idle таймауту автоматически);
в процессе работы создается достаточно много dynamips-over-ssh и telnet-over-ssh сессий и мультиплексирование, в данном случае, заметно ускоряет работу.
— создание ловушки для корректной остановки удаленного dynamips;
— запуск гипервизора или telnet соединения.
Вариант 3 — unix way/ part 2
Проброс X11 GUI приложения.
Плюсы: работает, причем все и «из коробки».
Минусы: медленно. Удовлетворительный результат только в пределах LAN при маленьких задержках и больших скоростях.
ssh -X -C username@host.tld gns3
-C включает сжатие
-X активирует проброс X11 сессии /не забываем включить 'X11Forwarding yes' в sshd_config/
Но в случае использования X11 Forwording мы, фактически, лишаемся возможности загружать .net файлы и просматривать сохраненные конфигурации локально.
Для пользователи тяжелых оболочек могут воспользоватся встроенными функциями. Например Nautilus умеет добавлять в закладки sftp линки.
Возможен более универсальный вариант в связке fuse+ssh= sshfs.
Эта тема уже обсуждалась на хабре, поэтому будет только идея.
Создаем в домашнем каталоге основную папку для работы с GNS и вспомогательный скрипт.
sshfs username@host.tld:/home/%username%/CISCO ~/CISCO cat << ENDL > ~/CISCO/rgns3 ssh -X -C username@host.tld gns3 $1 ENDL chmod +x ~/CISCO/rgns3
Модель работы:
— Скачиваем, например, лабораторную. Допустим, ROUTE: EIGRP.
— Монтируем sshfs.
— Распаковываем архив в ~/CISCO
— Запускаем
~/CISCO/rgns3 ~/CISCO/EIGRP/topology.net
! hostname %h no ip domain-lookup line con 0 exec-timeout 0 0 logging synchronous privilege level 15 service timestamps debug datetime msec line vty 0 15 no login exec-timeout 0 0 logging synchronous privilege level 15
Это не боевая конфигурация и имеет проблемы с безопасностью, но для обучения удобна.
PS2
Настройка tmux для работы с консолями dynamips.
В tmux я создаю отдельную сессию для консолей, а из GNS3 только добавляю соединение к существующей.
$ cat gconsole.sh unset TMUX; tmux new-session -d -s GNS3 >/dev/null 2>&1 gnome-terminal -e '/usr/bin/tmux attach-session -t GNS3'
GNS3 Edit->Preferences «Terminal command»
unset TMUX; tmux new-window -t GNS3 -n '%d' 'telnet %h %p ; cat' >/dev/null 2>&1 &
и при использование dynamips-over-ssh варианта
unset TMUX; tmux new-window -t GNS3 -n '%d' '/home/%username%/IOS/rdyn.sh -R %p' >/dev/null 2>&1 &
Материалы:
— forum.gns3.net
— man dynamips
— man tmux
Автор: Legh