В данной статье описан опыт сетевого инженера по развертыванию виртуальной лаборатории.
ЕВА-НГ дома, с целью подготовки к экспертным экзаменам Cisco. Я постарался собрать все основные этапы настройки, разбросанные по статьям в Интернете, и постарался добавить их в топологию, параллельно изучая ansible — систему управления конфигурациями.
Черновик статьи появился случайно, так как мне стало жаль терять накопленный опыт и я решил сохранить его в отдельный файл.
Вот что я представляю на ваш суд. Все решения, приведенные в статье, не претендуют на оптимальность, но абсолютно работают.
Установка EVE-NG
Подготовка хоста
В качестве хоста я использую следующую систему: Intel Xeon X3240, 32 ГБ ОЗУ под управлением Gentoo. Настройка KVM на Gentoo довольно тривиальна и, честно говоря, я не помню, с какими подводными камнями мне пришлось столкнуться при его развертывании.Это было давно.
Главное, что катастрофически влияет на производительность лабораторного стенда типа EVE-NG, — это параметр ядра, позволяющий использовать вложенная виртуализация (вложенная виртуализация).
Для процессоров Intel:
Вы можете прочитать больше на связь .kvm-intel.nested=1
Подключение образов сетевых устройств
Образы сетевых устройств для подключения находятся в свободном доступе на самом cisco.com; для загрузки вам просто нужно иметь учетную запись начального уровня.Загрузите по предоставленным ссылкам и следуйте рекомендациям в как .
Проблема, с которой я столкнулся при добавлении изображений, заключалась в том, как назвать каталоги, в которых должны быть размещены файлы.
hda.qcow2 .
Решение, как всегда, — реверс-инжиниринг.
Список заголовков, обработанных EVE-NG, хранится в файле: /opt/unetlab/html/includes/init.php
Я процитирую это здесь: $node_templates = Array(
'a10' => 'A10 vThunder',
'clearpass' => 'Aruba ClearPass',
'timos' => 'Alcatel 7750 SR',
'veos' => 'Arista vEOS',
'barracuda' => 'Barraccuda NGIPS',
'brocadevadx' => 'Brocade vADX',
'cpsg' => 'CheckPoint Security Gateway VE',
'docker' => 'Docker.io',
'acs' => 'Cisco ACS',
'asa' => 'Cisco ASA',
'asav' => 'Cisco ASAv',
'cda' => 'Cisco Context Directory Agent',
'csr1000v' => 'Cisco CSR 1000V',
'csr1000vng' => 'Cisco CSR 1000V (Denali and Everest)',
'cips' => 'Cisco IPS',
'cucm' => 'Cisco CUCM',
'ise' => 'Cisco ISE',
'c1710' => 'Cisco IOS 1710 (Dynamips)',
'c3725' => 'Cisco IOS 3725 (Dynamips)',
'c7200' => 'Cisco IOS 7206VXR (Dynamips)',
'iol' => 'Cisco IOL',
'titanium' => 'Cisco NX-OSv (Titanium)',
'nxosv9k' => 'Cisco NX-OSv 9K',
'firepower' => 'Cisco FirePower',
'firepower6' => 'Cisco FirePower 6',
'ucspe' => 'Cisco UCS-PE',
'vios' => 'Cisco vIOS',
'viosl2' => 'Cisco vIOS L2',
'vnam' => 'Cisco vNAM',
'vwlc' => 'Cisco vWLC',
'vwaas' => 'Cisco vWAAS',
'phoebe' => 'Cisco Email Security Appliance (ESA)',
'coeus' => 'Cisco Web Security Appliance (WSA)',
'xrv' => 'Cisco XRv',
'xrv9k' => 'Cisco XRv 9000',
'nsvpx' => 'Citrix Netscaler',
'sonicwall' => 'Dell SonicWall',
'cumulus' => 'Cumulus VX',
'extremexos' => 'ExtremeXOS',
'bigip' => 'F5 BIG-IP LTM VE',
'fortinet' => 'Fortinet FortiGate',
//'radware' => 'Radware Alteon',
'hpvsr' => 'HP VSR1000',
'olive' => 'Juniper Olive',
'vmx' => 'Juniper vMX',
'vmxvcp' => 'Juniper vMX VCP',
'vmxvfp' => 'Juniper vMX VFP',
'vsrx' => 'Juniper vSRX',
'vsrxng' => 'Juniper vSRX NextGen',
'vqfxre' => 'Juniper vQFX RE',
'vqfxpfe' => 'Juniper vQFX PFE',
'linux' => 'Linux',
'mikrotik' => 'MikroTik RouterOS',
'ostinato' => 'Ostinato',
'paloalto' => 'Palo Alto VM-100 Firewall',
'pfsense' => 'pfSense Firewall',
'riverbed' => 'Riverbed',
'sterra' => 'S-Terra',
'vyos' => 'VyOS',
'win' => 'Windows (Legacy template)',
'winstation' => 'Windows Workstation',
'winserver' => 'Windows Server',
'vpcs' => 'Virtual PC (VPCS)'
);
То есть если нам нужно добавить образ с каким-либо Linux, как мы это сделаем ниже, то просто создаем каталог /opt/unetlab/addons/qemu/linux-whatever/ и поместите в него файл изображения hda.qcow2 .
Настройка среды
Под средой мы подразумеваем все, что делает нашу жизнь более удобной.
Доступ к консоли роутера
Несмотря на то, что в EVE-NG разработчики ввели возможность доступа к консолям сетевых устройств через сеть с помощью HTML5, доступ со сторонних клиентов более удобен и привычен.Основное удобство, которое предоставляет putty в моем случае, — это возможность использовать буфер обмена.
Копирование/вставка не работает в веб-консоли.
Итак, процесс выглядит следующим образом: Установка шпаклевки на машину, с которой будет осуществляться доступ.
Я работаю на ПК с Ubuntu, поэтому: sudo apt-get install putty
Но этого мало, нужно еще указать браузеру, в моем случае хрому, как реагировать на ссылки типа телнет:// .
Для этого вам нужно создать файл ~/.
local/share/applications/telnet.desktop следующее содержание: [Desktop Entry]
Version=1.0
Name=Telnet
GenericName=Telnet
Comment=Telnet Client
Exec=/usr/bin/putty %U
TryExec=/usr/bin/putty
Terminal=false
Type=Application
Categories=TerminalEmulator;Network;Telnet;Internet;BBS;
MimeType=x-scheme/telnet
X-KDE-Protocols=telnet
Keywords=Terminal;Emulator;Network;Internet;BBS;Telnet;Client;
Зарегистрируйте обработчик: xdg-mime default telnet.desktop x-scheme-handler/telnet
После этого консоли прекрасно откроются в шпаклевке.
Задачу по переходу на gnome-терминал с вкладками или его аналог я оставлю на потом.
Запускаем сниффер трафика
Wireshark абсолютно необходим при изучении сетевых технологий.О его использовании написано много.
Я не буду повторяться.
Опишу процесс настройки.
Установка на клиенте: sudo apt-get install wireshark
Но опять браузер не понимает как обработать ссылку захватывать:// Вам придется объяснить ему это в три этапа: Эшаг 1:
Как и в случае с консолями, файл ~/.
local/share/applications/wireshark.desktop тип: [Desktop Entry]
Name=Wireshark
Exec=capture_chrom.sh %u
MimeType=x-scheme-handler/capture;
Type=Application
Зарегистрируйте обработчик: xdg-mime default wireshark.desktop x-scheme-handler/capture
Эшаг 2:
Обработчик — это bash-скрипт на клиентской машине в любом каталоге из списка PATH: #!/bin/bash
ip=`echo $@ | sed 's/.
*\/\/\(.
*\)\/\(.
*\)/\1/g'` interface=`echo $@ | sed 's/.
*\/\/\(.
*\)\/\(.
*\)/\2/g'`
ssh root@$ip tcpdump -i $interface -U -w - | wireshark -k -i -
Эшаг 3:
Ключ доступа по SSH между клиентской машиной и EVE-NG. На клиентской машине (вместо ip_eve ставим адрес EVE-NG): ssh-keygen -t rsa
ssh root@_ip_eve_ mkdir -p .
ssh cat ~/.
ssh/id_eve_ng.pub | ssh root@ip_eve 'cat >> .
ssh/authorized_keys2'
После этого захват трафика в Wireshark на стороне клиента заработает. Это именно то, что нам нужно.
На этом скромный пользователь может остановиться, но совершенству нет предела и мы продолжаем.
Настройка экземпляра ansible сервера
Необходимость Ansible для топологий виртуальных лабораторий для меня не была очевидна в начале пути.Но со временем, во вторых десяти лабораторных часах, в голову приходит мысль: а не стоит ли автоматизировать загрузку стартовых топологий в устройства, не перегружая их, тем самым экономя время? Итак, с чего начать? С доступными ограничениями! Да, они действительно существуют. Для меня, довольно далекого от программирования, предложение на одном из форумов оказалось слишком жестоким — самому добавить обработчик телнета.
Telnet нужен был для простого решения — настроить ansible на виртуальной машине EVE-NG и подключаться по telnet к консольным портам виртуальных маршрутизаторов.
Но не тут то было - работает только ssh. Но мы старые инженеры и не привыкли отступать! Если гора не идет к Мухаммеду, то будем двигаться к ней — в самой топологии настроим отдельный инстанс с убубту, благо для этого есть возможность.
Я не буду показывать вам, как развернуть образ, загруженный с ubuntu.com, в KVM. Я сделал это на отдельной машине, настроил и загрузил в EVE-NG. После установки нам потребуются пакеты с телнет-сервером и настройкой статического IP-адреса.
Настройка телнет-сервера
Мне не удалось заставить EVE-NG показать мне консоль сервера стандартным способом, нажав на устройство.Чтобы не копать слишком глубоко, я пошел в обход и настроил телнет-сервер.
SSH v2, конечно, тоже имеется и работает с CSR, но он очень медленный для интерактивной работы, да и бесполезен — стенд у нас лабораторный, а не производственный.
Потом необходимость в сервере отпала, но запись в шпаргалке осталась, так что тоже дам.
Итак, начнем: sudo apt-get install xinetd telnetd
После автоматического запуска ксинетд Разумеется, ничего не произошло, как нам обещали в Интернете.
Нужно добавить в /etc/xinetd.d файл телнет следующее содержание: service telnet
{
disable = no
flags = REUSE
socket_type = stream
wait = no
user = root
server = /usr/sbin/in.telnetd
}
и перезапусти сервер ксинетд : sudo service xinetd restart
Проверка telnet локально: @ansible-server:~$ telnet 127.0.0.1
Trying 127.0.0.1.
Connected to 127.0.0.1.
Escape character is '^]'.
Ubuntu 16.04.2 LTS
ansible-server login:
Работает! Загружаем полученный образ в виртуальную машину EVE-NG и пытаемся собрать топологию.
Теперь мы можем, настроив адрес из подсети сервера на соседнем компьютере по топологии, дозвониться до него по телнету.
Все работает быстро, в отличие от SSH.
Коллекция топологий
Здесь все предельно просто.
Моя топология выглядит так:
Развертывание подсистемы ansible
Настройка CSR для работы с ansible
Выделим на каждом роутере отдельный порт для управления и подключим его к общему хабу с сервером ansibleports. Ги2 .Выберем подсеть для управления, у меня это 192.168.0.0/24. И на портах назначим IP-адреса в соответствии с номером роутера.
Эмы введем ту же информацию в /etc/хосты серверы: 192.168.0.1 R1
192.168.0.2 R2
192.168.0.3 R3
192.168.0.4 R4
192.168.0.5 R5
192.168.0.6 R6
192.168.0.7 R7
192.168.0.8 R8
192.168.0.9 R9
192.168.0.10 R10
192.168.0.11 XR1
192.168.0.12 XR2
192.168.0.20 SW1
На каждом роутере настроим SSH v2 согласно ссылки .
Всё тривиально, скажу лишь, что для запуска необходимого SSHv2 нам необходимо сгенерировать ключ размером более 768 бит, я выбрал размер 2048. Проверяем доступ с сервера к роутерам по SSH, попутно собирая ключи в хранилище.
Сохраняем конфигурацию на роутере: R1#wr
Building configuration.
[OK]
И экспортируем конфигурацию в EVE-NG, чтобы не перенастраивать устройства при перезагрузке:
Эта функция в EVE-NG, как и в Unetlab до нее, работает с разной степенью успеха.
Но будем надеяться.
Создание первой рабочей книги
Как мы помнить Структура Ansible состоит из двух основных частей — описания устройств (инвентаря) и рабочей книги, которая собственно и содержит логику системы.
В нашем случае инвентарь достаточно примитивен и файл его содержащий( /etc/ansible/хосты ) принимает вид: [ios]
R[1:10]
Что показывает список имен хостов от R1 до R10 (помните, что мы уже указали /etc/hosts для разрешения имен).
А вот с варбуком придется повозиться.
Первым шагом, чтобы загрузить на виртуальный маршрутизатор IOS конфигурацию, представляющую для нас лабораторный интерес, нам необходимо выполнить откат к исходному нулю, содержащему только настройки IP управления и VTY. Для этого попробуем использовать модуль ios_command. Основой всей работы по изменению конфигурации в IOS-устройствах для нас будет функционал команды привилегированного режима роутера: configure replace scp://[PATH ] force
Нулевые конфигурации мы будем хранить на сервере в домашнем каталоге нового пользователя под именем маршрутизатор в каталоге /home/router/default_configs/ .
Забегая вперед скажу, что файлы будут иметь те же имена, что и в инвентаре, т.е.
в нашем случае это R1, R2 и т.д. Давайте создадим в /opt/ансибль файл откат.yml тип: - name: rollback
hosts: ios
serial: 1
connection: local
gather_facts: false
remote_user: cisco
tasks:
- name: Performing rollback to default configuration.
ios_command:
commands: configure replace scp://router:[email protected]:~/default_configs/ {{ inventory_hostname }} force
timeout: 30
Итак, по порядку: Название игровой книги: - name: rollback
Название использованного инвентаря: hosts: ios
Количество параллельно настраиваемых устройств из инвентаря.
Важная часть последующей оптимизации производительности.
serial: 1
Я так понимаю, это указывает на подключение к локальному обработчику заданий.
Я могу ошибаться.
connection: local
Отключение сбора информации о хосте: gather_facts: false
Имя пользователя для подключения к устройствам: remote_user: cisco
Вызов модуля: ios_command:
Отправка команды на устройство из инвентаря: commands: configure replace scp://router:[email protected]:~/default_configs/ {{ inventory_hostname }} force
Таймаут ответа в секундах: timeout: 30
Ничего особенно сложного, как видим, но есть одно! Попробуем запустить.
ansible-playbook .
/rollover.yml -k -vvvv
Получаем ошибку! "msg": "ios_command does not support running config mode commands. Please use ios_config instead"
Google мало что нам расскажет об этом, поэтому вооружаемся изобретательностью и пытаемся найти, кто нам это сказал.
И находим файл используемого нами модуля: /usr/local/lib/python2.7/dist-packages/ansible-2.3.0-py2.7.egg/ansible/modules/network/ios/ios_command.py , содержащий следующий код: if module.check_mode and not item['command'].
startswith('show'): warnings.append( 'only show commands are supported when using check mode, not ' 'executing `%s`' % item['command'] ) elif item['command'].
startswith('conf'):
module.fail_json(
msg='ios_command does not support running config mode '
'commands. Please use ios_config instead'
)
Очевидно, что разработчики немного переборщили, назначив все параметры configure режиму конфигурации, поэтому добавим в соответствующую строку: elif item['command'].
startswith('configure terminal'):
Работает! root@ansible-server:/opt/ansible# ansible-playbook .
/rollback.yml -k
SSH password:
PLAY RECAP ******************************************************
R1 : ok=1 changed=0 unreachable=0 failed=0
R10 : ok=1 changed=0 unreachable=0 failed=0
R2 : ok=1 changed=0 unreachable=0 failed=0
R3 : ok=1 changed=0 unreachable=0 failed=0
R4 : ok=1 changed=0 unreachable=0 failed=0
R5 : ok=1 changed=0 unreachable=0 failed=0
R6 : ok=1 changed=0 unreachable=0 failed=0
R7 : ok=1 changed=0 unreachable=0 failed=0
R8 : ok=1 changed=0 unreachable=0 failed=0
R9 : ok=1 changed=0 unreachable=0 failed=
Создание второй книги
Я не буду описывать ее так подробно, как на предыдущем этапе, просто приведу пример рабочей тетради, заполняющей тематическую начальную конфигурацию лабораторных работ одного известного бренда с тремя буквами в названии: /etc/ansible/hosts [ios]
R[1:10]
[ios.base.ipv4]
R[1:6]
/opt/ansible/base.ipv4.yml
- name: base.ipv4
hosts: ios.base.ipv4
connection: local
gather_facts: false
remote_user: cisco
serial: 1
tasks:
- name: base.ipv4 configuration load
ios_config:
src: .
/IOS-XE-initials/base.ipv4/{{ inventory_hostname }}
Файлы начальной конфигурации находятся в папке /opt/ansible/IOS-XE-initials/base.ipv4 , соответственно.
Основное отличие этого сценария — использование функционала модуля ios_config и передачу права интерпретировать те команды, которые необходимо выполнить на устройствах.
На этом все, спасибо за внимание.
Если статья достойна продолжения, то следующей темой будет настройка взаимодействия IOS XR и ansible. Теги: #*nix #cisco #cisco #Виртуализация #eve-ng cisco ansible
-
Типы Интернет-Подключений
19 Oct, 24 -
О Переносе Проекта С Objective-C На Swift
19 Oct, 24 -
Новые Сеансы Gopro Hero 4
19 Oct, 24 -
Номер
19 Oct, 24 -
Стадо Помогает Вам Добиться Успеха
19 Oct, 24