GNS3 в облаке

a18f8e3d5aa04e80903fd81a0bb79ace.png


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

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

Подготовка VM

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


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

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


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

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


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

Нажимаем на Create instance:
7ffacc07f1454b5faff2a4d827f2a476.png

Параметры:
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. Вводим любое имя.
362a40ac574c4bf78632c267c9397167.png

Нажатие на 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
c0bb9f0a6eef49698ba23f145c28ba5c.png

Нажимаем 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
57824432d20b427ab87918d875fc6ede.png

Опционально: отключение 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:
c954efb1bdc448fda8ccb962c8bbe85f.png

Сохраняем 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:

 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
fe42fe65d4d54a2e967805b5f8648a95.png

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

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

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

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

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

15. Проверка


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

Чтобы запустить топологию, используйте кнопку 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.

© Habrahabr.ru