Сегодня мы поговорим о том, как дополнить ваш домашний парк виртуальных машин cisco-роутером при помощи эмулятора GNS3.

Зачастую очень полезно иметь под рукой роутер, работающий на IOS для тестирования конфигурации или в качестве площадки для практики во время обучения.

Преимуществом перед использованием симулятора, вроде Cisco Packet Tracer, в том, что с GNS3 мы имеем роутер непосредственно в сети с нашими виртуальными машинами, и он является полноценным участником сети.

Сразу приведу ссылку на официальный сайт: www.gns3.com

Для данной статьи я использовал дистрибутив Ubuntu Server 16.04.1 LTS запущенный на VritualBox и GNS3 Version 1.5.2.
VirtualBox запущен под Windows.
Также вам понадобится ISO образ одного из cisco-роутеров. Я использовал образ роутера Cisco c3725.

Приступим!

Что мы хотим

У нас есть виртуальная машина Kali Linux и мы хотим иметь с нее доступ к cisco-роутеру по ssh. Также мы хотим получать от роутера cdp-пакеты и использовать протокол SNMP.

Установка

Установка из репозитария проходит достаточно просто и описана на официальном сайте.
Заключается она в добавлении репозитария GNS и установки из него пакетов.

sudo add-apt-repository ppa:gns3/ppa
sudo apt-get update
sudo apt-get install gns3-gui

после установки, GNS3 можно запустить командой gns3 (для запуска необходима графическая оболочка, я использовал LXDE)
В случае возникновения каких-то проблем, вы всегда найдете актуальную инструкцию на официальном сайте:

https://gns3.com/support/docs/linux-installation

Настройка виртуальных машин

Для начала настроим наши виртуальные машины Kali Linux и Ubuntu Server для работы в одной сети.
Останавливаем машины.
Я хочу, чтобы они работали в виртуальной сети, недоступной для внешнего мира.
Для этого я использую тип подключения «Внутренняя сеть», имя можно оставить стандартное.

image1

То же саме делаем и для виртуальной машины с установленным GNS3. Следите, чтобы имя сети было тем же.

image2

Я считаю, что очень экономит время, когда в нашей внутренней сети IP адреса раздаются DHCP сервером. Это очень легко сделать при помощи VirtualBox.
Открываем cmd и выполняем команду

VBoxManage dhcpserver add --netname intnet --ip 192.168.1.0 --netmask 255.255.255.0 --lowerip 192.168.1.1 --upperip 192.168.1.254 –enable

Если команда VBoxManage не распознается, значит, вы забыли прописать путь в переменной окружения PATH.

image3

Запускаем обе машины.
Проверяем, раздались ли IP адреса

image4
image5

root@kalix64:~# ping 192.168.1.1
PING 192.168.1.1 (192.168.1.1) 56(84) bytes of data.
64 bytes from 192.168.1.1: icmp_seq=1 ttl=64 time=1.07 ms
64 bytes from 192.168.1.1: icmp_seq=2 ttl=64 time=0.552 ms
64 bytes from 192.168.1.1: icmp_seq=3 ttl=64 time=0.987 ms

Как видим, машины видят друг друга.

Запускаем GNS3

Пришло время добавить наш роутер в сеть. Запускаем gns3 на хосте Ubuntu server. После запуска выбираем Local, а не GNS3 VM. На вопрос о добавлении роутера отвечаем отрицательно.
Создаем проект.

 

image6
Заходим в настройки Edit=>Preferences
Будем загружать IOS образ. Выбираем IOS routers и жмем New
image7
Выбираем New image и жмем Browse, указываем iso файл с образом и жмем Оpen.
image8
Далее нам будет предложено изменить имя роутера, имя платформы, объем RAM. Все это можно оставить без изменения.
На странице с выбором Slot стоит выбрать доступный FE (Fast-Ethernet) модуль. У меня это модуль GT96100-FE
WIC-интерфейс не указываем. Idle-PC оставляем без изменений.
Жмем Finish и выходим из настроек GNS3.

На панели слева нажимаем большую кнопку Browse Routers и видим на панели Routers добавленный нами роутер.
image9

Хватаем и перетаскиваем его на поле справа

image10

Я оставил название без изменения – R1
Справа, в секции Topology Summary мы видим, что R1 горит красным, что означает, что наш роутер выключен. Скоро мы исправим  это.

Настройка роутера в GNS3

Кликаем правой кнопкой на роутер и выбираем Start.

image11

Значок в Topology summary должен позеленеть. Наводим курсор на роутер и видим, что консольный порт у нас 5000

image12

Давайте подключимся к нему. Открываем консоль и выполняем

telnet 127.0.0.1 5000

получаем строку приглашения

image13

Давайте посмотрим, какие интерфейсы у нас доступны

R1#sh ip interface brief
Interface                  IP-Address      OK? Method Status                Protocol
FastEthernet0/0            unassigned      YES unset  administratively down down
FastEthernet0/1            unassigned      YES unset  administratively down down

