Мониторинг в реальном времени, IP не может быть заблокирован - PullRequest
0 голосов
/ 28 марта 2020

Я хотел бы заблокировать IP-адрес из файла журнала, IP-адреса собираются из файла access.log в apache2. IP-адреса правильно собраны в файле ips.log, но при чтении файла для запрета собранных IP-адресов блокировка не выполняется.

 #!/bin/bash

 # Store words to avoid an search for
 BADWORDS=( '/etc/passwd' 'file?' 'w00tw00t' 'fckeditor' 'ifconfig' )
 # Get number of elements in the backup_files array
 entries=${#BADWORDS[@]}

 for ((i=0; i<= entries-1; i++))
 do
 setBadWord=${BADWORDS[$i]}

 tail -F /var/log/apache2/access.log | grep --line-buffered "$setBadWord" | while read -r a; do echo "$a" | awk '{ print $1 } ' >> ips.log; done

 done # end for


while IFS= read -r ip; do
iptables -A INPUT -s "$ip" -j DROP
done < ips.log

1 Ответ

1 голос
/ 29 марта 2020

У вашего кода много проблем:

  • он запускает новую копию awk для каждой выбранной строки (awk вообще не требуется);
  • пытается запустить первый l oop несколько раз (один раз для каждого элемента "$BADWORDS")
  • первый l oop никогда не завершится (из-за tail -F), и поэтому iptables l oop никогда не запускается
  • команда iptables добавляет новое правило, даже если IP был замечен до
  • , проще написать i<entries, чем i<=entries-1, и еще проще просто используйте for setBadword in "${BADWORDS[@]}"; do ...

Если вы действительно хотите постоянно l oop читать журнал, с помощью утилит GNU вы можете сделать что-то вроде:

#!/bin/sh

log=/var/log/apache2/access.log
words=/my/list/of/badwords/one/per/line
banned=/my/list/of/already/banned/ips

tail -F "$log" |\
grep --line-buffered -Ff "$words" |\
while read ip junk; do
    grep -qxF $ip "$banned" || (
        iptables -A INPUT -s $ip -j DROP
        echo $ip >> "$banned"
    )
done

# we never get here because "tail -F" never finishes

To просто обработайте лог-файл один раз, а затем, наконец, sh, вы можете напрямую подавать grep из "$log":

grep --line-buffered -Ff "$words" "$log" | ...

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

...