Всем привет! В первой части своего повествования я рассказал об опыте создания при помощи 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 функций.

  1. Инфо об 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. Сейчас я использую счетчики (лимиты) использования тех функций, в сервисах которых есть ограничения по количеству запросов в бесплатной версии. Также я настроил лимиты на отправку спам-писем с моего домена для каждого пользователя для противодействия злонамеренному использованию и избежания попадания домена в спам-листы. В планах оптимизировать эту функцию для снижения подобных рисков.

Приветствуются предложения и критика в комментариях. Если у вас есть идеи, какие полезные функции стоит добавить в бота, или вы знаете, как реализовать ту или иную функцию эффективнее – не проходите мимо. Я буду рад услышать профессиональное мнение, исправить свои ошибки и оптимизировать алгоритм.

Комментарии (6)


  1. chelaxian Автор
    07.12.2023 17:15

    ставь + если нашел секретную команду в боте


  1. chelaxian Автор
    07.12.2023 17:15

    ставь + если бонус понравился больше основного бота


  1. chelaxian Автор
    07.12.2023 17:15

    ставь + если понравилась расшифровка аббревиатуры от chatgpt:
    N.E.T.C.A.L.C - Network Engineer Toolkit to Calculate Addresses and Load Configurations


  1. chelaxian Автор
    07.12.2023 17:15

    пишите в комментарии под постом какие функции еще добавить в бота


  1. PavelKuptsov
    07.12.2023 17:15

    Представляю какой там АД в кодовой базе, которая написана видимо наполовину через чатgpt ... Ну и судя по планам на будущее, мне кажется мои догадки близки к истине ????.
    В остальном бот интересный, развития вам в дальнейшем ????


    1. chelaxian Автор
      07.12.2023 17:15

      Всё верно :) Это главная причина, по которой я не тороплюсь с публикацией кода. Стыдно такое показывать ???? Пока главное, что работает, а как… лучше даже не спрашивать) Выложу как причешу. Спасибо за напутствие!