Cisco / GNS3 и dynamips на удаленном сервере

в 15:32, , рубрики: Cisco, GNS3, linux, метки: , ,

Сегодня мы рассмотрим разнесение на разные компьютеры оболочки 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 — штатный

Как это работает.
На сервере запускается 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 файл для запуска гипервизора.

Cisco / GNS3 и dynamips на удаленном сервере

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

Далее в редакторе правим порт с стандартного 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 

После запуска окно консоли должно выглядеть подобным образом

Cisco / GNS3 и dynamips на удаленном сервере

Все остальные действия не сильно отличаются от таковых под 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 

Cisco / GNS3 и dynamips на удаленном сервере

Edit->Preferences проверяем настройки локального динамипса.
Не забываем нажать «Test Settings»

Cisco / GNS3 и dynamips на удаленном сервере

Edit->IOS images and hypervisors
В поле HOST вводим ip адрес нашего сервера с dynamips, PORT — порт, выбранный для ручного запуска dynamips.

Cisco / GNS3 и dynamips на удаленном сервере

Теперь во вкладке IOS images добавляем образ.

Cisco / GNS3 и dynamips на удаленном сервере

ВАЖНО. Путь к «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

PS1
baseconfig.txt

! 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

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js