2012-02-13 18 views
9

In realtà, ho due domande correlate.Come inviare pacchetti superiori a 1500 byte da pcap_sendpacket?

Sto catturando il traffico di rete filtrato per libpcap su Debian. Quindi ho bisogno di riprodurre questo traffico sul server Win2k3. A volte acquisisco pacchetti, sia TCP che UDP, molto più grandi di 1500 byte (dimensione MTU predefinita per Ethernet). Ad esempio, 2000+ byte. Non ho fatto modifiche specifiche alle dimensioni della MTU su quel Linux. Quindi domanda n. 1:

Qual è la ragione per questi pacchetti molto più grandi rispetto al valore predefinito MTU?Jumbo frames? Questo articolo di Wikipedia afferma che "le schede di interfaccia di rete capaci di jumbo frame richiedono una configurazione esplicita per utilizzare jumbo frame", ma non sono a conoscenza di tale configurazione. Anche ifconfig mi mostra "MTU: 1500". Può essere in qualche modo collegato con la tecnica di "interrupt-combining" (o "interrupt coalescing" come in this article)? Posso sopprimere questi pacchetti?

Poi, domanda # 2:

Come posso inviare tali pacchetti da pcap_sendpacket su Windows? Viene visualizzato il messaggio di errore "Errore di invio: PacketSendPacket non riuscito" solo per pacchetti di dimensioni superiori a 1500 byte. Sembra che non sia possibile utilizzare jumbo frame perché sto inviando dati alla "scheda di rete" personalizzata direttamente connessa come la scheda pci e non sono sicuro di poter configurare la scheda NIC. Cos'altro? Devo frammentare questi pacchetti in base alle regole del protocollo?

EDIT:

frammentazione Controllato da NIC come Guy Harris suggerito:

~# 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 

Lo stesso per eth1 e br0 - bridge di rete tra eth0 e eth1 che sto annusando.

E continuo a ricevere pacchetti UDP di grandi dimensioni.

+0

pcap sta probabilmente incollando i datagrammi frammentati di nuovo insieme in un blocco dai pacchetti di fili per voi. Controlla se puoi chiederti di darti dei frame ethernet e non di trasportare i pacchetti. –

+0

@NikolaiNFetissov: Sto ricevendo telegrammi Ethernet –

risposta

4

¿Si sta utilizzando il filo di terra per acquisire?

È importante per default wirehark riassemblare i datagrammi IP frammentati (e li memorizza in un file pcap come pacchetti singoli MTU-higger riassemblati senza frammentazione). Per disabilitare:

Modifica-> preferenze-> Protocolli-> ipV4-> e deselezionare "Riassembla i datagrammi IPv4 frammentati".

+0

Sto catturando da libpcap (il nucleo di Wireshark). Qualche informazione su come disabilitarlo in libpcap? –

+1

Libpcap non ha questa caratteristica da sola a meno che il pacchetto che usi abbia applicato questa patch -> http://seclists.org/tcpdump/2007/q2/112 Puoi controllare la tua versione di libpcap o scaricare quella ufficiale invece di usare quello fornito dalla distribuzione (a volte applicano patch strane ...) –

+0

+1. Per informazioni, ho creato l'ultima versione di libpcap da sorgenti, ora vedo solo pacchetti un po 'più grandi di MTU, 1518 byte. Sembra a causa del trailer Ethernet. Ma non riesco ancora a inviare questi pacchetti con 'pcap_sendpacket'. Dovrei modificarli rimuovendo quel trailer? –

6

La scheda di rete è probabilmente facendo segmentazione TCP/scarico desegmentation e IP frammentazione/scarico riassemblaggio, quindi:

  • pacchetti UDP di essere inviati dalla macchina di dimensioni superiori si inserisce in un singolo frame Ethernet sono in corso consegnato alla scheda di rete senza essere frammentato, con la scheda di rete che esegue la frammentazione e quelli che sono anche passati a libpcap prima di essere frammentati;
  • I frammenti UDP ricevuti dalla scheda di rete più grandi di quelli che si adattano a un singolo frame Ethernet vengono riassemblati dall'adattatore di rete prima di essere consegnati all'host e vengono consegnati a libpcap dopo essere stati riassemblati;
  • I blocchi di dati del flusso TCP inviati dalla macchina che sono troppo grandi per adattarsi a un singolo frame Ethernet vengono consegnati alla scheda di rete, con la scheda di rete che suddivide i blocchi in segmenti TCP più piccoli e il blocco completo è essere passato a libpcap;
  • I segmenti TCP ricevuti dalla scheda di rete vengono riassemblati in blocchi più grandi di dati TCP ei blocchi vengono passati all'host e quindi a libpcap;

così quello libpcap vede sono non pacchetti Ethernet e sono non limitato alla dimensione del frame Ethernet.

(Ie, Nikolai Fetissov era probabilmente corretto, quello che stai ricevendo forza assomigliare frame Ethernet, ma è perché la scheda di rete e il driver farli apparire in questo modo essi sono, infatti, i frame non Ethernet trasmessi. acceso o ricevuto da Ethernet.)

È possibile sopprimerli disattivando qualsiasi forma di segmentazione/desegmentazione/frammentazione/riassemblaggio sulla scheda di rete utilizzando il comando ethtool; disattivare le opzioni Offload segmentazione TCP, Offload frammentazione UDP, Offload segmentazione generale, Offload ricezione grande e Offload ricezione generico.

Una volta disabilitate queste opzioni, non dovreste più avere quei grandi pacchetti, e quindi dovreste essere in grado di riprodurli senza problemi. Lì è non è un modo semplice per riprodurre i pacchetti riassemblati/non frammentati o segmentati che hai catturato finora - dovresti scrivere il tuo codice per frammentarli, e non c'è alcuna garanzia che sarebbero stati -fragmentato/ri-segmentato nello stesso modo in cui erano originariamente frammentati/segmentati sul filo.

+1

+1: thx per informazioni, controllo ... –

+0

pls vedi post modificato –

Problemi correlati