Riscrittura pacchetti di rete al volo usando libnetfilter_queue
-
28-09-2019 - |
Domanda
Sto tentando di scrivere un'applicazione userspace che può collegare in stack di rete di un sistema operativo, annusare i pacchetti volanti quelli passati e modificare che la sua nel interessati.
Dopo molte Googling, mi sembra che il metodo più semplice (ancora ragionevolmente robusta) di farlo (su qualsiasi piattaforma) è di Linux libnetfilter_queue
progetto. Tuttavia, sto avendo problemi a trovare alcuna documentazione ragionevole per il progetto, al di fuori della ufficiale documentazione. Le sue caratteristiche principali (come dichiarato dal primo link sono)
- ricezione di pacchetti in coda dal kernel nfnetlink_queue sottosistema
- l'emissione di verdetti e / o la reintroduzione alterati per il kernel nfnetlink_queue sottosistema
L'enfasi è mia. Esattamente come sono io intendevo andare su questo? Ho provato la modifica del codice esempio previsto, ma forse sto malinteso qualcosa. Il codice funziona in modalità NFQNL_COPY_PACKET
, in modo da I am che riceve l'intero pacchetto - ma le mie modifiche ad esso sembrano essere limitato alla mia propria applicazione - come ci si aspetterebbe, data la "copia" semantica .
La mia sensazione è che sto intenzione di fare uso di NF_QUEUE
in qualche modo, ma non ho abbastanza grokked esso. Tutti gli indicatori?
(Se v'è un meccanismo più semplice per fare questo, che è anche cross-platform, mi piacerebbe sentire su di esso!)
Soluzione
Non riesco a credere di aver perso questo in precedenza. Come reticenti come sono a postare domande sul SO, ho pensato che non avrei mai lavorare questo fuori me stesso. :)
Non ho guardo il prototipo di funzione correttamente. Risulta nella funzione "giudizio" (descritto di seguito),
int nfq_set_verdict(struct nfq_q_handle *qh,
u_int32_t id,
u_int32_t verdict,
u_int32_t data_len,
const unsigned char *buf
)
Gli ultimi due parametri sono per i dati da restituito per lo stack di rete. Ovvio col senno di poi, ma ho perso completamente la funzione print_pkt
non prende i dati a pacchetto come un parametro, ma estratti dal struct nfq_data
.
La chiave è NF_ACCEPT
il pacchetto e passare la schiena pacchetto opportunamente modificato per il kernel.
Altri suggerimenti
Solo una supposizione selvaggia di scavare tutto il codice sorgente: provare ad aggiungere in modo esplicito il payload maciullato utilizzando nfnl_addattr_l(…, NFQA_PAYLOAD, …)