ТЗ на ping открытых портов
Назначение модуля.
Модуль предназначен для мониторинга открытых портов на списке заданных ip уведомления ответственного лица в случае некорректного состояния порта (должен быть открыт, а в момент проверки оказался закрыт или наоборот должен быть закрыт, а в момент проверки оказался открыт).
Функциональные требования к модулю.
Модуль должен обеспечить регулярную проверку состояния портов для конкретного списка ip и набору портов для заданного ip.
Требования к платформе реализации.
Модуль должен представлять из себя микросервис реализованный на Symfony (или чистом php). Для его корректной работы необходима установка следующих компонентов:
PHP 7 или выше
MYSQL
Redis
php-fpm
nginx
openssl
Модуль должен корректно работать ОС Unix/Linux.
Требования к системной архитектуре.
В базе данных должны присутствовать следующие таблицы со следующим набором столбцов:
Список IP адресов (ip)
Столбец | Тип | Описание |
id | int | Автоинкремент |
isActive | tinyint | Маркер того следует проверять IP или нет (1 - проверяем, 0 - нет) |
title | string | Примечание IP адреса |
ip | string | IP-адрес |
portRage | int | id строки с набором портов из таблицы наборов портов |
Список набора портов (ports)
Столбец | Тип | Описание |
id | int | Автоинкремент |
openPorts | string | Перечень открытых портов которые следует проверять. Варианты указания просто перечень через запятую (1,2,3 следует проверять порты 1, 2 и 3) диапазон портов (1-5 следует проверять все порты с 1 по 5)
Также условия могут комбинироваться например 1,2,5-10 - говорит о том, что следует проверять первый, второй и порты с пятого по десятый |
closedPorts | string | Перечень закрытых портов которые следует проверять. Варианты указания просто перечень через запятую (1,2,3 следует проверять порты 1, 2 и 3) диапазон портов (1-5 следует проверять все порты с 1 по 5)
Также условия могут комбинироваться например 1,2,5-10 - говорит о том, что следует проверять первый, второй и порты с пятого по десятый |
Раз в 10 минут в системе запускается задача по крону, которая вытягивает из таблицы с IP адресами строки у которых isActive = 1 и проверят набор портов по списку из связанной таблицы (порты подтягиваются по критерию ip.portRange = ports.id).
Если в результате проверки какой-то из портов не соответствует условию открытости или закрытости на забитый в системе e-mail должно отправляться письмо с указанием домена и сроком окончания действия (саму отправку делать не нужно).
Проверить порт на открытие можно попытавшись открыть сокет (fsockopen($ip, $port, $errNum, $errStr, 1);) если порты закрыт, то при пытке открытия сокета выскочит Exception, что можно расценивать как закрытость порта. В случае удачного открытия сокета нужно не забывать его закрыть.