GNS3 в облаке

===================================
Статья написана Дмитрием Фиголем для Linkmeup.ru
===================================


Привет!
Сегодня я вам расскажу, как настроить GNS3 сервер в облачных сервисах. А в конце будет небольшой FAQ по GNS3.
Для примера был выбран Google Compute Engine (GCE) (из-за бесплатного двухмесячного триала и более низких цен на виртуалки в Европе по сравнению с AWS).

Почему вообще стоит заморачиваться?
Один раз попробовав, я больше не запускаю GNS3 локально. Нет смысла забивать оперативку своего ноутбука лабой. Кроме того, я могу запускать свои CCIE лабы с любого компьютера (в моём случае рабочий и домашний ноутбуки) — неважно, сколько RAM/какой CPU. При этом, локальные файлы лаб я сохраняю в Dropbox, что позволяет мне продолжать работать над той же лабой с разных устройств.
Под катом вы найдёте подробную инструкцию по установке GNS3 в GCE.


Подготовка VM



1. Регистрация

Зарегистрироваться можно здесь.

2. Создание проекта

После регистрации нам необходимо создать проект с помощью кнопки Create Project.


3. Создание виртуальной машины (инстанса)

После создания проекта мы попадаем в меню Google Cloud Platform.
Для создания виртуалки нажимаем в верхнем левом углу Menu -> Compute Engine:
image

Нажимаем на Create instance:


Параметры:
Name: gns3server
Zone: любая в Европе
Machine type: n1-standard-2 (2 vCPU 7.5 GB RAM) или лучше
Boot disk: 10-15 GB standard persistent disk, image Debian 8.3 jessie (или Ubuntu)
Внизу нажимаем Networking -> External IP: New Static IP. Вводим любое имя.


Нажатие на Create создаст виртуалку.

4. Проверка имени пользователя

После того, как виртуалка создастся, заходим на неё с помощью браузерного SSH клиента: SSH -> Open in browser window
Проверяем имя пользователя с помощью whoami. Если имя пользователя не gns3, то необходимо его изменить:
Settings -> Change Linux Username -> вводим gns3 -> ok

5. Настройка SSH доступа к серверу

Теперь настроим доступ для любимого SSH клиента, в моём случае это SecureCRT.
Нам необходимо создать приватный ключ (если у вас ещё нет). Это можно сделать с помощью ssh-keygen или PuTTYgen (Windows), или непосредственно в SecureCRT с помощью Tools -> Create Public Key.
Ключ должен быть в OpenSSH формате с комментарием gns3. Не забудьте поставить пароль для приватного ключа (зашифровать).
Теперь необходимо добавить созданный публичный ключ в GCE с помощью меню:
Compute Engine -> Metadata -> SSH keys -> Edit


Нажимаем Add item, добавляем содержимое файла id_rsa.pub и нажимаем Save.
После этого необходимо проверить, что мы можем зайти на сервер с помощью выбранного SSH клиента.

6. Настройка сетевого доступа/Firewall

Заходим в Menu -> Networking, потом в Firewall Rules:
Убираем 0.0.0.0/0 везде, кроме ICMP.
В правило default-allow-ssh, добавляем свой IP в IP ranges. Не забудьте добавить потом другие IP, с которых вы будете пользоваться GNS3 сервером.
Можно также добавить в это правило Google IP (74.125.0.0/16), чтобы можно было заходить по SSH через браузер.

Нам необходимо создать ещё одно правило с помощью кнопки Create Firewall Rule:
Name — allow-gns-traffic
Source IP ranges — ваши IP адреса
Allowed protocols and ports — tcp:8000; tcp:2000-3100; udp:10000-11000


Опционально: отключение password-less sudo (рут без пароля)

Опционально: управление виртуалкой локально с помощью Python

Установка GNS3 server непосредственно на виртуалку



7. Добавление репозитория (PPA) с пакетами GNS3

Необходимо внести изменения в следующий файл:
sudo nano /etc/apt/sources.list

Добавляем в конец файла следующее:
deb http ://ppa.launchpad.net/gns3/ppa/ubuntu trusty main
deb-src http ://ppa.launchpad.net/gns3/ppa/ubuntu trusty main
* Удалить пробел перед копированием

