Простенькая защита от брутфорса на Mikrotik





В минувшие выходные какие-то любопытные с нескольких ip-адресов из юго-восточной Азии заинтересовались PPTP сервером на скромном Mikrotik hEX из тех, которыми я по работе управляю. Не так, чтоб сильно активно, где-то пакетов 80 в секунду было.
Набор правил в /ip firewall filter мало чем отличался для input от тех, что в дефолтной конфигурации, разве что разрешён приём protocol=tcp dst-port=1723 для сервера PPTP. Пришлось чуть-чуть доработать.
/ip firewall filter add action=add-src-to-address-list address-list=pptp-list-30min \ address-list-timeout=30m chain=input dst-port=1723 \ in-interface=ether1 protocol=tcp src-address-list=\ pptp-list-30sec tcp-flags=syn add action=add-src-to-address-list address-list=pptp-list-30sec \ address-list-timeout=30s chain=input dst-port=1723 \ in-interface=ether1 protocol=tcp tcp-flags=syn add action=accept chain=input dst-port=1723 in-interface=\ ether1 protocol=tcp src-address-list=!pptp-list-30min
Первый пакет с флагом SYN проходит первое правило, во втором адрес источника заносится на 30 секунд в динамический список, третье правило разрешает принять пакет.
Если соединение не удалось, и в течение 30 секунд происходит ещё одна попытка, первое правило срабатывает и помещает ip-адрес источника в другой, теперь уже 30-минутный список. После этого пакет уже не соответствует третьему правилу, проходит по списку дальше и спокойно прибивается на расположенном ниже
add action=drop chain=input in-interface=ether1
Итого, если с таймаутами как в примере, то у легального PPTP клиента одна попытка подключиться раз в 30 секунд. Любопытный брутфорсер после второй попытки раньше, чем через 30 секунд, на полчасика идёт в дроп.
Само собой, метод годится не только для PPTP, достаточно указать другой порт. Но для защиты, к примеру, доступа winbox снаружи откуда угодно я предпочитаю port knocking.