Клуб любителей научной фантастики, фэнтези и мистики

Автор Тема: Нужна помощь знатаков linux )))  (Прочитано 26762 раз)

Нужна помощь знатаков linux )))
« : Марта 21, 2010, 21:52:05 »

Hattak

  • Админ
  • Древний
  • *****
  • Сообщений: 6007
    • Просмотр профиля
    • RSFDrive.com
Уважаемые, помогите пожалуйста ...
Задача: каждые 15 мин анализировать активность на 21 порту сетевого интерфейса (карты)
и автоматически банить все ip, активность которых слишком высока ...

берём tcpdump
анализируем 1000 пакетов

tcpdump -v -n -w /var/log/tcpdump.log dst port 21 -c 1000

потом анализируем дамп

tcpdump -nr /var/log/tcpdump.log |awk '{print $3}' |grep -oE '[0-9]{1,}\.[0-9]{1,}\.[0-9]{1,}\.[0-9]{1,}' |sort |uniq -c |sort -rn

получаем список в котором количество подключений и ip ...

     94 94.41.154.251
     54 109.167.128.15
     51 109.194.238.124
     48 85.141.73.158
     42 79.139.255.104
     38 95.175.237.51
     38 93.125.17.141
     36 95.131.212.86
     36 93.157.148.44
     36 90.151.159.210
     35 109.194.90.31
     33 95.28.190.127
     32 95.221.44.199
     32 93.85.26.132
     32 87.119.232.176

этот запрос можно перенаправить в файл, ну тупо дописав в конце > /var/log/123.txt

а потом убить все скриптом

#!/bin/bash
BLOCKDB="/var/log/123.txt"
IPS=$(grep -Ev "^#" $BLOCKDB)
for i in $IPS
do
iptables -A INPUT -s $i -j DROP

так ... а теперь вот это всё нужно автоматизировать ... т.е. написать скрипт, который будет запускать дамп,
потом его анализировать и баннить сам ... каждые 15 мин ...
+ в 123.txt нужно записывать не все ip, а только те с которых число подключений привышает ну 10 скажем ...

Помогайте, нароооод!!!  


Нужна помощь знатаков linux )))
« Ответ #1 : Марта 21, 2010, 22:05:45 »

Hattak

  • Админ
  • Древний
  • *****
  • Сообщений: 6007
    • Просмотр профиля
    • RSFDrive.com
банить желательно не совсем, а только на 21 порт)))
« Последнее редактирование: Марта 21, 2010, 22:12:27 от Hattak »


Нужна помощь знатаков linux )))
« Ответ #2 : Марта 22, 2010, 01:07:26 »

Glider

  • Азгард
  • Сообщений: 412
    • Просмотр профиля
    • http://
Ммм, что-то вроде анти-хаммеринга в виндовом фтп сервере  интересно, что ответят на linuxforum.ru, там линуксоиды водятся
« Последнее редактирование: Марта 22, 2010, 01:08:28 от Glider »
Обожаю звёздные врата.

Нужна помощь знатаков linux )))
« Ответ #3 : Марта 22, 2010, 01:11:45 »

Hattak

  • Админ
  • Древний
  • *****
  • Сообщений: 6007
    • Просмотр профиля
    • RSFDrive.com
ну да, именно ... потому как убевают эти ***** vsftpd этими запросами


Нужна помощь знатаков linux )))
« Ответ #4 : Марта 22, 2010, 13:57:01 »

Capitan

  • Нокс
  • Сообщений: 107
    • Просмотр профиля
 Ну можно например так:
все это в один скрипт и засунуть и запускать по крону
#!/bin/sh - тут первая команда,тут вторая,тут содержимое того скрипта
обозвать всё это ну например:kill_pidorases.sh
положить куда нибудь, например в /usr/local/bin
и прописать в кроне в то есть в /etc/crontab
скрипт конечно сделать исполняемым. chmod +x kill_pidorases.sh
после того как прописали в кроне, перестартовать его. /etc/init.d/cron restart
чтобы он обновленный конфиг подцепил



