Сегодня я хочу описать в некотором роде специфическую схему — которая, впрочем, может оказаться полезной для владельцев собственных интернет-ресурсов, размещенных за маршрутизатором Mikrotik. Не секрет, что практически все сайты непрерывно подвергаются сканированию с самыми нехорошими намерениями. Если открыть лог обращений, то в глаза бросятся запросы на предмет получения доступа к файлам конфигураций веб-движков, админок, личных кабинетов и прочего. Конечно, можно просто оставить доступ к значимым страницам только для определенных адресов (хоть бы и посредством .htaccess), но я предлагаю предпринять несколько более серьёзные меры. Если для простых заблудившихся посетителей достаточно показать обычную 404-ю страницу, то для всяких проходимцев нужно показать страницу не столь обычную — а какую именно я сейчас объясню.

Первая часть концепта — php-страницу к которой следует иметь доступ из условной локалки я модифицирую примерно следующим образом:

// Адрес посетителя

$clientIp = $_SERVER['REMOTE_ADDR'];

// Путь к сценарному файлу для SSH
$filePath = 'Z:\BlackList.txt';

// Формат строки для сценарного файла SSH
$string = "/ip firewall address-list add address=".$clientIp." list=Blacklist".PHP_EOL;

 

// Если $clientIp не входит в диапазон сети
if (!ipInNetwork($clientIp, '192.168.88.0/24'))
{

// Если $clientIp не содержится в содержимом $filePath
if (!strpos(file_get_contents($filePath), $clientIp) == true)

{

// Добавляем $string в содержимое $filePath
file_put_contents($filePath, $string, FILE_APPEND | LOCK_EX);

}
exit();

}

function ipInNetwork($ip, $range)
{

list($range, $subnet) = explode('/', $range);
if (filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4) === false)
{

return false;

}
$ip = ip2long($ip);
$range = ip2long($range);
$subnet = 32 — (int)$subnet;
$mask = -1 << $subnet; $range &= $mask;
return ($ip & $mask) === $range;

}

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

set "file=Z:\BlackList.txt"
if exist "%file%" (

for %%i in ("%file%") do if %%~zi equ 0 (

echo File is empty

) else (

"%PROGRAMFILES%\PuTTY\plink.exe" -ssh -batch [email protected] -pw Str0ngPa$$w0RD -m %file%

del /f /q %file%

)

) else (

echo File not found!

)

После чего этот сценарный bat-файл подвязывается на периодическое выполнение через планировщик задач, с какой периодичностью — тут решайте сами. На самом Mikrotik следует предварительно настроить блокировку адресов из нашего черного списка (в идеале — в RAW), про всякие очевидные вещи вроде включенного SSH (в идеале — с доступом только с определенного хоста) я даже не стану расписывать.