#!/bin/sh
#Подсмотрен алгоритм чтения из файла с сайта:
#http://forum.lissyara.su/viewtopic.php?f=32&t=9551#p79072
#######################################################
DIR="/var/log" # Директория файла auth.log
# ###############################
TMP="_tmp.log" # Временный файл
RLS="ssh_ipfw" # Файл с правилами для ipfw
# ###############################
FWN="4" # Номер правила
SIP="xx.xxx.xxx.xx" # IP-адрес сервера
SIF="tun0" # Интерфейс сервера
# ###############################
MAX="5" # Макс. отвергнутых подключений
#######################################################
# Читаем auth.log, делая выборку по слову Invalid, выбирая 10-ый
# столбец собираем уникальные адреса с подсчётом количества
# повторений адрессов в лог-файле.
cat $DIR/auth.log | grep Invalid | awk '{ print $10 }' | uniq -c |
{
# Получаем в потоке виртуальный массив с двумя колонками, где
# 1 столбец - кол-во повторений ip-адреса в файле
# 2 столбец - сам ip
while read i
do
COUNT=`echo $i | awk '{ print $1 }'`
ADDRS=`echo $i | awk '{ print $2 }'`
# Если количество повторений определённого ip-адреса больше дано в $MAX,
# то создаём правило deny с этим ip-адресом и заносим во временный файл
if [ $COUNT -ge $MAX ]
then
echo "/sbin/ipfw add $FWN deny ip from $ADDRS to $SIP in via $SIF" >> $RLS
fi
done
}
# Выкинем из правил повторения...
cat $RLS | sort -u > $TMP && mv $TMP $RLS
# Удаляем уже имеющиеся правила в фаирволе
# чтобы не задваивать и не разводить грязь
/sbin/ipfw delete $FWN > /dev/null 2>&1
# Выставляем права на файл с правилами и
# заносим правила в фаирвол
chmod 744 $RLS && ./$RLS > /dev/null 2>&1
# Осталось добавать в cron запускать этот скрипт приблизительно
# раз в полчаса и спокойно идти пить кофе...
# crontab -e
# 0/10 * * * * /home/ddr/scripts/parsing.sh
# wq