Привет! Сегодня расскажу, как настроить 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
Опционально: отключение 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:
Создадим ключ для авторизации, для этого заходим в Google Cloud Platform Menu -> API Manager -> Credentials. Потом нажимаем на Create Credentials -> Service account key -> JSON:
Сохраняем JSON файл локально на компьютер и добавляем локальную переменную среды:
Теперь создайте следующие скрипты:
Теперь вы можете запускать, останавливать и проверять текущее состояние виртуалки с помощью соответствующих скриптов start.py, stop.py, check.py
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.