У нас есть два интерфейса, оба, пока, в выключенном состоянии.

Давайте включим интерфейс FastEthernet0/1 и присвоим ему IP из нашей подсети.

R1#config t
Enter configuration commands, one per line. End with CNTL/Z.
R1(config)#interface fa0/1
R1(config-if)#ip addr
R1(config-if)#ip add 192.168.1.200 255.255.255.0
R1(config-if)#no shut
*Mar 1 00:05:23.983: %LINK-3-UPDOWN: Interface FastEthernet0/0, changed state to up
*Mar 1 00:05:24.983: %LINEPROTO-5-UPDOWN: Line protocol on Interface FastEthernet0/1, changed state to up
R1(config-if)#end
R1#
*Mar 1 00:05:53.055: %SYS-5-CONFIG_I: Configured from console by console
R1#wr
Building configuration...
[OK]
R1#copy running-config startup-config
Destination filename [startup-config]?
Building configuration…

Проверим статус интерфейса

R1#sh ip interface brief
Interface IP-Address OK? Method Status Protocol
FastEthernet0/0 unassigned YES unset administratively down down
FastEthernet0/1 192.168.1.200 YES manual up up

Хорошо, интерфейс получил IP, но давайте взглянем на нашу топологию в GNS3

image14

Выглядит так, будто наш роутер никак не связан с чем-либо.
Так оно и есть. Интерфейсу присвоен IP, но сам интерфейс ни к чему не подключен.
Давайте исправим это недоразумение.
Добавляем в нашу топологию объект Cloud

image15

Нажимаем правой кнопкой и выбираем Configure.
Нам предлагается присвоить один из интерфейсов.
Generic Ethernet NIO отличается от Linux Ethernet NIO лишь реализацией на уровне кода (использованием библиотеки pcap или нет). Я выбираю Generic Ethernet NIO и добавляю адаптер, который подключен к виртуальной сети 192.168.1.0/24. Жмем ОК и выходим из режима редактирования.

image16

В левой части главного окна выбираем Add a link

image17

Курсор примет крестообразный вид.
Левой кнопкой мыши кликаем на облаке и выбираем интерфейс, далее кликаем на роутере и выбираем сконфигурированный нами FastEthernet 0/1
Должна получиться такая картина.

image18

На техническом уровне подключение к облаку, грубо говоря, равнозначно подключению роутера в коммутатор, к которому были бы подключены и наши виртуальные машины.
Давайте попробуем пропинговать наш роутер с Kali.

Не работает. Давайте разбираться, что происходит с нашими пакетами.
Для наглядности я запустил wireshark, чтобы посмотреть, что происходит при выполнении команды ping.
Как видим на скриншоте ниже, выполняется широковещательный ARP-запрос и ищется владелец IP-адреса 192.168.1.200.

image19

Сетевой интерфейс виртуальной машины Ubuntu server, получив такой пакет отвечает на его MAC-адресом cisco-роутера
MAC-адрес правильный, его мы можем проверить в конфигурации роутера R1.

image20

Так же сервер Ubuntu отвечает и на свой ARP запрос по IP 192.168.1.1

image21

Получается что-то вроде виртуальных интерфейсов в Linux-системах.
Если запустить wireshark на Ubuntu server, мы не увидим никаких пакетов, кроме широковещательных ARP-запросов и CDP-пакетов.

image22

ICMP пакеты почему-то не проходят.
Давайте разбираться. По сути, наш роутер «прячется» за интерфейсом с MAC-адресом 08:00:27:b6:79:62, хоть и имеет MAC-адрес c2:01:0f:fa:00:01.
В обычном режиме работы сетевой интерфейс принимает все пакеты, предназначающиеся своему MAC-адресу и широковещательные пакеты с адресом назначения ff:ff:ff:ff:ff:ff (которыми являются ARP-запросы).
Получается, наш интерфейс должен принимать пакеты, как со своим MAC-адресом, так и с MAC-адресом роутера.
Похоже, что пакет, с MAC-адресом роутера отбрасывается, т.к. не предназначается непосредственно интерфейсу виртуальной машины. Нужно заставить ОС принять этот пакет, чтобы позволить ему обработаться нашим роутером на сетевом уровне (пакет отбрасывается уже на канальном уровне).
Для этого нужно, чтобы наш интерфейс работал в так называемом «неразборчивом режиме» (обрабатывал все пакеты, даже если они не предназначены MAC-адресу сетевого интерфеса хоста.)
Для этого в настройках виртуальной машины Ubuntu Server ставим соответствующую настройку

image23

Перезапускаем виртуальную машину.
Пробуем пропинговать снова.
Работает! Wireshark так же указывает нам, что приходят ICMP-ответы

image24

Настройка доступа по SSH

