Достали всякие малолетние придурки, сканящие порты да радостно брутфорсящие ssh... Ну правда достали. Порылся в инете нашёл пару решений. Самым толковым, на мой взгляд, оказалось PortSentry (сайт, к сожалению сдох - http://www.psionic.com/ ). Правда, в портах, оно водится./usr/home/lissyara/>cd /usr/ports /usr/ports/>make search name='PortSentry' Port: portsentry-1.1 Path: /usr/ports/security/portsentry Info: Port scan detection and active defense Maint: ports@FreeBSD.org B-deps: R-deps: WWW:
/usr/ports/>cd /usr/ports/security/portsentry /usr/ports/security/portsentry/>make && make install && make clean
Приводим конфиг программы - /usr/local/etc/portsentry.conf - к такому виду: # TCP-порты которые должен слушать PortSentry - тут нельзя указывать # порты, которые заняты приложениями - тока свободные. Проверить, # что занято можно примерно так: # sockstat | grep udp | grep -v 127.0.0.1 | awk '{print $6}' | sort | uniq -c # или так, для tcp: # sockstat | grep tcp | grep -v 127.0.0.1 | awk '{print $6}' | sort | uniq -c TCP_PORTS="1,11,15,23,79,81,111,119,540,635,1080,1524,2000,5742,6667,8080,8085" # UDP-порты для прослушивания UDP_PORTS="1,7,9,69,513,635,640,641,700"
# Верхний порт диапазона, если используется метод # Advanced Stealth Scan Detection Options - но я его не юзаю, # по причине, что снаружи можно подключаться тока к # ограниченному списку портов - поэтому слушать весь # диапазон от 1 до 1024 просто бесполезно.... ADVANCED_PORTS_TCP="1024" ADVANCED_PORTS_UDP="1024" # порты исключаемые из прослушивания при работе в Адванцед моде ADVANCED_EXCLUDE_TCP="113,139" ADVANCED_EXCLUDE_UDP="520,138,137,67"
# Список игнорируемых хостов (как бы они себя не вели, # и какие б действия не предпринимали, к ним не будут # применяться меры противодействия) IGNORE_FILE="/usr/local/etc/portsentry.ignore" # Список хостов, которые были внесены в блэклист # (история работы программы) HISTORY_FILE="/usr/local/etc/portsentry.history" # строка по которой строится имя файла куда писать # заблокированные хосты BLOCKED_FILE="/usr/local/etc/portsentry.blocked"
# резольвить IP хостов в имена, или нет. Рекомендуется не # резольвить - лишняя нагрузка на сервер... RESOLVE_HOST = "1"
# Какие телодвижения предпринимать при обнаружении сканирования: # 0 = ничё не делать - некатит, такая опция :) # 1 = заблокировать хост и запустить внешнюю команду # 2 = только запустить внешнюю команду BLOCK_UDP="1" BLOCK_TCP="1"
# команда на блокирование хоста. я использую IPFW поэтому им и блокирую. # а вообще рекомендую посмотреть пример конфига, котороый идёт с программой # там есть и другие варианы, в частностью с помощью роутинга... KILL_ROUTE="/sbin/ipfw add 2 deny all from $TARGET$:255.255.255.255 to any"
# Если поставить 1 то вначале запускается KILL_RUN_CMD а потом # уже KILL_ROUTE, ну и наоборот если 0 KILL_RUN_CMD_FIRST = "0" # Внешняя команда выполняемая при обнаружении сканирования портов, # я написал скриптик, шлющий мне письмо... KILL_RUN_CMD="/usr/script/work/scan_port_mail.sh $TARGET$ $PORT$"
# Сколько портов будет позволено отсканить прежде чем будет выполнено # действие. 0 - реагирует сразу после первого же порта, 1 - на втором, # 2 - на третьем, 3 - .... SCAN_TRIGGER="0"
# Какой `баннер` вешать на порты слушаемые PortSentry. Вообще, это делать не # рекомендуется, т.к. может разозлить нападающего... #PORT_BANNER="*** YOUR CONNECTION ATTEMPT HAS BEEN LOGGED..."
И файл со списком игнорируемых хостов и сетей - /usr/local/etc/portsentry.ignore: # Файл с игнорируемыми хостами для PortSentry # Забиваются либо хосты, либо сеть/маска # по одному на строчку.
127.0.0.1/32 0.0.0.0 192.168.20.0/24
Затем создаём директорию, где хранится указанный в конфиге скрипт /usr/local/etc/>mkdir -p /usr/script/work/ /usr/local/etc/>cd /usr/script/work/ /usr/script/work/>touch scan_port_mail.sh /usr/script/work/>chmod +x scan_port_mail.sh
Ну и пишем сам скрипт: #!/bin/sh -xv # оповещение по почте о попытках сканирования хостов
# стругаем себе письмо echo " какой-то придурок пытался сканить порты. Имя машины: ${local_mashine} Отсканеные порты: ${scanned_port}
Данные кулхацкера: IP: ${hacker_IP} DNS: ${hacker_DNS}
======= Мудак заблокирован. " | mail -s port_scanned_on_${local_mashine} ${main_e_mail}
Теперь надо в файрволле открыть снаружи порты, которые слушает PortSentry, это кусок моего файрволла: # для сканируемых портов правила. Для TCP разбиты на # две группы по причине, что ipfw не позволяет перечислять # больше 10 портов за раз. ${FwCMD} add allow tcp from any to ${IpOut} \ 1,11,15,23,79,81,111,119,540,635 via ${LanOut} ${FwCMD} add allow tcp from any to ${IpOut} \ 1080,1524,2000,5742,6667,8080,8085 via ${LanOut} ${FwCMD} add allow udp from any to ${IpOut} \ 1,7,9,69,513,635,640,641,700 via ${LanOut}
Ну и всё. Если есть возможность пробуем снаружи, если нету, то изнутри, предвартельно убрав свою сеть из списка игнорируемых (на крайний случай с локалхоста, убрав его из этого списка, и презапустив прогу), и наблюдаем в /var/log/messages такие сообщения: Feb 20 12:17:52 bsd-411 portsentry[288]: adminalert: PortSentry is now active and listening. Feb 20 12:19:02 bsd-411 portsentry[286]: attackalert: Connect from host: 192.168.20.254/192.168.20.254 to TCP port: 1 Feb 20 12:19:02 bsd-411 portsentry[286]: attackalert: Host 192.168.20.254 has been blocked via dropped route using command: "/sbin/ipfw add 1 deny all from 192.168.20.254:255.255.255.255 to any" Feb 20 12:19:02 mail2 portsentry[286]: attackalert: External command run for host: 192.168.20.254 using command: "/usr/script/work/scan_port_mail.sh 192.168.20.254 1"
Правила в файрволле так и будут висеть до перезагрузки или перезапуска файрволла. При этом если их убрать, но программу не перезапустить, то снова для этого хоста правило не добавится:Feb 20 12:19:55 bsd-411 portsentry[286]: attackalert: Connect from host: 192.168.20.254/192.168.20.254 to TCP port: 1 Feb 20 12:19:55 bsd-411 portsentry[286]: attackalert: Host: 192.168.20.254 is already blocked. Ignoring
Советую внимательно сверить списки открытых портов и слушаемых portSentry, наличие таких строкsockstat | grep "*.*" root portsent 58212 3 udp4 *:* *:*
говорит о вашей попытке повесить прослушку на занятый порт.