Вопрос или проблема
В ifconfig я могу видеть количество отправленных/полученных пакетов с значениями tx/rx. С этим интерфейсом в режиме прослушивания, если я включу tcpdump на этом интерфейсе, я должен видеть все пакеты, отправляемые/получаемые на этом интерфейсе, правильно?
Используя:
tcpdump -XX -e -n -s0 -i <iface>
(В опциях может быть избыточность :p)
Тем не менее, я не вижу все отправленные пакеты. Есть идеи?
ИЗМЕНЕНИЕ: также я прочитал руководство по ifconfig, и там говорится:
“Ifconfig используется для настройки сетевых интерфейсов, находящихся в ядре.”
Так что, ifconfig считывает tx/rx на уровне ядра, верно? Есть ли способ получить эти данные на уровне драйвера?
ИЗМЕНЕНИЕ2: также можно ли запрограммировать драйвер на отправку пакетов как в ядро, так и в запущенную программу?
ИЗМЕНЕНИЕ3: могу ли я создать программу, чтобы захватывать ЛЮБЫЕ байты, проходящие по интерфейсу, независимо от их формата? Возможно, tcpdump не показывает мне пакеты, потому что не может воспринять их формат.
Попробуйте проверить, не блокирует ли iptables трафик. Используйте iptables –list, чтобы увидеть и /etc/init.d/iptables stop, чтобы отключить все правила.
tcpdump
получает копии пакетов из верхней части сетевого стека — приблизительно там, где они проходят от драйвера к ядру. (источник там. Идите посмотрите.) Я не знаю, какие статистики tx/rx вы смотрите, или какой конкретный драйвер для вашего сетевого адаптера, поэтому не могу сказать, откуда они пришли. ethtool
может запрашивать данные непосредственно от драйвера, если это поддерживается. (и включает статистику, которую ядро не отслеживает.)
Ответ или решение
Если вы наблюдаете пакеты в выводе ifconfig
, но не видите их с помощью tcpdump
, это может быть связано с несколькими факторами, которые требуют внимательного анализа. Давайте рассмотрим основные причины и возможные решения данной проблемы.
1. Понимание разницы между ifconfig
и tcpdump
ifconfig
показывает статистику передачи и получения пакетов на сетевом интерфейсе, используя данные, полученные от ядра операционной системы. Эти данные представляют собой общее количество пакетов, обработанных на уровне ядра, и могут включать, например, шаблонные пакеты, которые не проходят через стек TCP/IP. В отличие от этого, tcpdump
захватывает пакеты на более высоком уровне, когда они начинают передаваться в более жестком смысле, и фильтрует их на основе заданных параметров.
2. Проблемы с фильтрацией и конфигурацией
-
iptables: Проверьте, не блокирует ли
iptables
трафик. Используйте командуiptables --list
, чтобы просмотреть существующие правила. Если вы подозреваете, чтоiptables
может быть причиной, попробуйте временно отключить его с помощьюsudo /etc/init.d/iptables stop
. -
Фильтры tcpdump: Возможно, ваши параметры
tcpdump
не охватывают все виды трафика, которые вы ожидаете увидеть. Например, если вы используете фильтры по IP-адресам или портам, убедитесь, что они позволяют видеть весь интересующий вас трафик.
3. Проблемы с драйвером и аппаратным обеспечением
-
Промискуитетный режим: Убедитесь, что интерфейс действительно находится в промискуитетном режиме. Это можно проверить, выполнив команду
ip link set <iface> promisc on
. Без этого режима обходят только адреса, которые напрямую ориентированы на интерфейс, и вы не сможете увидеть прочие пакеты. -
Текущая статистика драйвера: Для получения более глубокого уровня статистики, прямых от драйвера, используйте утилиту
ethtool
с командойethtool -S <iface>
. Это даст вам доступ к более подробной информации о производительности сетевой карты и передаче пакетов.
4. Программирование на уровне драйвера
-
Доступ к сырым пакетам: Вы правы в том, что можно разработать собственную программу для захвата любых байтов, проходящих через интерфейс, используя
raw sockets
в Linux. Это позволит вам перехватывать пакеты до того, как они дойдут до слоя TCP/IP. Однако это требует значительных усилий в разработке и тестировании. -
Вывод данных драйвера: Драйвер может быть запрограммирован для отправки пакетов не только в ядро, но и в пользовательское пространство. Это возможно через использование функционала, как Netlink-сокеты, который предоставляет API для различных взаимодействий между ядром и пользовательским пространством.
Заключение
Решение проблемы, когда пакеты видны в ifconfig
, но недоступны для tcpdump
, требует комплексного подхода. Убедитесь, что конфигурация интерфейса корректна и соответствует вашим требованиям. Проверка правил iptables
, настройка промискуитетного режима и использование инструментов, таких как ethtool
, помогут вам глубже понять природу проблемы. Если требуется более детальный анализ на уровне драйвера, возможно, придется разработать собственное приложение, способное захватывать любые байты.
Надеюсь, эта информация была полезной и ответила на ваши вопросы.