А вообще меня тут небыло я белый и пушистый и ничего не советовал ,   а то те на кого его напустят на меня напустят толстого северного зверька  Мнето всёравно но эфир засоряет однако.

Нужна помощь знатаков linux )))
« Ответ #5 : Марта 22, 2010, 15:36:01 »

Hattak

  • Админ
  • Древний
  • *****
  • Сообщений: 6007
    • Просмотр профиля
    • RSFDrive.com
#crontab -e
*/15 * * * * /usr/sbin/anti_hammering.sh

anti_hammering.sh:

!#/bin/bash
/usr/sbin/tcpdump -v -n -w /var/log/tcpdump.log dst port 21 -c 1000
/usr/sbin/tcpdump -nr /var/log/tcpdump.log |awk '{print $3}' |grep -oE '[0-9]{1,}\.[0-9]{1,}\.[0-9]{1,}\.[0-9]{1,}' |sort |uniq -c |sort -rn  > /var/log/123.txt
BLOCKDB="/var/log/123.txt"
IPS=$(grep -Ev "^#" $BLOCKD
for i in $IPS
do
iptables -A INPUT -s $i -p tcp -m tcp --dport 21 -j DROP

это понятно))
тут проблема в том, чтобы именно на языке bash-скрипта
выделить из общего списка - 123.txt
тех, чья активность очень высокая ...
т.е.

этих вот убить надо (первое число, до пробела - число подключений)
94 94.41.154.251
54 109.167.128.15
51 109.194.238.124
48 85.141.73.158
42 79.139.255.104
38 95.175.237.51

а вот такие, которые меньше 10 раз пытались подключиться, не надо

1 95.175.237.57
5 85.141.73.160

вот вопрос в чём ... очень не хочется ещё отдельный скрипт писать на perl или php
для обработки этого 123.txt файла)


Нужна помощь знатаков linux )))
« Ответ #6 : Марта 22, 2010, 19:27:03 »

Capitan

  • Нокс
  • Сообщений: 107
    • Просмотр профиля
Это опять таки я со своими глупыми предложениями

sed или awk не пробовал?
это такие проги в униксах, можно использовать в скриптах,а может и на шелле справится там надо выделять первое число, сравнить с 10, мне писал один товарищь эт когда прога выводила список треков на двд, и чтобы стал воспроизводиться самый длинный.Но эт так к слову пришлось может кто и поумнее посоветует что.  

Нужна помощь знатаков linux )))
« Ответ #7 : Марта 22, 2010, 20:11:52 »

Hattak

  • Админ
  • Древний
  • *****
  • Сообщений: 6007
    • Просмотр профиля
    • RSFDrive.com
Цитата: Capitan
Это опять таки я со своими глупыми предложениями

sed или awk не пробовал?
это такие проги в униксах, можно использовать в скриптах,а может и на шелле справится там надо выделять первое число, сравнить с 10, мне писал один товарищь эт когда прога выводила список треков на двд, и чтобы стал воспроизводиться самый длинный.Но эт так к слову пришлось может кто и поумнее посоветует что.

ну как ты видишь, я awk и так использую)) ... awk '{print $3}' ... но я не сильно в этом шарю)) если подскажешь как имено выделить и сравнить с её помощью, буду очень благодарен)


Нужна помощь знатаков linux )))
« Ответ #8 : Марта 22, 2010, 20:26:17 »

Capitan

  • Нокс
  • Сообщений: 107
    • Просмотр профиля
выделить с помощью sed я так думаю, а сравнить вроде бы можно и в баше обрезать строку по первый пробел с помощью sed в общем если скрипту скормить вот эти строки типа 54 109.167.128.15 то в скрипте сделать скажем echo $1 то выдаст на stdout только число соединений то есть найти как в баше сравнить числа. и сравнивать $1 с нужным номером а вообще имхо на перле все это пишут понимаешь руками я это всё на автомате а вот объяснить  

ладно вот скрипту даем строку типа 54 109.167.128.15 заметь после номера соединений - пробел так что скрипт будет считать что первое число это аргумент 1 а второе - два вот как сравнение на баше

