Научная статья на тему 'Разработка алгоритма администрирования компьютерных сетей с помощью языка Python'

Разработка алгоритма администрирования компьютерных сетей с помощью языка Python Текст научной статьи по специальности «Компьютерные и информационные науки»

CC BY
517
89
i Надоели баннеры? Вы всегда можете отключить рекламу.
Ключевые слова
ЯЗЫК ПРОГРАММИРОВАНИЯ PYTHON / АВТОМАТИЗАЦИЯ / IP-АДРЕС / НАСТРОЙКА / МАРШРУТИЗАТОРОВ / СЕТЬ / АДМИНИСТРИРОВАНИЕ

Аннотация научной статьи по компьютерным и информационным наукам, автор научной работы — Джонмахмадов И.Т., Амзаев О.О., Комили А.А.

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

i Надоели баннеры? Вы всегда можете отключить рекламу.
iНе можете найти то, что вам нужно? Попробуйте сервис подбора литературы.
i Надоели баннеры? Вы всегда можете отключить рекламу.

Текст научной работы на тему «Разработка алгоритма администрирования компьютерных сетей с помощью языка Python»

УДК 004.042

И. Т. Джонмахмадов

магистрант МПГУ, г. Москва, РФ E-mail: jonm96@mail.ru О.О. Амзаев магистрант МПГУ, г. Москва, РФ E-mail: odilamzaev@gmail.com А.А. Комили магистрант МПГУ, г. Москва, РФ E-mail: Avrangzeb37@yandex.ru

РАЗРАБОТКА АЛГОРИТМА АДМИНИСТРИРОВАНИЯ КОМПЬЮТЕРНЫХ СЕТЕЙ

С ПОМОЩЬЮ ЯЗЫКА PYTHON

Аннотация

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

Ключевые слова:

язык программирования Python, автоматизация, IP-адрес, настройка, маршрутизаторов,

сеть, администрирование.

В настоящего время автоматизации обслуживания и настройки компьютерных сетей приобретает особое актуальность. Это прежде всего связано с тем что, логические схемы организации компьютерных сетей становятся всё более сложными и включают в себя больше элементов. Например, если раньше для сети хватало несколько маршрутизаторов, то сейчас схема сети включает в себя еще и многоуровневые управляемые свитчи, контроллеры , концентраторы и т.д. Так же возникает ситуация, когда реализуется одна и та же схема сети на нескольких объектах, и тогда необходимость автоматизации возрастает в разы.

Автоматизация дает возможность мыслить более предметно, когда вы свободны от рутинной работы, к тому же применяя действующий шаблон снижается риск ошибок. Существует много способов автоматизации и один из них - программирование сетевого оборудования на Python.Python - как язык программирования достаточно прост для изучения, а так же распространен, особенно в контексте работы с сетевым оборудованием. Поэтому немаловажно иметь хотя бы общее представление о данном языке.

Автоматизация системы обработки информации на уровни сетевых устройств посредством программирования играет доминирующий роль в реализации информационных процессов протекающие в различных системах. Часто встречается ситуация, когда что-то в сети должно быть настроено определенным образом, но, по различным причинам, или по ошибке настроено по-другому. К тому же , бывает, что сеть уже кем-то настроена и подготовлены все шаблоны, но конфигурацию сервисов и компонентов конкретной сети нужно периодически валидировать на предмет соответствия установленным шаблонам и требуемым наборам параметров, а для этого необходимо иметь навыки программирования. И в этом случае можно использовать средства языка программирования Python по ряду причин. Во первых, в некоторых сетевых оборудовании Python встроен (Cisco, Juniper, Huawei) или есть API, которые

поддерживают Python, а во вторых этот язык может использоваться не только для создания скриптов, но и для разработки приложений.

Язык программирования Python высокоуровневый язык программирования общего назначения, ориентированный на повышение производительности разработчика и читаемости кода. Синтаксис языка Python минималистичен. В то же время стандартная библиотека включает большой объём полезных функций. Язык Python поддерживает структурное, объектно-ориентированное, функциональное, императивное и аспектно-ориентированное программирование. Основные архитектурные черты — динамическая типизация, автоматическое управление памятью, полная интроспекция, механизм обработки исключений, поддержка многопоточных вычислений, высокоуровневые структуры данных. Поддерживается разбиение программ на модули, которые, в свою очередь, могут объединяться в пакеты.

