Aggancio in Stack TCP in C
Domanda
Non è solo una cattura sto cercando di fare qui.Voglio prima di acquisire il pacchetto, quindi in tempo reale, controllare il carico utile di dati specifici, rimuovere, inserire una firma e reiniettare il pacchetto in stack per essere inviato come prima.
Ho avuto una lettura di ipfw deviare prese utilizzando IPFW e sembra molto promettente.Che dire di esempi, nel modificare i pacchetti e reinjecting in stack utilizzando deviare prese?Inoltre, come una questione di curiosità, sarebbe possibile leggere i dati dal socket utilizzando Java oppure limitare me con imballaggio alterazione e reinjecting ecc?
Soluzione
Stavo per echo altre risposte che hanno consigliato di iptables (a seconda della complessità del pattern che si sta cercando di partita e il pacchetto di modifiche che si desidera apportare) - fino a quando ho preso atto del BSD tag sulla questione.
Come Stefano Pellicer si è già accennato, libpcap è una buona opzione per la cattura dei pacchetti.Credo, però, che libpcap può essere utilizzato anche per inviare i pacchetti.Per riferimento, io sono abbastanza sicuro che tcpreplay utilizza per la riproduzione di file in formato pcap.
Altri suggerimenti
Vedere la deviazione di corrente: Deviazione Prese mini HOWTO.
Funzionano facendo passare il traffico di corrispondenza di un certo ipfw regola speciale per i raw socket che può quindi reiniettare alterato il traffico in rete strati.
Se siete solo in cerca di cattura dei pacchetti, libpcap è molto popolare.E ' utilizzato in strumenti di base come tcpdump ed etereo.Per quanto riguarda il "aggancio in pila", a meno che non si prevede di non cambiando radicalmente il modo in cui la rete è implementato (es.aggiungi il tuo livello o di alterare il comportamento del TCP), la tua idea di usare IPF per il pacchetto di modifica o intervento sembra la migliore scommessa.In Linux hanno una specifica reindirizzamento destinazione per userspace moduli, IPF probabilmente ha qualcosa di simile o è possibile modificare IPF per fare qualcosa di simile.
Se siete solo interessati a vedere i pacchetti, quindi libpcap è la strada da percorrere.Lo si può trovare presso: http://www.tcpdump.org/
È possibile fare questo in userspace con la CODA o NFQUEUE iptables target penso.L'applicazione client è collegato a una coda e riceve tutti i pacchetti, che è possibile modificare prima di essere re-iniettato (si può anche farli cadere se si vuole).
C'è una libreria client libnetfilter_queue che ha bisogno di essere collegato.Purtroppo la documentazione è minima, ma ci sono alcuni messaggi di mailing list ed esempi bussare in giro.
Per motivi di prestazioni, non si vuole fare questo per ogni pacchetto, ma solo specifici corrispondenti a quelli, che dovrete corrispondere l'utilizzo di standard di regole di iptables.Se questo non basta, è necessario scrivere il proprio netfilter modulo del kernel.