Сегодня мы поговорим о том, как дополнить ваш домашний парк виртуальных машин 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 для работы в одной сети.
Останавливаем машины.
Я хочу, чтобы они работали в виртуальной сети, недоступной для внешнего мира.
Для этого я использую тип подключения «Внутренняя сеть», имя можно оставить стандартное.
То же саме делаем и для виртуальной машины с установленным GNS3. Следите, чтобы имя сети было тем же.
Я считаю, что очень экономит время, когда в нашей внутренней сети 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.
Запускаем обе машины.
Проверяем, раздались ли IP адреса
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. На вопрос о добавлении роутера отвечаем отрицательно.
Создаем проект.
Заходим в настройки Edit=>Preferences
Будем загружать IOS образ. Выбираем IOS routers и жмем New
Выбираем New image и жмем Browse, указываем iso файл с образом и жмем Оpen.
Далее нам будет предложено изменить имя роутера, имя платформы, объем RAM. Все это можно оставить без изменения.
На странице с выбором Slot стоит выбрать доступный FE (Fast-Ethernet) модуль. У меня это модуль GT96100-FE
WIC-интерфейс не указываем. Idle-PC оставляем без изменений.
Жмем Finish и выходим из настроек GNS3.
На панели слева нажимаем большую кнопку Browse Routers и видим на панели Routers добавленный нами роутер.
Хватаем и перетаскиваем его на поле справа
Я оставил название без изменения – R1
Справа, в секции Topology Summary мы видим, что R1 горит красным, что означает, что наш роутер выключен. Скоро мы исправим это.
Настройка роутера в GNS3
Кликаем правой кнопкой на роутер и выбираем Start.
Значок в Topology summary должен позеленеть. Наводим курсор на роутер и видим, что консольный порт у нас 5000
Давайте подключимся к нему. Открываем консоль и выполняем
telnet 127.0.0.1 5000
получаем строку приглашения
Давайте посмотрим, какие интерфейсы у нас доступны
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
Выглядит так, будто наш роутер никак не связан с чем-либо.
Так оно и есть. Интерфейсу присвоен IP, но сам интерфейс ни к чему не подключен.
Давайте исправим это недоразумение.
Добавляем в нашу топологию объект Cloud
Нажимаем правой кнопкой и выбираем Configure.
Нам предлагается присвоить один из интерфейсов.
Generic Ethernet NIO отличается от Linux Ethernet NIO лишь реализацией на уровне кода (использованием библиотеки pcap или нет). Я выбираю Generic Ethernet NIO и добавляю адаптер, который подключен к виртуальной сети 192.168.1.0/24. Жмем ОК и выходим из режима редактирования.
В левой части главного окна выбираем Add a link
Курсор примет крестообразный вид.
Левой кнопкой мыши кликаем на облаке и выбираем интерфейс, далее кликаем на роутере и выбираем сконфигурированный нами FastEthernet 0/1
Должна получиться такая картина.
На техническом уровне подключение к облаку, грубо говоря, равнозначно подключению роутера в коммутатор, к которому были бы подключены и наши виртуальные машины.
Давайте попробуем пропинговать наш роутер с Kali.
Не работает. Давайте разбираться, что происходит с нашими пакетами.
Для наглядности я запустил wireshark, чтобы посмотреть, что происходит при выполнении команды ping.
Как видим на скриншоте ниже, выполняется широковещательный ARP-запрос и ищется владелец IP-адреса 192.168.1.200.
Сетевой интерфейс виртуальной машины Ubuntu server, получив такой пакет отвечает на его MAC-адресом cisco-роутера
MAC-адрес правильный, его мы можем проверить в конфигурации роутера R1.
Так же сервер Ubuntu отвечает и на свой ARP запрос по IP 192.168.1.1
Получается что-то вроде виртуальных интерфейсов в Linux-системах.
Если запустить wireshark на Ubuntu server, мы не увидим никаких пакетов, кроме широковещательных ARP-запросов и CDP-пакетов.
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 ставим соответствующую настройку
Перезапускаем виртуальную машину.
Пробуем пропинговать снова.
Работает! Wireshark так же указывает нам, что приходят ICMP-ответы
Настройка доступа по 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.
Спасибо за внимание и до новых встреч!