GNS3 в облаке
Привет!
Сегодня я вам расскажу, как настроить 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:
Нажимаем на 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
sudo passwd gns3
# вводим пароль для пользователя gns3
# заходим под рутом
sudo su
visudo
Меняем строку
gns3 ALL=NOPASSWD: ALL
на
gns3 ALL=(ALL) ALL
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"
Теперь создайте следующие скрипты:
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']
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
from tools import compute, start_instance
def main():
print(start_instance(compute))
if __name__ == '__main__':
main()
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
from tools import compute, stop_instance
def main():
print(stop_instance(compute))
if __name__ == '__main__':
main()
#!/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
Потом на окне выбора проекта опять кликаем 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.