Мы настроим доступ по SSH и активируем SNMP, чтобы убедиться в том, что наш роутер не только виден в сети, но и ведет себя как настоящий.

Теперь наш роутер доступен для сети 192.168.1.0/24
Просканировав порты nmap, мы видим, что открыт доступ по telnet

root@kalix64:~# nmap -n -sS -T5 192.168.1.200
Starting Nmap 7.25BETA2 ( https://nmap.org ) at 2016-09-14 11:35 EDT
Nmap scan report for 192.168.1.200
Host is up (0.13s latency).
Not shown: 999 closed ports
PORT   STATE SERVICE
23/tcp open  telnet
MAC Address: C2:01:0F:FA:00:01 (Unknown)

Это не очень безопасно, так что лучше заменить telnet на SSH.
Подключаемся к роутеру с Ubuntu Server и настраиваем.

R1#conf t
Enter configuration commands, one per line.  End with CNTL/Z.
R1(config)#ip domain name cisco.vbox
R1(config)#crypto key generate rsa
The name for the keys will be: R1.cisco.vbox
Choose the size of the key modulus in the range of 360 to 2048 for your
General Purpose Keys. Choosing a key modulus greater than 512 may take
a few minutes.
How many bits in the modulus [512]: 2048
% Generating 2048 bit RSA keys, keys will be non-exportable...[OK]
*Mar  1 00:05:53.339: %SSH-5-ENABLED: SSH 1.9 has been enabled
R1(config)#service password-encryption
R1(config)#username user privilege 15 password Pa$$w0rd
R1(config)#aaa new-model
R1(config)#line vty 0 4
R1(config-line)#transport input ssh
R1(config-line)#logging synchronous
R1(config-line)#exec-timeout 60 0
R1(config-line)#privilege level 15
R1(config-line)#exit
R1(config)#ip ssh version 2
R1#wr
R1#copy running-config sta
R1#copy running-config startup-config
Destination filename [startup-config]?
Building configuration...
[OK]

Снова сканируем nmap

root@kalix64:~# nmap -n -sS -T5 192.168.1.200
Starting Nmap 7.25BETA2 ( https://nmap.org ) at 2016-09-14 11:40 EDT
Nmap scan report for 192.168.1.200
Host is up (0.13s latency).
Not shown: 999 closed ports
PORT   STATE SERVICE
22/tcp open  ssh
MAC Address: C2:01:0F:FA:00:01 (Unknown)

Попробуем подключиться

root@kalix64:~# ssh -oKexAlgorithms=+diffie-hellman-group1-sha1 user@192.168.1.200
Password:
R1>

К сожалению, как я понял, мой роутер поддерживает устаревший алгоритм diffie-hellman-group1-sha1, так что, метод, описанный здесь не претендует на использование в боевых условиях , а лишь показывает пример настройки.

Подробнее можно прочитать тут:

http://www.openssh.com/legacy.html

Активация SNMP

CDP-пакеты вы уже могли видеть на скриншотах wireshark, так что осталось лишь настроить SNMP.
Логинимся на роутер по SSH.

R1>sh snmp
%SNMP agent not enabled

Как видим, SNMP не настроен.
Настраиваем.

R1#conf t
Enter configuration commands, one per line. End with CNTL/Z.
R1(config)#snmp-server community public RO
R1(config)#snmp-server community private RW
R1(config)#exit
R1#wr
R1# copy running-config startup-config
R1>sh snmp
R1#sh snmp
Chassis: FTX0945W0MY
0 SNMP packets input
0 Bad SNMP version errors
0 Unknown community name
0 Illegal operation for community name supplied
0 Encoding errors
0 Number of requested variables
0 Number of altered variables
0 Get-request PDUs
0 Get-next PDUs
0 Set-request PDUs
0 Input queue packet drops (Maximum queue size 1000)
0 SNMP packets output
0 Too big errors (Maximum packet size 1500)
0 No such name errors
0 Bad values errors
0 General errors
0 Response PDUs
0 Trap PDUs
SNMP Trap Queue: 0 dropped due to resource failure.
SNMP logging: disabled

Проверяем открыт ли теперь 161 порт

root@kalix64:~# nmap -n -sU -p 161 192.168.1.200
Starting Nmap 7.25BETA2 ( https://nmap.org ) at 2016-09-15 05:36 EDT
Nmap scan report for 192.168.1.200
Host is up (0.0083s latency).
PORT STATE SERVICE
161/udp open snmp
MAC Address: C2:01:0F:FA:00:01 (Unknown)
Nmap done: 1 IP address (1 host up) scanned in 0.10 seconds

Порт доступен и мы можем работать с роутером по протоколу SNMP.

Заключение

При помощи GNS3 можно создавать гораздо более сложные топологии, подключать ваши виртуальные роутеры к реальным сетям и Интернет. Применений можно найти массу. GNS3 доступна не только для Linux, но и для Windows и MAC.

Спасибо за внимание и до новых встреч!