Добавим ключ для PPA:
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys A2E3EF7B


8. Установка необходимых пакетов

Сначала обновим установленные пакеты:
sudo dpkg --add-architecture i386 && sudo apt-get update && sudo apt-get upgrade

Установим всё необходимое для GNS3 сервера:
sudo apt-get install git python3 python3-pip gns3-server gns3-iou


9. Изменение максимальной длины очереди для датаграмм

Это необходимо, чтобы избавиться от EXCESSCOLL ошибки во время работы с лабой. Вносим изменения в следующий файл:
sudo nano /etc/sysctl.conf

Добавьте в конце:
# Prevent EXCESSCOLL error
net.unix.max_dgram_qlen=1000000


Замечание: если вы собираетесь использовать IOL, то необходимо также положить файл лицензии в домашнюю директорию (~/.iourc). Напомню, что легально его можно получить, только если вы являетесь сотрудником Cisco.

10. Автоматический запуск сервера GNS3 при запуске виртуалки.

Напомню, что в последней версии Debian используется systemd в качестве init system/service manager.
Подготовка:
Создаем лог файл и передаем права на него пользователю gns3
sudo touch /var/log/gns3.log
sudo chown gns3 /var/log/gns3.log

Необходимо также создать несколько директорий в момент старта. Для этого вносим изменения в следующий файл:
sudo nano /etc/tmpfiles.d/gns3.conf

Добавляем:
d /var/run/gns3 0755 gns3 gns3
d /var/cache/gns3 0755 gns3 gns3


Создаем конфигурационный файл демона gns3server:
sudo nano /etc/systemd/system/gns3.service

Добавляем:
[Unit]
Description=GNS3 server

[Service]
Type=forking
Environment=statedir=/var/cache/gns3
PIDFile=/var/run/gns3/gns3.pid
ExecStart=/usr/bin/gns3server --log /var/log/gns3.log \
--pid /var/run/gns3/gns3.pid --daemon
Restart=on-abort
User=gns3

[Install]
WantedBy=multi-user.target


Запускаем демон и перезагружаем виртуалку, чтобы создались директории:
sudo systemctl enable gns3.service
sudo reboot now


11. Проверка

Проверим, что gns3server работает и узнаем его версию:
➜ ~ systemctl check gns3
active
➜ ~ ps -aux | grep gns3server
gns3 574 0.0 0.3 172704 30396 ? Sl 16:02 0:00 /usr/share/gns3/gns3-server/bin/python /usr/bin/gns3server --log /var/log/gns3.log --pid /var/run/gns3/gns3.pid --daemon
➜ ~ gns3server --version
1.4.4


12. Доменные записи

Нам необходимо также создать доменные записи для сервера. Если у вас есть свой домен, я советую создать поддомен для GCE static IP.
Если у вас нет домена, то добавьте следующую запись в ваш локальный hosts file:
<GCE static IP> gns3server

На GNS3 сервере необходимо также изменить /etc/hosts:
sudo nano /etc/hosts

Добавляем:
127.0.0.1 <выбранное доменное имя или gns3server>

На этом настройка серверной части закончена.

Настройка локального клиента GNS3



13. Скачивание клиента

