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

linux: как получить статистику трафика

У меня мост на базе linux. Я хотел бы подсчитать, сколько трафика генерирует каждый проходящий IP. Другими словами, я бы хотел получить такой файл:

src_IP  dst_IP  pkt_size
1.1.1.1 2.2.2.2 12304
3.3.3.3 4.4.4.4 430
....

Есть ли инструмент для этого под linux?

Я произвел поиск по ulog, но оба проекта «демона бухгалтерского учета», похоже, заброшены (их веб-страницы не работают). Захват трафика с помощью tcpdump и последующий анализ дампа может быть вариантом, однако я не вижу, как я могу получить размер пакета из дампа.

Пожалуйста, дайте мне знать, если есть способ сделать это.

В заголовке IP у вас есть заголовок TOTAL LENGTH, который содержит «длину дейтаграммы, измеренную в октетах, включая интернет-заголовок и данные». (RFC 791). Если вы хотите иметь только размер полезной нагрузки пакета, вам нужно сделать ОБЩУЮ ДЛИНУ минус (длина заголовка IP + длина заголовка (TCP | UDP)). (Длина IP-заголовка указана в заголовке IHL, длина заголовка TCP указана в заголовке смещения данных).

С помощью базовой команды tcpdump, например

# tcpdump -s 1500 -Svni eth0 tcp and port 80

Я покажу каждый TCP-пакет следующим образом

11: 58: 52.114411 IP (tos 0x0, ttl 53, id 5745, смещение 0, флаги [DF], протокол TCP (6), длина 505)

12.66.33.88.53247 > 88.231.98.32.80: Flags [P.], cksum 0x62fd (correct), seq 1193308573:1193309026, ack 2122411067, win 46, options [nop,nop,TS val 122841090 ecr 125780554], length 453

Первая строка содержит заголовок IP, включая общую длину (длина 505). Вторая строка содержит заголовок tcp, включая длину полезной нагрузки (длина 453), которая составляет 505–52 (52 - длина заголовков IP + TCP).

Если вы хотите автоматизировать это, вы можете настроить tcpdump для сохранения захвата в файле pcap, а затем проанализировать pcap с помощью сценария.

Однако, если вы хотите сделать это быстро, не снижая производительности, вам следует взглянуть на libnetfilter_queue. Для этого потребуется немного кода на C, но на самом деле не так много. Идея состоит в том, что вы помещаете ловушку в netfilter, чтобы направлять трафик в вашу программу. Оттуда вы можете анализировать заголовки ip | tcp | udp и вычислять вашу информацию, помещать ее в базу данных RRD, если хотите, и повторно вводить трафик в netfilter.

Прежде всего, давайте начнем с упоминания инструмента, с помощью которого вы можете просматривать эти данные в реальном времени: iftop

Во-вторых, я думаю, что важно упомянуть, что навязчивый захват и анализ пакетов, такой как tcpdump, скажется на вашем интерфейсе и вычислительных ресурсах. Если вы не настроите отдельную систему, которая слепо наблюдает за трафиком на проводе, не касаясь его, например snort, вы получите удар. Никогда не забывайте об этом, иначе у вас будет сеть с ограниченными возможностями, и когда нагрузка возрастет, люди будут удивляться, почему это отстой!


(Изменить: закончить с того места, где я остановился)

Наконец, если вам действительно нужно постоянное решение для ведения журнала, вам понадобится что-то, что анализирует и регистрирует эти пакетные данные. Для этого есть много инструментов, но я не использовал их в последнее время. ngrep раньше было хорошим способом сделать это, bmon но я не знаю, существует ли это вообще. tcpdstat похоже, это может быть вариант, как и bandwidth хотя это может сделать БОЛЬШЕ, чем вы хотите.