Эталонной реализацией Python является интерпретатор CPython, поддерживающий большинство активно используемых платформ. Он распространяется под свободной лицензией Python Software Foundation License, позволяющей использовать его без ограничений в любых приложениях, включая проприетарные.

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

Для достижение поставленной цели, нами необходимо действовать по следующим алгоритмом.

Первое, установить Python и PyCharm CE (PyCharm CE — это бесплатная среда разработки с отладчиком.)

Второй шаг — устанавливать необходимую библиотеку netmiko . Она нужна для взаимодействия с устройствами по SSH или telnet. Библиотеку устанавливаем из командной строки: pip install netmiko.

Третьим шагом будет подготовка исходных данных и скрипта под наши задачи.

В качестве входных данных будем использовать текстовый файл «ipkonfig.txt». В каждой строчке файла должен быть IP-адрес устройства, к которому мы подключаемся. Через запятую можно указать логин и пароль для конкретного устройства. Если этого не сделать, то будут использоваться те, которые вы введёте при запуске скрипта. Пробелы будут проигнорированы. Если первый символ в строке «#», то она считается комментарием.

ipkonfig.txt — Блок нот

Файл Правка Форм ат Вид Справка

# ±р_addness, [и sernaine], [password]

10.1.1.256,

10.10.100.227, с isco , cisco

10.10.31.170

127.0.0.1 admin. pass

1.1.1.1,, 2.2.2.2|

Сам скрипт логически состоит из двух частей: основной программы и функции «doRouter()». Внутри неё выполняется подключение к маршрутизатору, отправка команд в СЦ получение и анализ ответов.

Входными данными для функции являются: 1Р-адрес маршрутизатора, логин и пароль. При возникновении проблем функция вернёт 1Р-адрес маршрутизатора, мы его запишем в отдельный файл «fail.txt».

Сначала читаем файл с 1Р-адресами. Конструкция try_except позволит корректно обработать ошибку чтения файла. На выходе получим массив данных для подключения connection_data, содержащий 1Р-адрес, логин и пароль.

try:

f = open('ip.txt')

connection_data=[]

filelines = f.read().splitlines()

for line in filelines:

if line == "": continue

if line[0] == "#": continue

conn_data = line.split(',')

ipaddr=conn_data[0] .strip()

username=global_username

password=global_password

if len(conn_data) > 1 and conn_data[1].strip() != "": username = conn_data[1].strip()

if len(conn_data) > 2 and conn_data[2].strip() != "": password = conn_data[2].strip()

connection_data.append((ipaddr, username, password))

f.close()

except:

sys.exit("Couldn't open or read file ip.txt")

Далее создаём список процессов и запускаем их. Количество созданных процессов будет равно количеству IP-адресов. Но выполняться одновременно будут не более 10.

В список «routers_with_issues» записываем то, что вернут функции «doRouter». В нашем случае это IP-адреса маршрутизаторов, с которыми были проблемы. multiprocessing.set_start_method("spawn") with multiprocessing.Pool(maxtasksperchild=10) as process_pool:

routers_with_issues = process_pool.map(doRouter, connection_data, 1)

process_pool.close()

process_pool .j oin()

Команда «process_pool.join()» нужна для того, чтобы скрипт дождался завершения выполнения всех экземпляров функций «doRouter» и только потом продолжил выполнять основную программу.

В конце создаем/переписываем текстовый файл, в котором у нас будут IP-адреса ненастроенных маршрутизаторов. Также выводим этот список на экран. failed_file = open('fail.txt', 'w') for item in routers_with_issues: if item != None: failed_file.write("%s\n" % item) print(item)

Теперь разберем процедуру «doRouter» .Первое, что нужно сделать, — обработать входные данные. С помощью ReGex проверяем, что функции был передан корректный IP-адрес.

ip_check = re .findall("A(([0-9] | [1-9] [0-9] 11[0-9] {2}|2[0-4] [0-9] |25[0-5])\.){3}([0-9] | [1-9] [0-9] 11[0-9]{2}|2[0-4][0-9]|25[0-5])$", ip_address) if ip_check == []:

print(bcolors.FAIL + "Invalid IP - " + str(ip_address) + bcolors.ENDC) return ip_address

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

device = {

'device_type': 'cisco_ios', 'ip': ip_address.strip(), 'username': username, 'password': password, 'port': 22, } try:

config_ok = True

net_connect = ConnectHandler(**device)