Скачать клиент можно здесь.
Необходимо установить GNS3 клиент такой же версии, как и gns3server (см. шаг #11).

14. Запуск и настройка клиента

При запуске клиента появится Setup Wizard.
Кликаем Don't show this again, затем Cancel


Потом на окне выбора проекта опять кликаем Cancel.

Заходим в меню Preferences.
Кликаем на раздел Server, снимаем галку Enable local server.
Кликаем на вкладку Remote Servers, добавляем доменное имя вашего GNS3 сервера или gns3server, кликаем Add


Кликаем на раздел VPCS, снимаем галку Enable local server.
Кликаем на раздел Dynamips, снимаем галку Enable local server.
Нажимаем на Apply внизу окна.
Кликаем на раздел Dynamips -> IOS routers. Нажимаем на New. Должно появиться такое окно:


Снимаем галку Load Balance и выбираем нужный сервер.
Далее выбираем локальный образ, который хотим использовать — он загрузится автоматически на сервер. Далее следуем диалоговому окну.
В результате выбранный образ Dynamips IOS должен появиться в списке:


IOL образы добавляются точно так же с помощью раздела IOS on UNIX -> IOU Devices.
После добавления всех образов кликаем OK.

15. Проверка

Построим для теста небольшую топологию, состоящую из коммутатора и трёх маршрутизаторов:


Чтобы запустить топологию, используйте кнопку Start/Resume all devices на панели.
После запуска всех устройств можно подключиться к консольным портам, нажав на Console connect to all devices.
Поздравляю, теперь ваши лабы могут быть запущены в облаке!

FAQ


Я ещё не использую GNS3, но хочу начать. Какую версию мне стоит использовать?
— Последнюю стабильную. На момент написания статьи — это 1.4.4.

Как поменять приложение по умолчанию для консольного доступа?
Preferences -> General -> Console Applications -> Edit

Как настроить Wireshark Live Capture?
— Установите Wireshark версии 2.x, в GNS3 Preferences -> Packet Capture убедитесь, что используется правильный путь к Wireshark.

При запуске GUI у меня отображается следующее сообщение: => Client version X differs with server version Y.
Обязательно ли использовать одинаковую версию клиента и сервера?

-Лучше использовать одинаковую, но в большинстве случаев, если клиент и сервер из одной ветки (например, 1.4), то даже несмотря на предупреждение, все будет работать нормально.

Есть ли легальный способ использовать IOL в GNS3 для тех, кто не является инженером Cisco?
— Нет. В таком случае, единственный легальный способ использовать IOL для своих топологий — это CCIE Lab Builder от Cisco.

Можно ли использовать Qemu (KVM) образы в облаке?
— Теоретически можно, если ваш облачный сервис поддерживает Nested Virtualization/KVM hardware acceleration. К сожалению, ни в AWS, ни в GCE это нельзя включить.

Добавлять QEMU образы все также сложно, как и раньше?
— Нет, в 1.4 добавили Appliances — это специальные файлы с преконфигурацией, доступные для скачивания. От вас требуется только предоставить нужный образ.

Можно ли экспортировать/импортировать разные конфиги для одной и той же лабы, если я использую IOL?
— Да, с помощью опции File -> Import/Export configs. Не забудьте только остановить все устройства (перед импортом/экспортом), а перед экспортом также необходимо сохранить проект.

Когда запускается IOL устройство мне показывается initial configuration dialog, можно ли этого избежать?
— Да. Для этого необходимо в файле startup-config.cfg указать все физические интерфейсы, согласно количеству ethernet и serial адаптеров, учитывая что один адаптер содержит 4 интерфейса. Минимальный конфиг для 1 ethernet и 1 serial адаптеров:
interface Ethernet0/0
!
interface Ethernet0/1
!
interface Ethernet0/2
!
interface Ethernet0/3
!
interface Serial1/0
!
interface Serial1/1
!
interface Serial1/2
!
interface Serial1/3
!


У меня есть физический сервер или сервера, где я хочу запускать GNS3. Мне тоже необходимо выполнить столько шагов, чтобы GNS3 работал?
— Нет. Просто скачайте GNS3 VM, где всё предустановлено, и добавьте Remote Server, как показано в последней части статьи.

Поддерживается ли многопользовательский режим?
— Скорее нет, чем да. Ещё очень много необходимо сделать, чтобы можно было это добавить в список поддерживаемых фич. Тем не менее, в текущей версии GNS3 порты для консольных подключений выбираются автоматически, если выбранный порт занят, что позволяет нескольким юзерам делать лабы одновременно.

Куда движется GNS3?
— В 1.5.x ожидается поддержка Docker. Также планируется Web GUI (можно будет выбрать отдельное приложение или Web GUI) и многопользовательский режим. К сожалению, если я не ошибаюсь, обе эти фичи не планируются в 1.5.x

У меня есть предложения по улучшению GNS3. Куда писать?
— GNS3 — open source проект, код выложен на Github. Если вы разработчик, то можете отправить им свой pull request. Если у вас нет возможности помочь кодом, то можете написать о найденных багах и своих пожеланиях на GNS3 форум или непосредственно на GUI github->issues или Server github->issues. С разработчиками можно также пообщаться в IRC канале на irc.freenode.net #gns3: noplay, grossmj.

10 комментариев

avatar
Спасибо за статью!

Не силен в linux, возможно что-то не так сделал, но 7 пункт не удалось выполнить.
7. Добавление репозитория (PPA) с пакетами GNS3
Необходимо внести изменения в следующий файл:
sudo nano /etc/apt/codes.list
Добавляем в конец файла следующее:
deb ppa.launchpad.net/gns3/ppa/ubuntu trusty main
deb-src ppa.launchpad.net/gns3/ppa/ubuntu trusty main


вместо codes.list правил sources.list.
И парсер съел http (хттп://ppa.launchpad.net/gns3/ppa/ubuntu)
avatar
Не удается запустить демон:

gns3@gns3server:~$ sudo systemctl enable gns3.service
Failed to execute operation: Bad message
gns3@gns3server:~$ systemctl check gns3
unknown
gns3@gns3server:~$ ps -aux | grep gns3server
gns3 983 0.0 0.0 12728 2108 pts/0 S+ 18:46 0:00 grep gns3server
gns3@gns3server:~$ gns3server --version
1.4.4

И в клиенте Dynamips -> IOS routers при попытке добавить вылетает ошибка Error while getting the VMs: Cannot connect to the remote server gns3server:8000
Имя резолвится, пинг проходит, на файрволе облака и своем ПК открыл полный доступ, антивир отключил.
Что еще можно попробовать?
avatar
За замечания спасибо, попрошу Марата поправить.
Я сам не линукс эксперт, но покажите пожалуйста следующие выводы, попробуем потраблшутить вместе:
sudo systemctl start gns3.service
systemctl status gns3.service -l
ls -l /etc/systemd/system/gns3.service
cat /etc/systemd/system/gns3.service
which gns3server
avatar
gns3@gns3server:~$ sudo systemctl start gns3.service
Failed to start gns3.service: Unit gns3.service failed to load: Bad message. See system logs and 'systemctl status gns3.service' for details.

gns3@gns3server:~$ systemctl status gns3.service -l
в—Џ gns3.service — GNS3 server
Loaded: error (Reason: Bad message)
Active: inactive (dead)

gns3@gns3server:~$ ls -l /etc/systemd/system/gns3.service
-rw-r--r-- 1 root root 295 Mar 14 18:15 /etc/systemd/system/gns3.service

gns3@gns3server:~$ cat /etc/systemd/system/gns3.service
[Unit]

Description=GNS3 server

[Service]

Type=forking

Environment=statedir=/var/cache/gns3

PIDFile=/var/run/gns3/gns3.pid

ExecStart=/usr/bin/gns3server --log /var/log/gns3.log \

--pid /var/run/gns3/gns3.pid --daemon

Restart=on-abort

User=gns3

[Install]

WantedBy=multi-user.target

gns3@gns3server:~$ which gns3server
/usr/bin/gns3server
avatar
Попробуйте удалить лишние пробелы между строками в /etc/systemd/system/gns3.service
Должно быть так: pastebin.com/GqBq6LA6
avatar
Помогло, спасибо!
avatar
Дима, очень клёво. Мало деталей, но народ такое просит часто.
avatar
Nested Virtualization/KVM умеет RavelloSystems и политика цен у них интересная, не платишь ничего, если не используешь ;)
avatar
± originalnii post — binarynature.blogspot.co.il/2014/12/gns3-with-google-compute-engine.html
Bol'shenstvo ludei ne vladeut linuxom na takom urovne i hotyat vse bistro, prosto i dostupno.

Ravello horosho mojno dlya vsyakogo probivat
skoro budet zapushen pilot unlcloud.com, smojete ozenit'.
avatar
Добрый день! не совсем понятен пункт 12 и, видимо, как следствие не получается выполнить пункт 14. Локальный клиент пишет: Cannot connect to remote server gns3server:8000
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.