Перейти к содержанию

Рекомендуемые сообщения

Опубликовано (изменено)

Antiscan - простой инструмент для выявления и блокировки IP с подозрительной активностью (например, сканеры портов и служб).

Предыстория от @FLK, поясняющая актуальность данного инструмента:

Цитата

Проблема массового сканирования портов становится очень актуальной при наличии белого статического адреса и открытых наиболее используемых портов (например 22, 80, 443), "смотрящих" в интернет. Раньше я не обращал внимание даже на количество подключений в разделе Диагностика - Активные подключения. Но недавно я решил посмотреть как там обстоят дела. И ужаснулся, когда увидел там цифру приближающуюся к 3000... 
Как правило при этом есть 3 типа проблемы, которые я наблюдал:
1) когда вас сканирует 1 ip, но при этом он может создавать очень много одновременных подключений (для примера 22.154.203.43 создаст 100 подключений к 443 порту)...
2) когда вас сканирует целая подсеть, но каждый ip создаёт при этом по 1 подключению (для примера - 202.124.233.5 создаст 1 подключение, 202.124.233.6 - 1 подключение, 202.124.233.7 - 1 подключение и т.д.)
3) когда вас сканирует 1 ip, создавая 1 подключение
Из перечисленных только третий вариант самый безобидный, как правило такое сканирование не раздражает и заканчивается быстро, да и отличить его от легитимного подключения крайне сложно. А вот с первым и вторым вариантом надо было как-то бороться.
В итоге я подал идею @dimon27254 как избавиться от этих надоедливых сканировщиков, а он уже стал ее реализовывать...
Мы начали с простых правил iptables, пробовали разные варианты, смотрели как это будет работать на практике на своих роутерах, в итоге получился достаточно рабочий интрумент, о котором и расскажет сам автор (которому я лично выражаю огромную благодарность) более подробно...

Antiscan представляет собой небольшой скрипт на shell с config-файлом и хук-скриптом netfilter.d. Предназначен для устройств Keenetic/Netcraze, поддерживающих Entware.

Возможности:
1) Блокировка хостов, открывающих множество соединений с одного IP-адреса.
2) Блокировка хостов, открывающих единичные соединения с множества IP, принадлежащих одной подсети /24.

Требования для корректной работы скрипта:
1) Установленный компонент "Модули ядра для подсистемы Netfilter" (начиная с версии ПО 4.3 доступен без "Протокол IPv6").
2) Предварительно настроенный и готовый к работе cron. Можно воспользоваться простой и понятной инструкцией: https://web.archive.org/web/20231004003915/https://forums.zyxmon.org/viewtopic.php?f=5&t=5257
3) Установленный пакет wget-ssl в Entware для загрузки Antiscan в режиме "онлайн":

opkg update && opkg install wget-ssl

Установка:
1. Офлайн вариант:
1.1. Скачать пакет из вложения и загрузить на устройство/внешний накопитель.
1.2. Выполнить команду:

opkg install "/путь_к_пакету/antiscan_1.1_all.ipk"

2. Онлайн вариант:
2.1. Выполнить команду:

opkg install https://github.com/dimon27254/antiscan/releases/download/1.1/antiscan_1.1_all.ipk

3. Указать unix-имена интерфейсов интернет-подключений в файле "/opt/etc/ascn.conf". В 4.3+ просмотр unix-имен интерфейсов доступен по команде:

show interface {интерфейс} system-name

4. (NEW) Настроить сохранение заблокированных IP и подсетей, если это требуется, в файле "/opt/etc/ascn.conf".

5. Запустить Antiscan командой:

/opt/etc/init.d/S99ascn start

Важно: Antiscan является IPv4-only. В настоящее время поддержка IPv6 не планируется к реализации.

Принцип работы:

Спойлер

1) При запуске скрипта создаются 3 ipset: ascn_ips, ascn_candidates и ascn_subnets.
ascn_ips - для блокировки ip, создавших множество соединений.
ascn_candidates - накапливает все ip, открывавшие соединения к указанным в ascn.conf портам.
ascn_subnets - для блокировки подсетей, хосты которых открывали единичные соединения с множества IP.

2) При превышении установленного общего порога одновременных соединений или количества соединений за определенное время, IP будет занесен в ascn_ips и заблокирован.

3) По расписанию запускается задача, обрабатывающая накопленные IP в ascn_candidates: 
3.1) Если количество адресов в одной подсети /24 превышает установленный в ascn.conf порог - вся подсеть /24 заносится в ascn_subnets и блокируется.
3.2) IP, принадлежащие заблокированным подсетям, удаляются из ascn_candidates, а оставшиеся продолжают накапливаться до следующей обработки.