Отправляем команды и анализируем полученный ответ от маршрутизатора. Он будет помещён в переменную «cli_response». В этом примере мы проверяем текущие настройки. Результат выводим на экран. Данную часть нужно менять под разные задачи. В этом скрипте проверяем текущую конфигурацию маршрутизатора. Если она корректная, то вносим изменения. Если при проверке обнаружены проблемы, то присваиваем переменной «config_ok» значение «False» и не применяем изменения.

cli_response = net_connect.send_command("sh dmvpn | i Interface") cli_response = cli_response.replace("Interface: ", "") cli_response = cli_response.replace(", IPv4 NHRP Details", "").strip() if cli_response != "Tunnell":

print(str(ip_address)+" - " + bcolors.WARNING + "WARNING - DMVPN not on Tunnell. " + cli_response+ " " + bcolors.ENDC) config_ok=False

Чтобы решить задачу по добавлению статического маршрута, для начала нужно определить IP-адрес «next-hop». В данном случае самый простой способ — посмотреть адрес «next-hop» у существующих статических маршрутов.

cli_response2=net_connect.send_command("sh run | i ip route 8. 8.8.8 255.255.255.255")

if cli_response2.strip() == "":

print(str(ip_address)+" — " + bcolors.FAIL + "WARNING — couldn't find static route to 8.8.8.8" +

bcolors.ENDC)

config_ok=False

ip_next_hop = ""

if cli_response2 != "":

ip_next_hop = cli_response2.split(" ")[4]

if ip_next_hop == "":

print(str(ip_address)+" — " + bcolors.FAIL + "WARNING — couldn't find next-hop IP address " +

bcolors.ENDC)

config_ok=False

Можно отправлять одну или несколько конфигурационных команд одновременно (См. ниже). config_commands = ['ip route 1.1.1.1 255.255.255.255 '+ip_next_hop,

'ip route 2.2.2.2 255.255.255.255 '+ip_next_hop] net_connect.send_config_set(config_commands)

После подготовки скрипта выполнить его можно из командной строки или из PyCharm CE. Из командной строки запускаем командой: Python script.py. Из PyCharm CE: Там создаём новый проект, файл Python (File ^ New...) и вставляем в него наш скрипт, потом в папку со скриптом кладем файл «ip.txt» и запускаем скрипт (Run^-Run).

Получаем следующий результат:

bash ~/PycharmProjects/p4ne $ python3 script.py

Enter Username: cisco

Password:

Invalid IP - 10.1.1.256

127.0.0.1 - Cannot connect to this device.

1.1.1.1 - Cannot connect to this device. 10.10.100.227 - Static routes added 10.10.100.227 - Config saved 10.10.100.227 - Router configured sucessfully 10.10.31.170 - WARNING - couldn't find static route to 8.8.8.8 10.10.31.170 - WARNING - couldn't find next-hop IP address 10.10.31.170 - Routes weren't added because config is incorrect

2.2.2.2 - Cannot connect to this device.

#These routers weren't configured# 10.1.1.256 127.0.0.1 217.112.31.170 1.1.1.1 2.2.2.2

#This script has now completed#

Таким образом, разработанный алгоритм показал, что с помощью языка программирования Python можно создать шаблон для настройки большого количества сетевых маршрутизаторов, учитывая исходные и конечные необходимые параметры. При этом затратив минимум усилий и средств.

Список использованной литературы :

1. https://github.com/ktbyers/netmiko - страница библиотеки netmiko на GitHub, где так же имеются документация и примеры.

2. https://pynet.twb-tech.com/blog/automation/netmiko.html - пример с netmiko.

3. https://docs.Python .org/3/library/multiprocessing.html - описание и примеры библиотеки multiprocessing.

4. Хахаев И.А. Практикум по алгоритмизации и программированию на Python. - М.: Альт Линукс, 2010. -126 с. (Библиотека ALT Linux).

5. Практическая передача данных: Модемы, сети и протоколы / Ф. Дженнингс; пер. с англ. - М.: Мир, 1989.

iНе можете найти то, что вам нужно? Попробуйте сервис подбора литературы.

6. Персональные компьютеры в сетях TCP/IP. Крейг Хант; пер. с англ. - BHV-Киев, 1997.

© Джонмахмадов И.Т., Амзаев О.О., Комили А.А., 2019

i Надоели баннеры? Вы всегда можете отключить рекламу.