if [ $1 = 10] ; then
делаем что-то
else
а то вот так
fi

хотя не уверен это с цифрами или строками....в общем man bash

например echo $(2+3)) даст на stdout цифру 5
вот.
if (($1<100)) ; then
убиваем_юзера
fi

в общем скармливаеш скрипту весь список по одной строке ну который ты приводишь а дальше

or i in $ляляля
do то_что_я_написал $1


ну даже не знаю как объяснить

надо отрезать от строки только то что до пробела и пусть это будет переменная например $numba, а далее if (($numba<100); then как отрезать глянь sed а то получится что скрипт будет для каждой строки вызываться
« Последнее редактирование: Марта 22, 2010, 20:52:54 от Capitan »

Нужна помощь знатаков linux )))
« Ответ #9 : Марта 23, 2010, 08:29:18 »

Hattak

  • Админ
  • Древний
  • *****
  • Сообщений: 6007
    • Просмотр профиля
    • RSFDrive.com
почитал, всё оказалось щё проще)))

/usr/sbin/tcpdump -nr /var/log/tcpdump.log |awk '{print $3}' |grep -oE '[0-9]{1,}\.[0-9]{1,}\.[0-9]{1,}\.[0-9]{1,}' |sort |uniq -c |sort -rn |awk '$1>10 {print $2}' > /var/log/123.txt  


Нужна помощь знатаков linux )))
« Ответ #10 : Марта 23, 2010, 09:51:52 »

Capitan

  • Нокс
  • Сообщений: 107
    • Просмотр профиля
Цитата: Hattak
почитал, всё оказалось щё проще)))

/usr/sbin/tcpdump -nr /var/log/tcpdump.log |awk '{print $3}' |grep -oE '[0-9]{1,}\.[0-9]{1,}\.[0-9]{1,}\.[0-9]{1,}' |sort |uniq -c |sort -rn |awk '$1>10 {print $2}' > /var/log/123.txt  


Ну можно и так в конце концов как поётся в одной немецкой комедии ; Важнее всего результат.Работает и ладно.
Только нафиг нужен этот временный файл ?Не print $2 а сразу прибить $2.или print $2 && прибить $2 - для отладки, чтобы на экран выводило список смертников.Вобщем я в таких случаях пользуюсь правилом противодиверсионного спецназа ,как говорится:Мы народ простой. Предупредительный выстрел в голову и шесть контрольных в затылок и желательно переодически откапывать труп для проверки не ожил ли.  Короче лучше перебдеть чем недобдеть.
« Последнее редактирование: Марта 23, 2010, 10:33:09 от Capitan »

Нужна помощь знатаков linux )))
« Ответ #11 : Марта 23, 2010, 11:02:43 »

Hattak

  • Админ
  • Древний
  • *****
  • Сообщений: 6007
    • Просмотр профиля
    • RSFDrive.com
список мне на экране не нужен, т.к. это будет автоматически работать в кроне без меня))
тут просто рогатая задумка, этот список будет общедоступным, чтобы народ мог зайти на сайт, так как баниться будет только ftp и посмотреть не стали ли они счастливчиками) чтоб можно было провести напутственную беседу на тему, как нехорошо досить сервак и потом разбанить)))
хотя может просто отдельный список выводить по iptables -nL и всё)))
« Последнее редактирование: Марта 23, 2010, 11:03:49 от Hattak »


Нужна помощь знатаков linux )))
« Ответ #12 : Марта 23, 2010, 11:22:09 »

Capitan

  • Нокс
  • Сообщений: 107
    • Просмотр профиля
Цитата: Hattak
список мне на экране не нужен, т.к. это будет автоматически работать в кроне без меня))
тут просто рогатая задумка, этот список будет общедоступным, чтобы народ мог зайти на сайт, так как баниться будет только ftp и посмотреть не стали ли они счастливчиками) чтоб можно было провести напутственную беседу на тему, как нехорошо досить сервак и потом разбанить)))
хотя может просто отдельный список выводить по iptables -nL и всё)))

ок тогда гаси тему раз решена