Как стать автором
Обновить

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

Время на прочтение 7 мин
Количество просмотров 23K
Сегодня мы рассмотрим разнесение на разные компьютеры оболочки 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


Вариант 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


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
Теги:
Хабы:
+3
Комментарии 6
Комментарии Комментарии 6

Публикации

Истории

Ближайшие события

Московский туристический хакатон
Дата 23 марта – 7 апреля
Место
Москва Онлайн
Геймтон «DatsEdenSpace» от DatsTeam
Дата 5 – 6 апреля
Время 17:00 – 20:00
Место
Онлайн
PG Bootcamp 2024
Дата 16 апреля
Время 09:30 – 21:00
Место
Минск Онлайн
EvaConf 2024
Дата 16 апреля
Время 11:00 – 16:00
Место
Москва Онлайн