Правила форума Гаранты форума
Размещение рекламы AMX-X компилятор

Здравствуйте, гость Вход | Регистрация

Наши новости:

14-дек
24-апр
10-апр
11-апр

Хорошая утилита tcpdump

, Небольшой мануал по выборке флудящих IP
Статус пользователя Fire
сообщение 10.2.2013, 23:35
Сообщение #1


Иконка группы

Стаж: 15 лет

Сообщений: 2201
Благодарностей: 2227
Полезность: 963

Собсно, многие наверное знают, что в лине есть замечательная штука, под названием tcpdump, но не многие хорошо с ней знакомы. Тут я приведу пример, как вычислить IP адреса, с которых идет большое кол. пакетов, т.е флуд, и т.д.
Чтобы вычислить плохие IP, я опишу действия в несколько шагов. Начнем, пожалуй.
Код
tcpdump -v -n -w badips.log dst port 27015 -c 300

Тут все просто:
-v - самый простой уровень логирования (чем больше v, тем более высокий уровень логирование, например -vvv, но в данном примере, нам это не требуется.)
-n - преобразование имени хоста в IP
-w - запись дампа в файл
-с - кол. захваченных пакетов
Если у вас на сервере, несколько IP, добавляем еще ключ -i с именем интерфейса, на котором нужный IP, т.е -i eth0; -i eth1:2
Пример:
Код
tcpdump -v -n -i eth0 -w badips.log dst port 27015 -c 300


Теперь, нам надо как-то из дампа вычислить плохие IP, для этого, используем слелующую комбинацию:
Код
tcpdump -nr badips.log |awk '{print $3}' |grep -oE '[0-9]{1,}\.[0-9]{1,}\.[0-9]{1,}\.[0-9]{1,}' |sort |uniq -c |sort -rn

Тут думаю особо объяснять не надо, что к чему.
-r - чтение файлов.
awk - вывод 3 значения в строке.
grep - вывод только IP
sort - сортировка
uniq - тут подробнее, вобще, команда выводит только уникальные значения из списка, с ключем -с - вывод с кол. упоминаний значения.

В итоге, мы получаем список из 2ух столбцов, в 1ом - кол. пакетов, в 2ом - IP
Пример:
Код
     29 95.83.141.243
     28 176.14.130.210
     27 95.71.31.91
     20 188.94.158.100
     18 5.35.52.46
     17 91.202.199.129
     17 194.12.74.241
     16 31.148.45.19
     13 213.88.6.85
     10 188.134.33.150

Дальше уже смотрим, есть ли плохие IP, и будем ли мы их банить.
По собственному опыту, скажу, норма ниже 100 пакетов. Кстати, кол. пакетов значительно отличается, если игрок со стимом или без.

Завтра напишу пример, как из полученного списка, выбирать IP c большим кол. пакетов.


Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 21 раз
   Цитировать сообщение
