Я хочу обрабатывать все пакеты с их размером, проходящие через наш сервер шлюза (под управлением Debian 4.0).
Я хотел бы использовать tcpdump, но у меня есть два вопроса.
Команда, о которой я сейчас думаю, это tcpdump -i iface -n -t -q
.
IP ddd.ddd.ddd.ddd.port > ddd.ddd.ddd.ddd.port: tcp 1260
. Что такое 1260? У меня есть подозрение, что это полезная нагрузка в байтах пакета, что было бы именно тем, что мне нужно, но я не уверен. Это может быть размер окна TCP.Или, может быть, есть еще лучший способ сделать это? Я думал о правиле LOG в iptables, но tcpdump кажется проще, и я не знаю, может ли iptables регистрировать длину пакетов.
Теперь это реализовано в IpTables. Используя отдельную цепочку для каждого сегмента сети, у меня есть что-то вроде дерева с глубиной 3.
У машины высокая мягкая нагрузка прерывания, особенно вечером (когда большинство наших пользователей онлайн), но до сих пор это было приемлемо.
Спасибо за ваш вклад.
tcpdump не гарантирует обработку всех пакетов. Есть некоторая буферизация, но если скорость пакетов, проходящих через сетевой интерфейс, выше, чем скорость, с которой ваш процессор может запускать их через tcpdump, ядро начинает отбрасывать пакеты. Чем выше нагрузка на ЦП и чем выше скорость сетевого трафика, тем выше склонность к падению (конкретизировать невозможно, вам придется протестировать это на своих системах, чтобы узнать, где находится порог отбрасывания).
Навскидку, не знаю.
Что касается лучших способов, вам нужен термин «учет трафика». Он встроен в IPTables, поэтому любой современный дистрибутив Linux должен поддерживать его «из коробки». Короче говоря, несколько простых «сквозных» правил IPTables могут дать вам общее количество переданных байтов в реальном времени практически для любых указанных типов трафика (с разбивкой по протоколам, портам, IP и т. Д.), Которые вы хотеть.
Здесь есть отличное пошаговое руководство с конкретными командами: http://www.catonmat.net/blog/traffic-accounting-with-iptables
Он должен быть намного более легким и надежным, чем tcpdump, поскольку Netfilter обрабатывает его полностью в ядре, и ядро в любом случае имеет информацию о длине пакета.
Я думаю, вам следует пояснить, что вы подразумеваете под «всеми пакетами с указанием их размера, проходящими через наш шлюз». Вам просто нужны счетчики общего IP трафика? Примерно 5678898 байт прошло через маршрутизатор за последний час. В этом случае вы можете просто настроить пару правил iptables и использовать их счетчики. Или вам нужно видеть размер каждого пакета?
Если вам нужен учет интенсивного трафика, обратите внимание на проекты NeTraMet или pmacct.
Чтобы завершить отличный ответ Райана Б. Линча:
192.168.2.1.38528 > 192.168.2.25.22: P 1649:2241(592) ack...
-e
может быть полезным, потому что он печатает характеристики заголовка канального уровня (уровень 2), включая длину пакета (по крайней мере, в Ethernet). 19:12:32.238240 00:1c:23:00:6b:7f > 00:1e:8c:76:29:b6, ethertype IPv4 (0x0800), length 66: 192.168.2.25.22 > 192.168.2.1.58759: . ack 2369...