Назад | Перейти на главную страницу

Сценарий оболочки для блокировки неудачной попытки proftpd

Я хочу отфильтровать и заблокировать неудачные попытки доступа к моему серверу 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