4) По отдельному расписанию запускается задача, сохраняющая накопленные списки заблокированных IP и подсетей в файлы, если данный функционал был включен.
4.1) При перезагрузке устройства или перезапуске скрипта из сохраненных файлов будут восстановлены заблокированные IP и подсети.

Описание параметров в ascn.conf:

Спойлер
# Общие настройки:
# Перечень интерфейсов, на которых работает Antiscan. Множество интерфейсов указывается через пробел, пример: "eth3 eth2.2 ppp0":
ISP_INTERFACES="eth3" 

# Перечень портов, на которых работает Antiscan. Множество портов указывается через запятую, пример: "22,80,443":
PORTS="22,80,443"

# Настройки ограничения множественных соединений:
# Время наблюдения за новыми соединениями от IP в секундах:
RECENT_CONNECTIONS_TIME=30 

# Пороговое значение новых соединений за период RECENT_CONNECTIONS_TIME, после которого IP будет заблокирован:
RECENT_CONNECTIONS_HITCOUNT=15    

# Общий лимит множественных соединений с одного адреса, после которого он будет заблокирован:
RECENT_CONNECTIONS_LIMIT=20 

# Длительность блокировки IP в секундах:     
RECENT_CONNECTIONS_BANTIME=864000   

# Настройки ограничения соединений с разных IP:
# Срок хранения IP-адресов-кандидатов на блокировку:
DIFFERENT_IP_CANDIDATES_STORAGETIME=864000

# Пороговое значение IP-кандидатов, начиная с которого будет создана подсеть для блокировки:
DIFFERENT_IP_THRESHOLD=5

# Длительность блокировки подсети в секундах:
SUBNETS_BANTIME=864000

# Сохранять списки заблокированных IP и подсетей в файлы. 0 - выключено, 1 - включено
SAVE_IPSETS=0

# Путь к каталогу, куда будут сохраняться списки. Пример: "/tmp/mnt/MYDISK/antiscan"
IPSETS_SAVE_PATH=""

Период чтения списка кандидатов по умолчанию равен 1 минуте. Вы можете его изменить, отредактировав задачу в crontab.
Текст задачи:

*/1 * * * * /opt/etc/init.d/S99ascn read_candidates &

Списки адресов по умолчанию сохраняются каждые 5 дней в 00:00. Отредактируйте соответствующую задачу, если необходимо изменить период сохранения.
Текст задачи:

0 0 */5 * * /opt/etc/init.d/S99ascn save_ipsets &

Использование S99ascn:

{start|stop|restart|status|list|reload|update_rules|read_candidates}
start                 начать работу скрипта (создать правила, ipset'ы, начать сбор IP)
stop                  остановить работу скрипта (удалить правила, очистить ipset'ы, отменить блокировку)
restart               остановить и заново начать работу скрипта
status                отобразить статус Antiscan и количество заблокированных IP, подсетей
list {ips|subnets}    отобразить список и количество заблокированных IP/подсетей
reload                обновить конфигурацию Antiscan (перечитать файл ascn.conf)
update_rules          проверить наличие правил iptables, и добавить их при отсутствии (для hook-скрипта netfilter.d)
read_candidates       обработать список адресов кандидатов для блокировки по подсетям (запускается вручную или по расписанию)
save_ipsets           сохранить списки заблокированных IP и подсетей в файлы (запускается вручную или по расписанию)

История версий:

Спойлер

Версия 1.1:

Новое (предложено @MDP и @kaguyashaa):
1) Бессрочное хранение адресов в ipset.
2) Сохранение списков заблокированных адресов и подсетей в память с возможностью дальнейшего восстановления после повторного запуска.

Исправления:
1) При удалении/переустановке пакета файл crontab не очищается от задач Antiscan, если в них вносились изменения.

Версия 1.0:
Первый релиз

Исходный код доступен на github:
https://github.com/dimon27254/antiscan

Замечания, предложения, и конструктивная критика по работе инструмента приветствуется :)

antiscan_1.1_all.ipk

Изменено пользователем dimon27254
Опубликовано (изменено)

От себя добавлю - штука эта имеет "накопительный" эффект - чем дольше работает, тем меньше мух летит на роутер)))) Главное не заиграться и самого себя в бан не отправить))))

Себе поставил

DIFFERENT_IP_THRESHOLD=3
Изменено пользователем FLK
Опубликовано
20 минут назад, FLK сказал:

От себя добавлю - штука эта имеет "накопительный" эффект - чем дольше работает, тем меньше мух летит на роутер)))) Главное не заиграться и самого себя в бан не отправить))))

Себе поставил

DIFFERENT_IP_THRESHOLD=3

Список заблокированных хостов и подсетей хранится в ОЗУ ? Или на флешке?

 

Опубликовано
1 минуту назад, MDP сказал:

