Как отправлять пакеты размером более 1500 байт с помощью pcap_sendpacket?

Собственно, у меня есть два связанных вопроса.

Я собираю отфильтрованный сетевой трафик с помощью libpcap в Debian. Затем мне нужно воспроизвести этот трафик на сервере Win2k3. Иногда я захватываю пакеты TCP и UDP, размер которых намного превышает 1500 байт (размер MTU по умолчанию для Ethernet). Например, 2000+ байт. Я не делал особых изменений размера MTU в этом Linux. Итак, вопрос №1:

В чем причина того, что эти пакеты намного превышают MTU по умолчанию? Jumbo-кадры? В этой статье в Википедии говорится, что «сетевым интерфейсным картам, поддерживающим jumbo-фреймы, требуется явная конфигурация для использования jumbo-фреймов», но мне ничего не известно о такой конфигурации. Также ifconfig показывает мне «MTU: 1500». Может ли это быть как-то связано с техникой «объединения прерываний» (или «объединением прерываний», как в этой статье)? Могу ли я подавить такие пакеты?

Затем вопрос №2:

Как я могу отправить такие пакеты с помощью pcap_sendpacket в Windows? Я получаю сообщение об ошибке «ошибка отправки: сбой PacketSendPacket» только для пакетов размером более 1500 байт. Кажется, я не могу использовать jumbo-кадры, потому что я отправляю данные непосредственно подключенному пользовательскому «сетевому крану», например, карте pci, и я не уверен, что смогу настроить его NIC. Что еще? Следует ли фрагментировать эти пакеты в соответствии с правилами протокола?

РЕДАКТИРОВАТЬ:

Проверил фрагментацию NIC, как предложил Гай Харрис:

~# ethtool -k eth0
Offload parameters for eth0:
rx-checksumming: on
tx-checksumming: on
scatter-gather: on
tcp-segmentation-offload: off
udp-fragmentation-offload: off
generic-segmentation-offload: off
generic-receive-offload: off
large-receive-offload: off
ntuple-filters: off
receive-hashing: off

То же самое для eth1 и br0 - сетевой мост между eth0 и eth1, который я нюхаю.

И я все еще получаю большие UDP-пакеты.


person Andriy Tylychko    schedule 13.02.2012    source источник
comment
pcap, вероятно, склеивает фрагментированные дейтаграммы обратно в один кусок из проводных пакетов для вас. Проверьте, можете ли вы попросить его предоставить вам кадры Ethernet, а не транспортные пакеты.   -  person Nikolai Fetissov    schedule 13.02.2012
comment
@NikolaiNFetissov: Я получаю Ethernet-фреймы   -  person Andriy Tylychko    schedule 14.02.2012


Ответы (2)


¿Используете ли вы wirehark для захвата?

Это важно, потому что по умолчанию wirehark повторно собирает фрагментированные IP-дейтаграммы (и сохраняет их в файле pcap как повторно собранные отдельные пакеты MTU-Higger без фрагментации). Отключить:

Правка-> настройки-> Протоколы-> ipV4-> и снимите флажок «Повторная сборка фрагментированных дейтаграмм IPv4».

person Jon Ander Ortiz Durántez    schedule 23.02.2012
comment
Захватываю libpcap (ядро Wireshark). Есть информация, как отключить это в libpcap? - person Andriy Tylychko; 23.02.2012
comment
Libpcap не имеет этой функции сама по себе, если используемый вами пакет не применяет этот патч - ›seclists.org / tcpdump / 2007 / q2 / 112 Вы можете проверить свою версию libpcap или загрузить официальную вместо той, которая предоставляется дистрибутивом (иногда они применяют странные патчи ...) - person Jon Ander Ortiz Durántez; 23.02.2012
comment
+1. tnx для информации, я построил последнюю версию libpcap из исходников, теперь я вижу только пакеты немного большего размера, чем MTU, 1518 байт. Кажется из-за трейлера Ethernet. Но я все еще не могу отправить эти пакеты до pcap_sendpacket. Должен ли я изменить их, удалив этот трейлер? - person Andriy Tylychko; 24.02.2012
comment
Ничего страшного. Мне нужно было бы кое-что побольше объяснить :). Это не трейлер Ethernet, он появляется только тогда, когда размер пакета меньше 64 байтов (например, ARP), и поскольку минимальный размер кадра Ethernet равен 64, он заполняет остальную часть пакета трейлером (но только когда пакет меньше) . Но, очевидно, это не ваш случай, 18 дополнительных байтов - это не заполнение. MTU - это не максимальный кадр Ethernet, это максимальный размер DATAGRAM [packetlife .net / blog / 2008 / nov / 5 / mtu-манипуляция /]. - person Jon Ander Ortiz Durántez; 24.02.2012
comment
[ПРИХОДИТ ИЗ ПОСЛЕДНЕГО КОММЕНТАРИЯ] Таким образом, во фрагментированных пакетах, если MTU равен 1500 (1460 полезных данных + 20 TCP hdr + 20 IP hdr), вы должны добавить 14 байтов заголовка Ethernet или 18, если у вас есть VLAN (802.1Q ) в кадрах Ethernet = 1518 байт. Вот почему у вас есть такие пакеты. Проблема pcap_sendpacket ... :) это может быть ошибка при расчете максимального размера (размер заголовка Ethernet не следует учитывать). - person Jon Ander Ortiz Durántez; 24.02.2012

Ваш сетевой адаптер, вероятно, выполняет разгрузку сегментации / десегментации TCP и разгрузки фрагментации / повторной сборки IP, поэтому:

  • Отправляемые вашим компьютером UDP-пакеты, размер которых превышает размер одного кадра Ethernet, передаются сетевому адаптеру без фрагментации, при этом сетевой адаптер выполняет фрагментацию, и они также передаются libpcap перед фрагментацией;
  • Фрагменты UDP, получаемые вашим сетевым адаптером, размер которых превышает размер одного кадра Ethernet, повторно собираются сетевым адаптером перед передачей хосту и передаются в libpcap после повторной сборки;
  • фрагменты данных потока TCP, отправляемые вашим компьютером, которые слишком велики для размещения в одном кадре Ethernet, передаются сетевому адаптеру, при этом сетевой адаптер разбивает фрагменты на более мелкие сегменты TCP, а полный фрагмент передается на libpcap;
  • Сегменты TCP, полученные вашим сетевым адаптером, повторно собираются в более крупные фрагменты данных TCP, и эти фрагменты передаются на хост, а затем в libpcap;

так что libpcap видит не пакеты Ethernet и не ограничивается размером кадра Ethernet.

(То есть, Николай Фетисов, вероятно, был прав; то, что вы получаете, может выглядеть как Ethernet-фреймы, но это потому, что сетевой адаптер и драйвер заставляют их выглядеть так. На самом деле это не Ethernet-фреймы. передано или получено из Ethernet.)

Вы можете только подавить их, отключив любую форму сегментации / десегментации / фрагментации / повторной сборки, выполняемой на вашем сетевом адаптере с помощью команды ethtool; отключите такие параметры, как разгрузка сегментации TCP, разгрузка фрагментации UDP, разгрузка общей сегментации, разгрузка большого приема и разгрузка общего приема.

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

person Community    schedule 14.02.2012