Я хочу отфильтровать и заблокировать неудачные попытки доступа к моему серверу proftp. Вот пример строки из файла / var / log / secure:
Jan 2 18:38:25 server1 proftpd[17847]: spy1.XYZ.com (93.218.93.95[93.218.93.95]) - Maximum login attempts (3) exceeded
Таких строк несколько. Я хотел бы дважды заблокировать подобные попытки с любого IP-адреса. Вот сценарий, который я пытаюсь запустить, чтобы заблокировать эти IP-адреса.
tail -1000 /var/log/secure | awk '/proftpd/ && /Maximum login/ { if (/attempts/) try[$7]++; else try[$11]++; }
END { for (h in try) if (try[h] > 4) print h; }' |
while read ip
do
/sbin/iptables -L -n | grep $ip > /dev/null
if [ $? -eq 0 ] ; then
# echo "already denied ip: [$ip]" ;
true
else
logger -p authpriv.notice "*** Blocking ProFTPD attempt from: $ip"
/sbin/iptables -I INPUT -s $ip -j DROP
fi
done
как я могу выбрать IP с помощью "awk". текущим скриптом он полностью выбирает эту строку "(93.218.93.95 [93.218.93.95])". Но я хочу выбрать только IP.
Вы также можете посмотреть что-то вроде Fail2Ban, в котором есть примеры настроек для ProFTPd.
tail -1000 /var/log/secure | awk '/proftpd/ && /Maximum login attempts/' | awk -F "[][]" '{print $(NF-1)}' |
while read ip
do
# note: check if IP is already blocked...
/sbin/iptables -L -n | grep $ip > /dev/null
if [ $? -eq 0 ] ; then
# echo "already denied ip: [$ip]" ;
true
else
# echo "Subject: denying ip: $ip" | /usr/sbin/sendmail pager@xyz.com
logger -p authpriv.notice "*** Blocking ProFTPD attempt from: $ip"
/sbin/iptables -I INPUT -s $ip -j DROP
fi
done
Если вы используете GNU awk (gawk
) вы можете использовать регулярное выражение для разделителя полей.
$ echo 'Jan 2 18:38:25 server1 proftpd[17847]: spy1.XYZ.com (93.218.93.95[93.218.93.95]) - Maximum login attempts (3) exceeded' \
| awk -F'\\[|]' '{print $4}'
93.218.93.95