Статус пользователя 3aB}{o3
сообщение 11.2.2013, 0:30
Сообщение #2


Стаж: 16 лет

Сообщений: 2145
Благодарностей: 825
Полезность: 521

Fire, Не подскажите что за ошибка и как исправить ?
Код
tcpdump: WARNING: arptype 65535 not supported by libpcap - falling back to cooked socket
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
cs-portal
сообщение 11.2.2013, 0:37
Сообщение #3
Стаж: 14 лет

Сообщений: 8181
Благодарностей: 2709
Полезность: 0

Скрытый текст
у меня валялась под винду чтото
http://rghost.ru/43708652
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя 3aB}{o3
сообщение 11.2.2013, 0:41
Сообщение #4


Стаж: 16 лет

Сообщений: 2145
Благодарностей: 825
Полезность: 521

Посмотрел порт 27015 :
Цитата
125 80.237.79.135
70 46.63.201.112
61 213.87.135.63
42 93.171.192.157
1 95.83.135.21
1 178.123.184.137

Игрок 80.237.79.135 в тот момент на сервере присутствовал и соответственно и отсылал 125 пакетов, возникло пару вопросов :
1. Насколько это вредит игровому серверу и каналу в целом ?
2. И можно как-то это ограничить, запретить отсылать более 100 пакетов

Написал возможно хрень в вопросах, прошу простить, за возможную тупость.

Отредактировал: 3aB}{o3, - 11.2.2013, 0:42
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
cs-portal
сообщение 11.2.2013, 0:50
Сообщение #5
Стаж: 14 лет

Сообщений: 8181
Благодарностей: 2709
Полезность: 0

запретить то можно только потом игрок отхавает choke / loss скорее всего. разве рейты и их ограничение не должны уменьшить обмен пакетами ?
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 1 раз
   + Цитировать сообщение
Статус пользователя Fire
сообщение 11.2.2013, 0:55
Сообщение #6


Иконка группы

Стаж: 15 лет

Сообщений: 2201
Благодарностей: 2227
Полезность: 963

Мои слова про 100 не нужно принимать за эталон. Каждый должен иметь свою голову на плечах и смотреть, прежде чем принимать какие-либо действия.
В любом случае, кол. пакетов зависит от настроек сервера, и ряда других вещей. Но при флуде, кол. пакетов с флудящих IP будет существенно выше, чем с валидных.


Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 1 раз
   + Цитировать сообщение
Статус пользователя нуб2
сообщение 11.2.2013, 10:33
Сообщение #7


Стаж: 12 лет

Сообщений: 2367
Благодарностей: 1209
Полезность: 1014

Хотел прикрепить сверху, но прав не хватает =(
ТС молодец...ну собственно как и всегда)
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя Fire
сообщение 13.2.2013, 22:46
Сообщение #8


Иконка группы

Стаж: 15 лет

Сообщений: 2201
Благодарностей: 2227
Полезность: 963

Собственно, небольшое дополнение.
Есть еще одна замечательная утилита - awk - утилита построчного разбора и обработки входящих потоков по заданным шаблонам.
Считается прородителем perl'a

Приступим.
В прошлой части, мы остановились на строке:
Код
tcpdump -nr badips.log |awk '{print $3}' |grep -oE '[0-9]{1,}\.[0-9]{1,}\.[0-9]{1,}\.[0-9]{1,}' |sort |uniq -c |sort -rn

Которая выводит кол. пакетов и IP.
Сегодня, мы немного автоматизируем это действие с помощью awk
Пример скрипта:
Код
tcpdump -nr badips.log |awk '{print $3}' |grep -oE '[0-9]{1,}\.[0-9]{1,}\.[0-9]{1,}\.[0-9]{1,}' |sort |uniq -c |sort -rn | awk '{if ($1 > 70) print ($2)}'

Разберем:
if ($1 > 70) - условие, выбирать те строки, где $1 (первое значение из входящего списка) больше 20.
print $2 - уже вывод второго значения из входящего списка после обработки условия.
т.е мы выводим IP-адреса, с которых было более 70 пакетов. В качестве вывода, получится простой список IP в строку:
Код
95.83.141.243
176.14.130.210
95.71.31.91
188.94.158.100


Далее, уже делаем что нам надо.
Можно сразу банить IP-ы, тогда строка будет выглядеть так:
Код
tcpdump -nr badips.log |awk '{print $3}' |grep -oE '[0-9]{1,}\.[0-9]{1,}\.[0-9]{1,}\.[0-9]{1,}' |sort |uniq -c |sort -rn | awk '{if ($1 > 120) print ("iptables -A INPUT -s "$2" -j DROP")}'

Получаем такой вот список:
Код
iptables -A INPUT -s 95.83.141.243 -j DROP
iptables -A INPUT -s 176.14.130.210 -j DROP
iptables -A INPUT -s 95.71.31.91 -j DROP

Но!, это только список, для выполнения этих команд, в строку нужно добавить |sh
т.е команда будет выглядеть уже так:
Код
tcpdump -nr badips.log |awk '{print $3}' |grep -oE '[0-9]{1,}\.[0-9]{1,}\.[0-9]{1,}\.[0-9]{1,}' |sort |uniq -c |sort -rn | awk '{if ($1 > 120) print ("iptables -A INPUT -s "$2" -j DROP")}' |sh

Обратите внимание, блокироватся будут IP у которых более 120 пакетов, на даный момент, считаю это оптимальным значением, но пять-же, зависит от ряда факторов.

И еще, советую не загаживать чепочку INPUT, посему, создадим отдельную цепочку, например hlban
Код
#Создаем цепочку фаервола в которую заносятся IP
iptables -N hlban
#Делаем ссылку на цепочку hlban
iptables -A INPUT -j hlban


Ну и модифицируем наш скрипт:
Код
tcpdump -nr badips.log |awk '{print $3}' |grep -oE '[0-9]{1,}\.[0-9]{1,}\.[0-9]{1,}\.[0-9]{1,}' |sort |uniq -c |sort -rn | awk '{if ($1 > 120) print ("iptables -A hlban -s "$2" -j DROP")}' |sh


Смотреть список забаненных можно так:
Код
iptables -n -L hlban

Кол. забаенных:
Код
iptables -n -L hlban | wc -l

Разбан IP'a:
Код
iptables -D hlban -s IP -j DROP

Очистка цепочки:
Код
iptables -F ban


to be continued...

Отредактировал: Fire, - 13.2.2013, 22:48


Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 9 раз
   + Цитировать сообщение
Статус пользователя apTmusic
сообщение 15.5.2013, 19:46
Сообщение #9


Стаж: 12 лет

Сообщений: 419
Благодарностей: 126
Полезность: 232

а можно аналог под виндовс?
пробовал windump, вроде тоже что и это
но например
windump -v -n -w badips.log dst port 27015 -c 300
пишет неправильный синтаксис, убираю -с 300 все ок.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
cs-portal
сообщение 15.5.2013, 20:09
Сообщение #10
Стаж: 14 лет

Сообщений: 8181
Благодарностей: 2709
Полезность: 0

я пользуюсь tcpdump.exe
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 1 раз
   + Цитировать сообщение
Статус пользователя Fire
сообщение 17.8.2013, 20:41
Сообщение #11


Иконка группы

Стаж: 15 лет

Сообщений: 2201
Благодарностей: 2227
Полезность: 963

Решил немного дополнить тему. Сегодня расскажу как снимать не определенное кол. пакетов tcpdump'om, а сделать дамп определенного периода времени. Так-как сам tcpdump такого не умеет, мы будем использовать утилитку timeout, она есть во всех дистрибутивах и установлена по дефолту.
Что-бы сделать 5 секундный дамп, убираем счетчик пакетов -c N
Команда будет выглядеть так:
Код
timeout 5s tcpdump -v -n -i eth0 -w badips.log dst port 27015

Далее уже смотрим дамп:
Код
tcpdump -nr badips.log |awk '{print $3}' |grep -oE '[0-9]{1,}\.[0-9]{1,}\.[0-9]{1,}\.[0-9]{1,}' |sort |uniq -c |sort -rn


Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 3 раз
   + Цитировать сообщение
Статус пользователя MisTerEnDru
сообщение 21.11.2015, 21:31
Сообщение #12


Стаж: 13 лет

Сообщений: 72
Благодарностей: 2
Полезность: 26

И как запустить в линуксе, в консоле или сделать что то вроде skript.sh ?
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
  Ответить в данную темуНачать новую тему
 
0 пользователей и 1 гостей читают эту тему: