Привет! Сегодня расскажу, как настроить 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 (рут без пароля)
На GCE по умолчанию включается password-less sudo, что лично меня беспокоит. Для того, чтобы это отключить, необходимо выполнить следующие команды:
sudo passwd gns3
# вводим пароль для пользователя gns3
# заходим под рутом
sudo su
visudo

Меняем строку
gns3 ALL=NOPASSWD: ALL
на
gns3 ALL=(ALL) ALL

Опционально: управление виртуалкой локально с помощью Python
Нам потребуется локально установленный Python 3 и библиотека Google API client, которую можно установить с помощью pip:
sudo pip3 install --upgrade google-api-python-client

Создадим ключ для авторизации, для этого заходим в Google Cloud Platform Menu -> API Manager -> Credentials. Потом нажимаем на Create Credentials -> Service account key -> JSON:



Сохраняем JSON файл локально на компьютер и добавляем локальную переменную среды:

GOOGLE_APPLICATION_CREDENTIALS="путь-к-json"

Теперь создайте следующие скрипты:
tools.py
from oauth2client.client import GoogleCredentials
from googleapiclient.discovery import build

# измените следующие переменные, если необходимо
# имя проекта будет в формате gns3-####
PROJECT = 'gns3-0000'
ZONE = 'europe-west1-d'
INSTANCE = 'gns3server'

credentials = GoogleCredentials.get_application_default()
compute = build('compute', 'v1', credentials=credentials)



def start_instance(compute):
    return compute.instances().start(
        project=PROJECT,
        zone=ZONE,
        instance=INSTANCE).execute()

def stop_instance(compute):
    return compute.instances().stop(
        project=PROJECT,
        zone=ZONE,
        instance=INSTANCE).execute()

def check_status(compute):
    return compute.instances().get(
        project=PROJECT,
        zone=ZONE,
        instance=INSTANCE).execute()['status']

start.py
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

from tools import compute, start_instance

def main():
    print(start_instance(compute))

if __name__ == '__main__':
    main()

stop.py
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

from tools import compute, stop_instance

def main():
    print(stop_instance(compute))

if __name__ == '__main__':
    main()

check.py
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

from tools import compute, check_status

def main():
    print(check_status(compute))

if __name__ == '__main__':
    main()

Теперь вы можете запускать, останавливать и проверять текущее состояние виртуалки с помощью соответствующих скриптов start.py, stop.py, check.py


Установка 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.

Комментарии (9)


  1. ifaustrue
    14.03.2016 21:40

    Дмитрий, помнится мне GNS довольно прожорлив, если не секрет, при небольшой имитации (несколько свичей, пара маршей и т.д) сколько в месяц будет «кушать» такая виртуалка?

    *доллар нынче уже не тот.


    1. Sourg
      14.03.2016 21:57

      Если включать виртуалку лишь по необходимости, то получается немного. Мне приходили счета по 5-8$/месяц.
      В вашем случае можно ограничиться n1-standard-1, которая будет стоить в два раза дешевле — $0.055/час + еще немного заплатите на хранение данных (~0.60$/месяц за 15гб)


  1. cooper051
    15.03.2016 11:54

    Почему просто не перейти на UNetLab, раз уж вы хотите использовать облачные решения?


    1. Sourg
      15.03.2016 12:27

      1. Почему мне необходимо переходить на UNL, если меня полностью устраивает GNS3?
      2. Как вы импортируете OVA в GCE? В AWS насколько я знаю можно, но я не пробовал.
        Даже если бы можно это было сделать, в чём смысл, если KVM hardware acceleration всё равно нельзя включить?


      1. cooper051
        15.03.2016 12:30

        Если вас устраивает GNS3, значит вы еще не пробовали UNL (особенно новую версию)


        1. Sourg
          15.03.2016 12:33

          Я бы продолжил дискуссию, если бы был конструктив, которого, к сожалению, нет.


          1. cooper051
            15.03.2016 12:34

            Взаимно) Все это уже тысячу раз обсуждалось