интерфейс Ethernet в Linux отбрасывает пакеты

1046
GNA

Я пытаюсь захватить некоторые кадры Ethernet с Linux. Некоторые из этих пакетов / кадров являются недействительными и содержат поврежденные данные.

Например, кадр Ethernet содержит тип 0x0800, который является IPv4, но следующие данные содержат только случайные байты. Кроме того, MAC-адрес источника и получателя неизвестен и не предсказуем.

Чтобы получить эти кадры, я написал программу на C, которая сначала использовала необработанные сокеты. Это не сработало, как ожидалось, поэтому я перешел на libpcap.

Я открываю устройство Ethernet в случайном режиме, чтобы получить все кадры и предотвратить фильтрацию по MAC-адресу. Это работает просто отлично. Я могу получать кадры с любым MAC-адресом назначения.

Теперь мы подошли к большой проблеме:

Я отправляю кадр Ethernet со случайным назначением и исходным MAC-адресом. поле Тип - 0x1234, а данные - всего несколько байтов, скажем, 0xdeadbeef. Это дополняется до минимального количества полезной нагрузки. Этот кадр получен моей программой, использующей libpcap просто отлично.

Когда я отправляю тот же кадр, используя «известное» значение поля типа Ethernet, например 0x0800, кадр сбрасывается, и моя программа не может его получить.

Программное обеспечение работает на встроенной платформе, Altera Cyclone V SoC с модулем Ethernet STMMAC. На обычном ПК / ноутбуке и т. Д. Программа работает нормально и может даже получать эти недопустимые кадры IPv4.

Чтобы узнать, куда сбрасываются пакеты, я посмотрел /sy/class/net/eth0/statistics/rx_*файлы. Есть файлы, которые подсчитывают количество полученных пакетов и байтов, а также количество отброшенных пакетов. эти статистические данные работают нормально с обычным трафиком Ethernet. Однако отправка неверного кадра, как описано выше, не приводит к каким-либо изменениям статистики. Водитель даже не считает счетчик пропущенных кадров. Я не могу этого понять, потому что, насколько я знаю, статистика сетевого интерфейса затрагивается, как только аппарат получает пакет. Процесс фильтрации и оценки сетевого стека не должен иметь к этому никакого отношения. Я прав? Поэтому мне кажется, что какой-то действительно низкий код драйвера фильтрует эти пакеты или, может быть, даже само оборудование.

Опять же: с обычным ПК на другой стороне пакеты могут быть получены с помощью программы, которую я написал.

Вторая проблема связана с действительными пакетами TCP:

Хотя я использую libpcap, который предоставляет мне необработанный трафик, полученные TCP-пакеты повторно собираются в огромные пакеты, которые даже больше, чем MTU принимающего сетевого интерфейса. эти пакеты также обычно принимаются с ПК.

Может кто-нибудь мне помочь? Мне нужно получать сырой Ethernet-трафик "как есть", используя Linux на платформе Altera SoC-FPGA.

0
Вы пытались использовать `wireshark` (который также использует` libpcap`)? Это пропускает / неправильно читает кадры? Если это так, возможно, ваше оборудование не соответствует задаче. AFH 8 лет назад 0
Извините, я не могу помочь на этом уровне. В прошлом я занимался программированием TCP и использовал подобные «wireshark» для мониторинга трафика TCP / UDP, но мне не приходилось сталкиваться с такой проблемой. Я надеюсь, что кто-то еще может помочь. AFH 8 лет назад 0
Пока не знаю, но в ядрах Linux раньше была возможность собирать фрагменты пакетов в целые пакеты перед их передачей. Избегать атак типа «пинг-смерт» и других атак, основанных на фрагментации. Возможно, ваши случайные данные выглядят как фрагменты этого кода, и ядро ​​пытается собрать все это вместе перед обработкой пакета. infixed 8 лет назад 0
Я проверил это. Проблема в том, что пакет даже не достигает сетевого стека ядра. Даже аппаратный драйвер низкого уровня не видит этот пакет. Я понятия не имею, почему это фильтруется. Как я писал выше: сетевая статистика (количество rx и т. Д.) Не меняется, хотя это должно быть сделано, как только пакет получен, перед любыми другими проверками. GNA 8 лет назад 0

0 ответов на вопрос

Похожие вопросы