Список заблокированных хостов и подсетей хранится в ОЗУ ? Или на флешке?

Списки заблокированных хостов и подсетей представляют собой ipset. Они не сохраняются где-либо в памяти роутера/флешки, и при каждой перезагрузке будут наполняться заново по мере поступления запросов на порты.

Опубликовано
5 минут назад, dimon27254 сказал:

Списки заблокированных хостов и подсетей представляют собой ipset. Они не сохраняются где-либо в памяти роутера/флешки, и при каждой перезагрузке будут наполняться заново по мере поступления запросов на порты.

Так...очень интересно, а реализовать сохранение в какой нибудь файл с некой периодичностью, а после перезагрузки формировать ipset из файла обратно реализуемо?

Опубликовано
1 минуту назад, MDP сказал:

Так...очень интересно, а реализовать сохранение в какой нибудь файл с некой периодичностью, а после перезагрузки формировать ipset из файла обратно реализуемо?

В целом, такое возможно. Однако, изначально я решил это не реализовывать, так как потребуется постоянная периодическая запись ipset на флешку/внутреннюю память, что может негативно сказаться на их ресурсе.

Опубликовано

...ещё бы сюда какую нибудь финтифлюшку приделать для защиты от брутфорсинга )))) ...вообще была бы "бомба". 

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

Опубликовано
1 минуту назад, MDP сказал:

...ещё бы сюда какую нибудь финтифлюшку приделать для защиты от брутфорсинга )))) ...вообще была бы "бомба". 

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

Тут только от надоедливых сканеров)

Опубликовано
7 минут назад, MDP сказал:

...ещё бы сюда какую нибудь финтифлюшку приделать для защиты от брутфорсинга )))) ...вообще была бы "бомба". 

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

зачем? это ведь уже есть из коробки

Опубликовано
Только что, Denis P сказал:

зачем? это ведь уже есть из коробки

Хотелось бы перманентно блокировать...а тут до перезагрузки, или только на некоторый временной интервал.

 

Опубликовано
1 минуту назад, MDP сказал:

Хотелось бы перманентно блокировать...а тут до перезагрузки, или только на некоторый временной интервал.

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

Опубликовано (изменено)
13 минут назад, MDP сказал:

Хотелось бы перманентно блокировать...а тут до перезагрузки, или только на некоторый временной интервал.

 

если сильно хочется, можно системные наборы себе в файл хоронить, их легко опознать по признаку _NDM_BFD

Изменено пользователем Denis P
Опубликовано (изменено)
В 14.05.2025 в 13:57, Denis P сказал:

если сильно хочется, можно системные наборы себе в файл хоронить, их легко опознать по признаку _NDM_BFD

Если требуется защитить сторонние сервисы, которые находятся не на роутере (другое устройство со свои ip) - данный способ работать не будет. Таффик не будет проходить через INPUT.

Изменено пользователем avn
Опубликовано (изменено)

Способ интересный. Решил потестить

Спойлер
PORTS="80,443,22,8443,53"
if [ "$type" == "iptables" ]; then
	EXCLUDE_IPSET=localnet4
	IPSET=blockscan4
	MASK=255.255.255.0
	MASKINT=24
else
	EXCLUDE_IPSET=localnet6
	IPSET=blockscan6
	MASK=ffff:ffff:ffff:ff00::
	MASKINT=56
fi;

# Block scan
ipt _NDM_ACL_IN -t filter -i eth3 -p tcp -m multiport --dports $PORTS -m set ! --match-set ${EXCLUDE_IPSET} src -m connlimit --connlimit-mask $MASKINT --connlimit-above 20 -j SET --add-set $IPSET src
ipt _NDM_ACL_IN -t filter -i eth3 -p tcp -m multiport --dports $PORTS -m set ! --match-set ${EXCLUDE_IPSET} src -m conntrack --ctstate NEW -m recent --name $IPSET --mask $MASK --rsource --update --seconds 30 --hitcount 15 -j SET --add-set $IPSET src
ipt _NDM_ACL_IN -t filter -i eth3 -p tcp -m multiport --dports $PORTS -m set ! --match-set ${EXCLUDE_IPSET} src -m conntrack --ctstate NEW -m recent --name $IPSET --mask $MASK --rsource --set
ipt _NDM_ACL_IN -t filter -i eth3 -p tcp -m multiport --dports $PORTS -m set ! --match-set ${EXCLUDE_IPSET} src -j SET --add-set $IPSET-buf src
ipt _NDM_ACL_IN -t filter -i eth3 -p tcp -m multiport --dports $PORTS -m set --match-set $IPSET src -j DROP

 

 

_NDM_ACL_IN

Использую, т.к. проходит через input и forward

 

 

 

Изменено пользователем avn
Опубликовано
3 минуты назад, avn сказал:

Если требуется защитить сторонние сервисы, которые находятся не на роутере (другое устройство со свои ip) - данный способ работать не будет. Таффик не будет проходить через INPUT.

Речь была только о возможности сохранения системных наборов с "плохими адресами" в файл, при чем тут сторонние сервисы вообще? Этого никто не обещал.

Опубликовано
1 минуту назад, Denis P сказал:

Речь была только о возможности сохранения системных наборов с "плохими адресами" в файл, при чем тут сторонние сервисы вообще? Этого никто не обещал.

Ошибся цитатой, не Вам.

Опубликовано (изменено)
3 минуты назад, MDP сказал:

Тем, у кого серые IP наверное не актуально использовать данную программу.

Ну собственно да, не актуально практически

В основном она для белой статики как и написано в первом сообщении)

Изменено пользователем FLK
Опубликовано

Пожелания:
1) Сохранение заблокированных IP и подсетей + возможность банить перманентно
2) Возможность импортировать свои списки подсетей и ip  для превентивного бана

Опубликовано (изменено)
5 минут назад, kaguyashaa сказал:

Пожелания:
1) Сохранение заблокированных IP и подсетей + возможность банить перманентно
 

в версии 1.1 будет

Она пока на тесте, по первым впечатлениям работает)

Изменено пользователем FLK
Опубликовано
5 часов назад, kaguyashaa сказал:

Кстати, а оно работает только на TCP или ещё на UDP?

Идея была в защите роутера от сканеров портов (обычно это 22. 80, 443 и другие им подобные)

Опубликовано (изменено)

Вышла новая версия 1.1.

Новое (предложено @MDP и @kaguyashaa)
1) Бессрочное хранение адресов в ipset.
Укажите "0" в параметрах длительности блокировки конфига ascn.conf. Пример:

RECENT_CONNECTIONS_BANTIME=0
SUBNETS_BANTIME=0

2) Сохранение списков заблокированных адресов и подсетей в память с возможностью дальнейшего восстановления после повторного запуска.
Настройка осуществляется с помощью параметров "SAVE_IPSETS", "IPSETS_SAVE_PATH".
По умолчанию сохранение выключено. Для включения укажите "1" в параметре "SAVE_IPSETS", а также путь к каталогу, где планируете хранить списки адресов в "IPSETS_SAVE_PATH". Пример:

SAVE_IPSETS=1
IPSETS_SAVE_PATH="/tmp/mnt/MYDISK/antiscan"

Обратите внимание: при включенном сохранении адресов игнорируются установленные значения длительности блокировки адресов и подсетей - автоматически включается "бессрочное" хранение.

Сохранение списков производится с помощью задачи в cron каждые 5 дней в 00:00. Период изменяется аналогично задаче чтения кандидатов, текст задачи:
0 0 */5 * * /opt/etc/init.d/S99ascn save_ipsets &

Исправления:
1) При удалении/переустановке пакета файл crontab не очищается от задач Antiscan, если в них вносились изменения.

В заголовке темы версия пакета была обновлена до 1.1.
Предыдущая версия доступна на GitHub.

Изменено пользователем dimon27254
Опубликовано (изменено)
7 часов назад, kaguyashaa сказал:

Возможность импортировать свои списки подсетей и ip  для превентивного бана

В версии 1.1 появилась возможность загрузки списков IP и подсетей из файлов.

Включите функционал сохранения в файлы: SAVE_IPSETS=1
Укажите путь к каталогу, где будут храниться файлы со списками заблокированных адресов: IPSETS_SAVE_PATH="/tmp/mnt/MYDISK/antiscan"

При запуске Antiscan будет искать в указанном каталоге файлы ipset_ascn_ips.txt и ipset_ascn_subnets.txt. Файлы должны быть в читаемом для команды ipset restore виде.
Пример для ipset_ascn_ips.txt:

create ascn_ips hash:ip family inet hashsize 1024 maxelem 65536
add ascn_ips 1.2.3.4
add ascn_ips 5.6.7.8

Пример для ipset_ascn_subnets.txt:

create ascn_subnets hash:net family inet hashsize 1024 maxelem 65536
add ascn_subnets 1.2.3.0/24
add ascn_subnets 4.5.6.0/24
Изменено пользователем dimon27254
Опубликовано

Достойное приложение, но зачем при включении сохранения адресов включается "бессрочное" хранение? Допустим будет аптайм год, зачем хранить в таблице и бекапе кучу адресов годовой давности, которые скорее всего и не принадлежат сканботам и прочим злоумышленникам

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...

Важная информация

На этом сайте используются файлы cookie. Нажимая "Я принимаю" или продолжая просмотр сайта, вы разрешаете их использование: Политика конфиденциальности.