Всем привет! В первой части своего повествования я рассказал об опыте создания при помощи ChatGPT чат-бота, который теперь является моим верным и надежным ассистентом в быту и работе.
В этой статье я подробнее объясню и наглядно продемонстрирую каждую из его текущих возможностей, а также поделюсь дальнейшими планами по совершенствованию сетевого мультитула.
Немного общей информации о чат-боте NetCalc
STEP LOGIC NetCalc – это telegram-бот с функцией продвинутого калькулятора IP-сетей и набором полезных сетевых инструментов. Он умеет выполнять любые вычислительные операции с IP-адресами и/или сетями, включает в себя множество инструментов для проведения сетевой диагностики, а также позволяет генерировать готовые конфигурации для настройки различного сетевого оборудования.
UPD: В какой-то момент я решил сделать из названия аббревиатуру и попросил ChatGPT придумать расшифровку, отражающую суть бота. И так, встречайте N.E.T.C.A.L.C - Network Engineer Toolkit to Calculate Addresses and Load Configurations.
Меню чат-бота и основные кнопки
Меню позволяет запустить бота, вывести главное меню NetCalc, 1 из 3 его наборов различных инструментов, отменить текущую задачу.
Те же задачи выполняет и клавиатура главного меню, доступная при вводе команды /start.
Теперь подробнее о кнопках главного меню.
Всего telegram-бот содержит 3 основных категории инструментов:
Рассмотрим более детально каждую из них.
Сетевой IP-калькулятор
Сетевой IP-калькулятор состоит из 7 функций.
Инфо об IP и его сети (+RNG) повторяет функционал онлайн и мобильных IP-калькуляторов. Чат-бот запрашивает ввод IP-адреса с маской и в ответ выдает полную информацию о его сети и адресах в ней.
Бот предлагает на выбор 3 кнопки с вводом частных сетей и 1 кнопку с рандомизируемым значением (для проверки работы бота or just for fun).
Ответ выглядит так:
2. Дробление сетей на подсети запрашивает ввод исходной сети с маской, в ответ выдает список масок, на сети с которыми можно разбить исходную сеть, а также указывает количество каждой такой подсети, что умещается в исходную.
Бот предлагает на выбор 3 кнопки с вводом частных сетей и 1 кнопку с полной сетью, включающей в себя все адреса 0.0.0.0/0
Если выбрать сеть 0.0.0.0/0, то в ответ появится клавиатура с 32 кнопками (по количеству подсетей с различными масками в ней).
В целях сохранения быстродействия и исключения флуда огромным количеством текста от бота, я ограничил вывод подсетей 4096 строчками.
В оффлайн-версии калькулятора для командной строки я не вводил это ограничение, так как данный инструмент доступен только локально и заём его ресурсов выводом миллиарда строк не повлияет на других пользователей, чего не скажешь об общедоступной версии telegram-бота.
Визуально недоступные позиции я отделил от доступных с помощью эмодзи ❌. Оставил же я их для возможности узнать количество таких подсетей без их вывода.
Ответ выглядит так:
3. Исключение подсетей из 1 заданной сначала запрашивает ввод исходной сети с маской.
Бот предлагает на выбор ввести своё значение или нажать 1 кнопку с полной сетью, включающей в себя все адреса 0.0.0.0/0.
Далее бот предлагает выбрать с помощью кнопок количество исключаемых подсетей от 1 до 10 или ввести свое количество.
На следующем этапе бот для всего заданного количества подсетей поочередно запрашивает ввести их IP-адрес с префиксом сети.
Ответ выглядит так:
4. Суммаризация подсетей в 1 (+RNG) сначала запрашивает количество суммируемых подсетей.
Бот предлагает на выбор кнопки от 1 до 10 или ввести своё количество.
Далее запрашивает ввести подсеть или предлагает в качестве примера кнопку со случайным адресом сети для всего заданного количества подсетей и находит их суперсет (общую сеть, включающую в себе все выбранные подсети).
Ответ выглядит так:
Примечание: очевидно, что если заданные подсети будут находиться слишком далеко друг от друга, например 1.1.1.0/24 и 254.254.0.0/16, то ближайшей общей подсетью для них будет 0.0.0.0/0. Вычисление подобного суперсета вряд ли имеет полезное применение, поэтому следует искать суперсет более менее близких друг с другом подсетей.
5. Тиражирование подсетей от начальной сначала запрашивает стартовый IP-адрес. От него будут высчитываться и выводиться списком все следующие подсети с выбранными параметрами.
Бот предлагает на выбор кнопки с частными подсетями в качестве примера или ввести свое значение.
Далее запрашивает количество хостов, которое должно быть в желаемой сети, с кнопками-примерами или вводом собственного.
Потом бот предлагает ввести количество таких подсетей, которые он после выведет списком на экран.
Ответ выглядит так:
6. Объединение смежных сетей в списке тоже выполняет функцию “сложения”. Но в отличие от прошлой, которая находила суперсет для всех указанных подсетей, эта функция принимает на вход список подсетей и “складывает” только те сети, которые стыкуются друг с другом или пересекаются, то есть позволяют объединить их без “захвата” новых IP-адресов, как это происходило при составлении суперсета.
В ответ мы получим укороченный список из подсетей, которые дальше уже невозможно объединить.
Можно подавать на вход как список целиком в 1 сообщении, так и несколькими, а по завершении прислать в ответ символ ❗️, после чего будет выдан ответ. Также для удобства я добавил на кнопку с примером подсетей алгоритм, увеличивающий 3-ий октет на 1 с каждым сообщением, чтобы можно было быстро проверить работу функции.
7. Скачать оффлайн-калькулятор. Впоследствии я добавил возможность скачивания ранней оффлайн-версии сетевого калькулятора в telegram-бота. Так как бот присылает исполняемый файл не ссылкой, а сообщением, я ограничил функцию 3-мя скачиваниями в день для пресечения злоупотребления функцией и, как следствие, увеличением трафика и уменьшением ширины канала моего сервера. На выбор доступны заранее скомпилированные пакеты для популярных ОС и архитектур – исполняемый EXE-файл для Windows x86 и бинарные файлы arm64 и amd64 для Linux.
Сетевой мульти-инструмент
Меню сетевого мульти-инструмента состоит из 11 функций.
1. Узнать страну и ASN по IP (+RNG) в ответ на присланный IP-адрес присылает информацию о стране, ASN и название организации, к который принадлежит IP.
2. Whois (доменная регистрация) в ответ на присланное доменное имя присылает информацию о регистраторе, дате начала и конца регистрации домена, используемых резолверах имен, названии организации регистратора и его стране.
3. NSLookup (резолв DNS) сначала предлагает выбрать DNS-сервер, с помощью которого будет производиться разрешение интересующего доменного имени.
Затем бот запрашивает список доменных имен и в ответ присылает IP-адреса, в которые выбранный DNS-сервер разрешает эти имена.
4. Узнать свой IP-адрес выводит список в виде кнопок с популярными сервисами определения IP. При нажатии на кнопки во встроенном в Telegram браузере открывается информация с IP-адресом пользователя. Данную функцию пришлось реализовать с помощью явного перехода пользователем по ссылке, потому что API Telegram, как выяснилось, не позволяет узнать и вывести IP взаимодействующего с ним пользователя.
5. Проверка открытых TCP-портов сначала запрашивает IP-адрес или доменное имя, чьи порты необходимо проверить.
Далее функция выводит клавиатуру с наиболее часто встречающимися портами или предлагает ввести свой. В ответ на сообщение с портом бот присылает результат проверки (открыт или закрыт) и тут же запрашивает ввод нового порта.
6. Поиск доменов приложения присылает список всех принадлежащих приложению доменов. Реализована функция с помощью веб-скрапинга (вызов nodejs + puppeteer из командной строки без GUI для эмуляции открытия страницы в браузере) сервиса https://www.netify.ai/ (Так как API платный, а веб-версия бесплатна – было решено брать значения из html. Но через обычный запрос с помощью curl я получал страницу, в которой вместо доменов отображались заглушки от динамически подгружаемых значений, которые подтягиваются через JS при открытии страницы в браузере). Разобраться в матчасти и придумать как реализовать алгоритм – как всегда помог ChatGPT.
7. Поиск поддоменов сайта присылает все найденные поддомены. Функция реализована с помощью API-запросов к сервису https://securitytrails.com/ и ограничена 6 запросами в день с целью контроля за расходом доступного бесплатного лимита. Для того, чтобы обойти ограничение в 50 запросов на 1 аккаунт, я завел несколько бесплатных аккаунтов, в каждом из которых сгенерировал API-ключ, добавив в бота их перебор по кругу до тех пор, пока не закончатся все рабочие ключи. Сейчас ищу бесплатную альтернативу данному сервису без ограничений. Буду рад идеям и предложениям в комментариях.
8. Скачать SSL-сертификаты сайта присылает всю цепочку SSL-сертификатов сайта в формате crt (включая его корневой и промежуточный CA), а также основную информацию из полей сертификатов в виде текста.
9. Узнать вендора по MAC (+RNG) определяет и присылает название производителя. Функция реализована через поиск по обновляемой на github базе mac-адресов. Имеется кнопка со случайными mac-адресами для быстрой проверки данной функции.
10. Reverse DNS Lookup запрашивает IP-адрес, а в ответ присылает найденный Reverse DNS (PTR-запись).
11. Тест Email на AV/AS/AP сначала предлагает выбрать тип тестового сообщения, которое содержит 1 из 3 строк, имитирующих спам /вирус / фишинг.
Затем просит ввести почту получателя и отправляет на него сообщение выбранного типа.
Далее бот предлагает пользователю проверить почту. Если сообщения дошли, значит почтовый шлюз их пропустил, и защита не настроена.
Конфигуратор сетевого оборудования
Конфигуратор сетевого оборудования состоит из 4 функций.
1. Конфигуратор FW FortiGate сначала предлагает выбрать тип объектов (IP или FQDN), с которыми планируется составить copy-paste строку конфигурации для оборудования FortiGate.
Если пользователь выбирает IP, то бот просит ввести построчно или списком все необходимые IP-адреса. После этого необходимо отправить в сообщении ❗️, потом ввести имя для группы. В ответ получаем готовый файл с текстовой copy-paste конфигурацией.
Пример получаемого конфигурационного файла:
config firewall address
edit "1.1.1.1/32"
set type ipmask
set allow-routing enable
set subnet 1.1.1.1 255.255.255.255
next
end
config firewall address
edit "1.1.1.2/32"
set type ipmask
set allow-routing enable
set subnet 1.1.1.2 255.255.255.255
next
end
config firewall addrgrp
edit "IMPORTED-IP-GROUP"
append member "1.1.1.1/32" "1.1.1.2/32"
set allow-routing enable
next
end
Если же выбран FQDN, то необходимо ввести построчно или списком доменные имена, а после этого отправить ❗️. Бот запрашивает, нужно ли включить в список поддомены “www” или сразу все домены по wildcard-маске *, имя для группы, а в ответ присылает готовый файл с текстовой copy-paste конфигурацией.
Пример получаемого конфигурационного файла:
config firewall address
edit "site2.ru"
set type fqdn
set allow-routing enable
set fqdn "site2.ru"
next
edit "*.site2.ru"
set type fqdn
set allow-routing enable
set fqdn "*.site2.ru"
next
end
config firewall address
edit "site1.ru"
set type fqdn
set allow-routing enable
set fqdn "site1.ru"
next
edit "*.site1.ru"
set type fqdn
set allow-routing enable
set fqdn "*.site1.ru"
next
end
config firewall addrgrp
edit "IMPORTED-FQDN-GROUP"
append member "site2.ru" "*.site2.ru" "site1.ru" "*.site1.ru"
set allow-routing enable
next
end
2. Конфигуратор FW Cisco (IP) сначала предлагает выбрать тип объектов (IP или FQDN), с которыми планируется составить copy-paste строку конфигурации для оборудования Cisco.
При выборе IP бот просит ввести построчно или списком все необходимые IP-адреса, а затем прислать в сообщении знак ❗️. После введения имени для группы в ответ приходит готовый файл с текстовой copy-paste конфигурацией.
Ниже привожу пример получившейся конфигурации:
conf t
object network "1.1.1.1"
subnet 1.1.1.1 255.255.255.255
exit
exit
conf t
object network "1.1.1.2"
subnet 1.1.1.2 255.255.255.255
exit
exit
conf t
object-group network "IMPORTED-IP-GROUP"
network-object object "1.1.1.1"
network-object object "1.1.1.2"
exit
exit
Если выбран FQDN, то бот просит ввести построчно или списком все необходимые доменные имена, для завершения ожидает присланный в сообщении знак ❗️, потом запрашивает имя для группы и в ответ присылает готовый файл с текстовой copy-paste конфигурацией.
Ниже привожу пример получившейся конфигурации:
conf t
object network "site2.ru"
fqdn "site2.ru"
exit
exit
conf t
object network "site1.ru"
fqdn "site1.ru"
exit
exit
conf t
object-group network "IMPORTED-FQDN-GROUP"
network-object object "site2.ru"
network-object object "site1.ru"
exit
exit
3. Конфигуратор FW Континент 4 состоит из 2 разделов:
Конвертация только сетевых объектов, таких как IP-адреса/FQDN из FortiGate/Cisco ASA в формат Континент 4 для импорта через CSV/XML-файл
Конвертация правил МЭ/NAT и всех связанных с ними сетевых объектов и сервисов из FortiGate/Cisco ASA/Check Point/Континент 3 в формат Континент 4 для импорта через JSON-файл
Только IP/FQDN-объекты через CSV/XML
Функция сначала запрашивает выбрать тип объектов файла конфигурации – FortiGate или Cisco. Далее необходимо загрузить файл конфигурации и определить, каким образом обрабатывать дубли и проводить сортировку.
В планах добавить поддержку большего числа вендоров. Напишите, пожалуйста, в комментариях для каких вендоров стоит написать парсеры и добавить в бота?
По причине ухода зарубежных вендоров с рынка РФ я пока оставил только конвертацию конфигураций оборудования западных вендоров в конфигурацию для отечественных, но, возможно, стоит написать функции конвертации в других вендоров, например из Cisco в FortiGate и наоборот? Или добавить больше конвертируемых настроек?
Пример получившегося CSV-файла для импорта объектов FortiGate в Континент 4 приведен ниже:
Пример получившегося CSV-файла для импорта объектов Cisco ASA в Континент 4 приведен ниже:
МЭ/NAT и IP/FQDN-объекты через JSON
Функция использует готовый инструментарий из официального репозитория разработчиков «Кода Безопасности» https://github.com/itseccode/c4_tools и позволяет подавать на вход конфигурационные файл различных производителей, проводить парсинг и конвертацию строк в формат, поддерживаемый оборудованием Континент 4.
Пример конвертации конфига из Cisco ASA в Континент 4:
Пример конвертации конфига из FortiGate в Континент 4:
Пример конвертации конфига из нового формата Check Point в Континент 4:
Пример конвертации конфига из Континент 3.9 в Континент 4:
Пример конвертации конфига из старого формата Check Point в Континент 4:
4. Конфигуратор FW Linux (iptables) позволяет вывести подсказки по тому, как разрешить прохождение всего трафика или команды для вывода на экран существующих правил iptables, а также в интерактивном режиме написать нужное правило.
Рассмотрим эту функцию на примере:
Сначала бот спрашивает, в начало или конец списка добавить новое правило, а затем просит выбрать цепочку iptables и входящий интерфейс.
В зависимости от выбранных значений, некоторые интерактивные опросы могут быть пропущены как ненужные. Например, при выборе цепочки PREROUTING недоступен выбор исходящего интерфейса.
После этого необходимо определиться с протоколом, исходящим IP и портом, IP и портом назначения.
Далее бот просит выбрать конечное действие с выбранным трафиком
В некоторых случаях, после выбора действия бот запрашивает уточняющие вопросы, например, при выборе действия REDIRECT необходимо указать порт для перенаправления на него трафика.
Ниже представлен весь диалог целиком и полученное в результате правило:
Бонус
Недавно в боте появился новый бонусный раздел, в котором я буду публиковать свои или другие понравившиеся мне полезные проекты (в основном - telegram-боты). Рекомендую тоже обратить на них внимание.
А так же, попробуйте найти ещё 1 скрытую команду, которой нет в меню бота ;)
Планы на будущее (TO DO)
Перебраться из Notepad++ в IDE типа PyCharm.
Очистить код от мусора и оптимизировать функции.
Сделать все функции асинхронными. Сейчас некоторые выполняются не моментально, а занимают какое-то время. При большом количестве одновременных запросов от разных пользователей может скопиться очередь и длительность ожидания станет заметно некомфортной.
Разбить 1 скрипт на несколько раздельных: основную функцию и вспомогательные в разных файлах-модулях, чтобы вызывать вспомогательные только по мере необходимости и экономить вычислительные ресурсы сервера.
Хранить все переменные в отдельных файлах или в БД в зашифрованном виде. Хранение присылаемых конфигов не ведется – они удаляются сразу после обработки и выдачи результата в чат.
Расширить список поддерживаемых вендоров сетевого оборудования в разделе «Конфигуратор сетевого оборудования» и набор поддерживаемых настроек при конвертации. Как минимум нужны сервисы и группы сервисов, потом можно переходить к парсерам FW и NAT-правил.
Добавить генератор строки инициализации Континент 3 (как дань памяти ныне почившему функционалу) https://kdemon.github.io/pages/kstrcfg.html.
Добавить больше разнообразных полезных сетевых инструментов (конвертация документов, OCR, crontab guru https://crontab.guru/, I OR l https://iorl.info/).
Настроить возможность пересылать боту сообщения и задать автоматическое выполнение определенных задач по формату текста в пересылаемом сообщении, чтобы быстрее получать ответ без навигации по меню и явного выбора необходимого пункта.
Исправить и оптимизировать устаревший код, который пишет ChatGPT под актуальные версии модулей и библиотек, а также современные требования безопасности.
Сделать бота опенсорсным, перенести код на Github для сохранения версионности, а также для возможности коллективной работы и контрибуции и провести интеграцию ChatGPT с Github репозиторием бота.
Настроить отказоустойчивость хост-серверов и автоматизировать перевод тестовых версий в продакшн по расписанию.
Возможно, добавить монетизацию в виде plus-подписки для возможности использования платных сервисов и API. Сейчас я использую счетчики (лимиты) использования тех функций, в сервисах которых есть ограничения по количеству запросов в бесплатной версии. Также я настроил лимиты на отправку спам-писем с моего домена для каждого пользователя для противодействия злонамеренному использованию и избежания попадания домена в спам-листы. В планах оптимизировать эту функцию для снижения подобных рисков.
Приветствуются предложения и критика в комментариях. Если у вас есть идеи, какие полезные функции стоит добавить в бота, или вы знаете, как реализовать ту или иную функцию эффективнее – не проходите мимо. Я буду рад услышать профессиональное мнение, исправить свои ошибки и оптимизировать алгоритм.