
Итак, я взломал это, пока подвергался DDOS-атаке, чтобы вытащитьнепослушныйips из моих логов. У кого-нибудь есть улучшения или другие предложения, чтобы сделать его лучше?
Вот общая идея:
- вытащить IP только из файла журнала
- сортировать их
- uniq и посчитайте их
- отсортируйте их снова
И струнные:
cut --delim " " -f7 /var/log/apache_access | sort | uniq -c | sort -rn > sorted-ips.txt
решение1
Я всегда использовал это:
tail -1000 /var/log/apache_access | awk '{print $1}' | sort -nk1 | uniq -c | sort -nk1
С tail
возможностью установить предел того, насколько далеко назад я действительно хочу зайти - хорошо, если вы не используете ротацию журналов (по какой-либо причине), во-вторых, я использую awk
- поскольку большинство журналов разделены пробелами, я оставил себе возможность извлекать дополнительную информацию (возможно, какие URL они посещали, статусы, браузеры и т. д.), добавляя соответствующую $
переменную. Наконец, недостаток в uniq
нем работает только в соприкасающихся парах - IE:
A
A
A
A
B
A
A
Будет производить:
4 A
1 B
2 A
Не тот результат, который хотелось бы получить. Поэтому мы сортируем первый столбец (в данном случае ips, но мы могли бы сортировать и другие столбцы), затем uniq
их, наконец, сортируем количество по возрастанию, чтобы я мог увидеть самых больших нарушителей.
решение2
Похоже, вы находитесь в процессе переосмысленияfail2banколесо.
Взгляните на fail2ban. Он, вероятно, уже делает то, что вам нужно, а если нет, его легко настроить.
решение3
Марко Чеппи прав, говоря, awk
что это лучший инструмент для этого, но awk также является лучшим инструментом, чем sort
и uniq
поскольку эту логику можно переместить в awk
. Это не имеет большого значения, если вы просто отслеживаете 1000 строк, но если вы хотите просмотреть огромный многогигабайтный файл журнала, то переместить его в awk
.
cat /var/log/apache_access | awk '{freq[$1]++} END {for (x in freq) {print freq[x], x}}' | sort -n
сделает то, что вам нужно, но гораздо быстрее для больших файлов. Он создает массив IP в awk, используя IP-адрес в качестве ключа, а количество раз, когда IP встречается, в качестве значения.
Ускорение достигается за счет того, что awk делает один проход по данным и выполняет большую часть работы, за исключением сортировки конечного вывода. Используя другой метод, если у вас есть 1 000 000 строк в журнале передачи, awk считывает эти 1 000 000 строк, выдавая 1 000 000 IP, затем sort проходит по всем 1 000 000 IP, отправляя теперь отсортированные 1 000 000 IP в uniq, что сокращает их до гораздо меньшего объема данных перед передачей их в sort. Вместо того, чтобы пересылать/делать несколько проходов по 1 000 000 IP, awk делает почти все за один проход.
Используя журнал Apache объемом 5 513 132 строки (1,1 гигабайта) на моем ноутбуке, вот сравнение скорости:
- 2м 45с
cat ./apache_access | awk '{print $1}' | sort -nk1 | uniq -c | sort -nk1
- 0м 40с
cat ./apache_access | awk '{freq[$1]++} END {for (x in freq) {print freq[x], x}}' | sort -n