Информация
Услуги
  • Внедрение
  • Настройка
  • Поддержка
  • Ремонт
Контакты
Новинка
Распродажа
Новости
Доставка
Оплата
Загрузки
  • Прошивки
    • WinBox
    • RouterOS
    • Мобильные приложения MikroTik
    • Архив
  • RouterOS
  • Мобильные приложения MikroTik
  • Архив
Форум
Настройка
    info@mikrotik.moscow
    +7 495 320-55-52
    Заказать звонок
    Mikrotik.moscow
    Каталог
    • Акции
      Акции
    • Маршрутизаторы
      Маршрутизаторы
    • Коммутаторы
      Коммутаторы
    • Радиомосты и уличные точки доступа
      Радиомосты и уличные точки доступа
    • Wi-Fi для дома и офиса
      Wi-Fi для дома и офиса
    • LTE/5G
      LTE/5G
    • Powerline адаптеры
      Powerline адаптеры
    • IoT устройства
      IoT устройства
    • Оборудование 60 ГГц
      Оборудование 60 ГГц
    • Материнские платы RouterBOARD
      Материнские платы RouterBOARD
    • Корпуса
      Корпуса
    • Интерфейсы
      Интерфейсы
    • SFP/QSFP трансиверы
      SFP/QSFP трансиверы
    • Аксессуары
      Аксессуары
    • Антенны
      Антенны
    • Архив
      Архив
    Войти
    0 Сравнение
    0 Избранное
    0 Корзина
    Скачать WinBox Скачать Прошивки Форум > RouterOS Форум > SwOS Форум > Железо
    Mikrotik.moscow
    Каталог
    Войти
    0 Сравнение
    0 Избранное
    0 Корзина
    Mikrotik.moscow
    Телефоны
    +7 495 320-55-52
    Заказать звонок
    0
    0
    0
    Mikrotik.moscow
    • +7 495 320-55-52
      • Назад
      • Телефоны
      • +7 495 320-55-52
      • Заказать звонок
    • info@mikrotik.moscow
    • г. Москва, ул. Бакунинская, 84
    • Пн-Пт: 09-00 до 18-00
      Сб-Вс: выходной


    • Кабинет
    • 0 Сравнение
    • 0 Избранное
    • 0 Корзина
    Главная
    Форум
    Форум
    RouterOS
    Как заблокировать SSH-атакующих после 3 неудачных попыток входа?

    Как заблокировать SSH-атакующих после 3 неудачных попыток входа?

    Форумы: RouterOS, Аппаратное обеспечение, SwOS, Обратная связь, Объявления, Сторонние инструменты
    Поиск  Пользователи  Правила  Войти
    Страницы: 1
    RSS
    Как заблокировать SSH-атакующих после 3 неудачных попыток входа?, RouterOS
     
    Term
    Guest
    #1
    0
    14.01.2018 11:55:00
    Привет, я новичок в Mikrotik, но нужно разобраться, потому что на новой работе есть RB962UiGS дома. Нужно заблокировать SSH после 3 неудачных попыток входа. Знаю, что есть вики с примером, но там много ненужных списков перед основным. Мне нужно, чтобы при попытке входа фаервол автоматически добавлял пользователя в SSH_Blacklist на 10 дней. Не понимаю, что значит 1/1m,1,dst-address/1m protocol=tcp, но работает. Вот что у меня есть для FTP, после 3 неправильных логинов:

    /ip firewall address-list  
    add list=FTP_Blacklist

    /ip firewall filter  
    add action=drop chain=input comment="drop ftp brute forcers" dst-port=21 in-interface=ether1 protocol=tcp src-address-list=FTP_Blacklist  
    add action=accept chain=output content="530 Login incorrect" dst-limit=1/1m,1,dst-address/1m protocol=tcp  
    add action=add-dst-to-address-list address-list=FTP_Blacklist address-list-timeout=1w3d chain=output content="530 Login incorrect" protocol=tcp

    /ip firewall nat  
    add action=masquerade chain=srcnat out-interface=pppoe-out1  
    add action=dst-nat chain=dstnat comment=Transmission dst-port=53105 in-interface=pppoe-out1 protocol=tcp to-addresses=10.31.0.102 to-ports=53105  
    add action=dst-nat chain=dstnat comment="Synology DSM" dst-port=6271 in-interface=pppoe-out1 protocol=tcp to-addresses=10.31.0.102 to-ports=6271  
    add action=masquerade chain=srcnat comment="VPN accept" src-address=10.31.10.0/24

    Спасибо!
     
     
     
    donsergio
    Guest
    #2
    0
    01.02.2018 16:49:00
    Ты также можешь изменить порт SSH в IP-Services и поставить какой-нибудь случайный порт, например, 2200 (любой, который легко запомнить)…
     
     
     
    zivtal
    Guest
    #3
    0
    07.02.2019 18:15:00
    Я написал этот скрипт. Тебе нужно добавить планировщик, который каждые 5–10 минут проверяет, если с одного IP было больше 5 неудачных попыток входа — этот IP автоматически добавляется в список блокировки. Если хочешь ограничиться только 3 попытками, просто измени строку ":local attempt 5" на ":local attempt 3".  

    # Проверяем, есть ли действие логирования, если нет — создаём  
    :if ([:len [/system logging action find name=login]]=0) do={
    /system logging action add name=login target=memory  
    }  

    # Проверяем, есть ли правило логирования, если нет — создаём  
    :if ([:len [/system logging find action=login]]=0) do={
    /system logging add topics=system,error,critical action=login  
    }  

    # Количество попыток входа  
    :local attempt 5  

    :if ([:len [/log find where buffer=login message~"login failure" and message~"from"]]>0) do={
    # Получаем IP из лога  
    :local getIP do={  
    :if ([:type [:find $string "from"]]!="nil") do={
    :local cut [:pick $string ([:find $string "from"]+[:len "from"]+1) [:len $string]]
    :if ([:len [:find $cut " "]]>0) do={
    :return [:pick $cut 0 [:find $cut " "]]
    } else={  
    :return [:pick $cut 0 [:len $cut]]
    }  
    } else={  
    :if ([:len $default]>0) do={
    :return $default  
    } else={  
    :return ""  
    }  
    }  
    }  

    # Читаем значение ключа из строки  
    :local getKeyValue do={  
    :if ([:type [:find $string $name]]!="nil") do={
    :local cut [:pick $string ([:find $string $name]+[:len $name]+1) [:len $string]]
    :if ([:len [:find $cut ";"]]>0) do={
    :return [:pick $cut 0 [:find $cut ";"]]
    } else={  
    :return [:pick $cut 0 [:len $cut]]
    }  
    } else={  
    :if ([:len $default]>0) do={
    :return $default  
    } else={  
    :return ""  
    }  
    }  
    }  

    # Устанавливаем ключ и значение в строку  
    :local setKeyValue do={  
    :if ([:typeof [:find $string $name]]!="nil") do={
    :local current  
    :local cut [:pick $string ([:find $string $name]) [:len $string]]
    :if ([:len [:find $cut ";"]]>0) do={
    :set current [:pick $cut 0 [:find $cut ";"]]
    } else={  
    :set current [:pick $cut 0 [:len $cut]]
    }  
    :return ([:pick $string 0 [:find $string $current]]."$name=$value".[:pick $string ([:find $string $current]+[:len $current]) [:len $string]])
    } else={  
    :if (([:len $value]>0) and ([:len $name]>0)) do={
    :if (([:len $string]=0) or ([:pick $string ([:len $string]-1) [:len $string]]=";")) do={
    :return ($string."$name=$value;")  
    } else={  
    :return ($string.";$name=$value;")  
    }  
    } else={  
    :return ($string)  
    }  
    }  
    }  

    # Удаляем ключ и значение из строки  
    :local delKeyValue do={  
    :if ([:typeof [:find $string $name]]!="nil") do={
    :local current  
    :local cut [:pick $string ([:find $string $name]) [:len $string]]
    :if ([:len [:find $cut ";"]]>0) do={
    :set current [:pick $cut 0 [:find $cut ";"]]
    } else={  
    :set current [:pick $cut 0 [:len $cut]]
    }  
    :return ([:pick $string 0 [:find $string $current]].[:pick $string ([:find $string $current]+[:len $current]+1) [:len $string]])
    } else={  
    :return ($string)  
    }  
    }  

    # Проверяем лог на "неудачные входы"  
    :local retry  
    :global loginFailures  
    :foreach index in=[/log find where buffer=login message~"login failure" and message~"from"] do={
    :set retry [:tonum [$getKeyValue string=$loginFailures name=[$getIP string=[/log get $index message]]]]
    :if (($retry+1)>=$attempt) do={  
    /ip firewall address-list add address=[$getIP string=[/log get $index message]] list=login_failure comment=([/log get $index message].", добавлен ".$[/system clock get date]." ".$[/system clock get time]) timeout=1d
    :set loginFailures [$delKeyValue string=$loginFailures name=[$getIP string=[/log get $index message]]]
    } else={  
    :if ([:len [/ip firewall address-list find where address=[$getIP string=[/log get $index message]] and list=login_failure]]=0) do={
    :set loginFailures [$setKeyValue string=$loginFailures name=[$getIP string=[/log get $index message]] value=($retry+1)]
    }  
    }  
    }  

    # Очищаем лог  
    /system logging disable [find action=login]
    /system logging enable [find action=login]
    :if ([:len $loginFailures]=0) do={
    /system script environment remove loginFailures  
    }  
    :if ([:len [/ip firewall filter find comment="block address that reach maximum login attempts"]]=0) do={
    /ip firewall filter add chain=input src-address-list=login_failure action=drop comment="block address that reach maximum login attempts"  
    }  
    }
     
     
     
    anav
    Guest
    #4
    0
    07.02.2019 18:38:00
    Вау, всё может очень быстро запутаться. Если ты вообще не используешь SSH на роутере, ни входящий, ни исходящий трафик, просто поставь это в raw. То же самое касается FTP:

    /ip firewall raw add chain=prerouting dst-port=common_ssh_port action=drop  
    /ip firewall raw add chain=prerouting dst-port=common_Ftp_port action=drop

    Не уверен, но, возможно, можно сделать одно правило:

    /ip firewall raw add chain=prerouting dst-ports=20,21,22,23,139 action=drop

    Для всех портов, которые ты используешь и о которых беспокоишься, почему бы не сделать так (после established, related):

    /ip firewall filter add chain=forward dst-port=53 in-interface-list=WAN action=add source address to address list address list=dropbadguys timeout=6hrs

    А потом в raw:

    /ip firewall raw add chain=prerouting source-address-list=dropbadguys action=drop
     
     
     
    zivtal
    Guest
    #5
    0
    07.02.2019 19:12:00
    Я не понимаю, сегодня я быстро написал скрипт, потому что это первый раз, когда я вижу, что кто-то пытается подключиться к моему Mikrotik API примерно 999 раз... Если у вас есть порт, который вы используете для такого Mikrotik API, как вы блокируете адреса, которые пытаются взломать ваш роутер?
     
     
     
    anav
    Guest
    #6
    0
    07.02.2019 19:29:00
    Привет, Zivital, хороший вопрос… Во-первых, у меня нет доступа к роутеру из внешних источников. Если бы был, то только через VPN. Что касается сервисов, например API, SSH или winbox, первое, что я бы сделал — это по возможности сменил стандартный порт. Допустим, тебе нужно использовать трафик на порту API, тогда в ip firewall filter делаем так:

    INPUT — после правила accept established related добавляем  
    chain=input dst-port=api_port in-interface-list=WAN action=add source address list to address list=badguys timeout=6 часов

    FORWARD — после accept established related добавляем  
    chain=forward dst-port=api_port in-interface-list=WAN action=add source address list to address list=badguys timeout=6 часов

    /ip raw добавляем  
    chain=prerouting src-address-list=badguys action=drop

    Моя идея такова: скорее всего злоумышленники будут сканировать множество портов, и исходное правило в raw должно поймать большинство из них…

    /ip raw добавляем  
    chain=prerouting in-interface-list=WAN dst-ports= СПИСОК ВСЕХ ОБЩИХ ПОРТОВ, НЕ ИСПОЛЬЗУЕМЫХ НА ТВОЕМ УСТРОЙСТВЕ  (например 20, 21, 22, 23, 139 и т.д.) action=add to source address list, address-list=badguys timeout=6 часов.

    Короче говоря, у нас одно правило в raw для всех популярных портов, которые не используются или скорее всего не будут использоваться на роутере, так что отсутствие состояния не имеет значения. Это должно остановить большую часть нежелательного трафика. Затем мы просто отбрасываем их в raw, чтобы минимизировать нагрузку на процессор.

    Для тех злоумышленников, кто не просто массово сканирует, а целенаправленно проверяет порты, которые мы используем, мы ловим их уже в фильтрах после разрешённого использования этих же портов и тоже отбрасываем их в raw.

    Понятно?
     
     
     
    zivtal
    Guest
    #7
    0
    07.02.2019 19:42:00
    Я пытаюсь понять, как решают, кто здесь плохой гей, а кто — легальная связь...
     
     
     
    anav
    Guest
    #8
    0
    07.02.2019 20:14:00
    Ну, для портов, которые ты не собираешься использовать на своем роутере, неважно, откуда приходит входящий трафик — от злодея или это ответ на исходящий трафик роутера, который, предположительно, возвращается тоже от плохого парня. Это неавторизованный порт. Так как raw работает без сохранения состояния. Что касается портов, которые ты всё же используешь… Исходящий трафик с роутера и возвращающийся по этим же портам — легитимен. В общем, мы определяем, если трафик приходит в роутер (input) или проходит через него (forward) и ещё не был идентифицирован или отмечен как установленный и связанный (established и related), то это точно трафик от плохих ребят!!! Единственный случай, когда такой подход не сработает — это, возможно, dstnat-трафик, когда нужно, чтобы внешний исходящий трафик прошёл через определённые порты. Если у тебя «открытые серверы» в локальной сети, то проблема сложнее. Я считаю, что открытые серверы — плохая идея, потому что порты видны при сканировании, но в отчётах показываются закрытыми. Волшебное решение для dst-nat трафика — использовать source-address-list, если вообще возможно! То есть, если ты знаешь, кто (внешний публичный IP) должен иметь доступ к серверу в локалке, то добавь этот IP в список источников. Интересный побочный эффект добавления source-address-list в NAT правило — порт вообще не виден при сканировании. Круто! Тогда в правиле фильтрации для форварда добавляешь:

    add chain=forward action=accept connection-nat-state=dstnat source-address-list=authorized

    а потом:

    add chain=forward action=add to address list address-list=badguys dst-ports=(порты, которые ты используешь) timeout=6hrs

    Один из сценариев, как ты мог догадаться — когда ты не знаешь легитимные внешние публичные IP, которые подключаются к твоему серверу. Это могут быть смартфоны, динамические IP и так далее... NAT правило пропустит на сервер любой исходящий IP, а правило файрволла пропустит любой IP через forward filter. Единственная защита тогда — это имя пользователя и пароль на самом сервере. В таком случае, возможно, стоит считать повторяющиеся попытки захода на сервер и порт назначения, и использовать правило по количеству попыток (помеченное выше в обсуждении), чтобы защититься от подбора логина и пароля???
     
     
     
    anav
    Guest
    #9
    0
    07.02.2019 20:34:00
    TERM  
    Мне не нужно получать доступ к моему Mikrotik из внешней сети (через VPN). (1) Но я хочу видеть в некоторых списках, что кто-то пытался получить доступ к моему Mikrotik снаружи. Есть ли способ это сделать? (2)  
    karlisi: спасибо, но я не хочу загромождать файрволл кучей списков. Всё, чего я хочу — блокировать пользователя после 3 неудачных попыток входа и добавлять его в список на 10 дней.

    +++++++++++++++++++++++++++++++  

    (1) Да, вы можете логировать все попытки с WAN следующим образом:  
    Input chain, последние два правила:  
    add chain=input in-interface-list=WAN action=log prefix=“Show ALL INPUT Traffic From WAN Being Dropped”  
    add chain=input action=drop  

    Forward chain, последние два правила:  
    add chain=forward in-interface-list=WAN action=log prefix=“Show ALL FORWARD Traffic FROM WAN Being Dropped”  
    add chain=forward action=drop  

    (2) Поскольку внешний доступ к роутеру вам не нужен, вы можете добавить все адреса, попадающие под эти два правила, и блокировать их через RAW. Логи тогда не будут засоряться — вы сможете смотреть списки в таблицах ip firewall address list…  

    Последние правила:  
    Input chain  
    add chain=input in-interface-list=WAN action=add to address list address-list=badguys timeout=6h  
    add chain=input action=drop (последнее правило)  

    Forward chain  
    add chain=forward in-interface-list=WAN action=add to address list address-list=badguys timeout=6h  
    add chain=forward action=drop  

    RAW  
    /ip raw  
    add chain=prerouting source-address-list=badguys action=drop  

    Что касается быстрых попыток, то первая попытка фиксируется, дальше они просто игнорируются. Если вы хотите ОСТАНОВИТЬ именно быстрые подряд идущие попытки, то нужна отдельная, специальная правило, а не универсальное… Я просто не знаю, как его настроить.  

    Пример:  
    add input rule catch rapid attempts from wan list=rapidhackers drop all  
    add forward rule catch rapid attempts from wan list=rapidhackers drop all  
    raw - prerouting drop all ‘rapidhackers’  

    Параметры для такого правила, вероятно, должны быть либо connection limit, либо psd (partial sequence detection). Возможно, какие-то эксперты смогут понятно объяснить, как использовать либо один из этих параметров, либо оба, чтобы отловить:  
    a. флуда  
    b. сканирования  
    c. попытки взлома (предполагая username/password).
     
     
     
    freemannnn
    Guest
    #10
    0
    20.04.2020 18:32:00
    Спасибо за этот рабочий и классный скрипт. Я так долго его искал. Проверил — работает отлично (6.46.4). Пожалуйста, держите нас в курсе, если появится новая версия скрипта. Ваш скрипт даже автоматически добавляет всё необходимое в logging/rules-action и правило в ip/firewall/filter для блокировки address-list. Очень круто, спасибо. Мои изменения были такие…

    1. Я убрал timeout=1d, потому что хочу блокировать навсегда неудачные попытки входа.

    /ip firewall address-list add address=[$getIP string=[/log get $index message]] list=login_failure comment=([/log get $index message].", added at “.[/system clock get date].” ".[/system clock get time]) place-before=1

    Так правило будет стоять выше правила, которое разрешает winbox.

    /ip firewall filter add chain=input src-address-list=login_failure action=drop comment=“блокировать адреса, достигшие максимума попыток входа” place-before=0

    :local attempt 3
     
     
     
    paalbo
    Guest
    #11
    0
    29.05.2020 18:05:00
    Всем привет. У меня на MikroTik Router есть такие правила, и они работают. Но можно ли сделать что-то подобное для RDP? Я пытался применить эти правила к RDP, но, похоже, не выходит. У меня есть обычный блок SSH-брутфорсеров, основанный на списках адресов ssh_stage1 - 3, а потом они попадают в ssh_blacklist. Но если я хочу применить это к RDP и делать это по времени, а не по стадиям, как сделать правило, которое будет работать для RDP? И да, я не использую стандартный порт RDP 3389. Например, если бы я основывался на стадиях, то после трёх попыток IP попал бы в черный список. Но у меня есть ситуация: если вдруг отключают от RDP-сервера и пытаешься переподключиться, мой IP попадает в черный список. Я бы хотел, чтобы правило отслеживало не стадии, а именно неудачные попытки входа — обычно это когда хакер пытается подключиться, перебирая логин и пароль, его отключают, он снова пробует и так много раз подряд. Было бы здорово, если бы правило могло засечь 5 неудачных попыток входа и после этого заносить в черный список. Это вообще возможно?
     
     
     
    Jotne
    Guest
    #12
    0
    01.06.2020 05:15:00
    Если вы не подключаетесь к своему роутеру извне через SSH и у вас нет правил NAT для SSH, особо переживать не стоит. К вам не проберутся. Вот как я поступаю. Если кто-то пытается зайти на внешний порт, который закрыт, например порт 22, его IP сразу попадает в чёрный список и остаётся там на 24 часа. Пока вы в чёрном списке — вам закрыт доступ ко всем портам моего роутера, даже к тем, что обычно открыты, например к порту 443 для веб-сервера. Если вы пытаетесь пройти на закрытый порт, я предполагаю, что вы — скрипт, который сканирует мой роутер и ничего от меня не хочет. Многие из этих автоматических скриптов запускают новый скрипт при обнаружении открытого порта, чтобы проверить уязвимости. Конечно, я веду лог этих атак, чтобы потом видеть, сколько IP заблокировано. В любой момент времени в списке заблокированных около 2000–15000 IP. Смотрите мою подпись, там описано, как я веду лог.
     
     
     
    Страницы: 1
    Читают тему
    +7 495 320-55-52
    info@mikrotik.moscow
    Электрозаводская, Бауманская
    Москва, ул. Бакунинская, 84с21
    Конфиденциальность Оферта
    © 2026 «Mikrotik.Moscow»
    Главная Каталог 0 Корзина 0 Избранные Кабинет 0 Сравнение Акции Контакты Услуги Бренды Отзывы Компания Лицензии Документы Реквизиты Поиск Блог Обзоры