Pregunta

Estoy intentando escribir una aplicación de espacio de usuario que se puede enganchar en la pila de red de un sistema operativo, sniff paquetes de vuelo más allá de unos y editar en que su interés.

Después de mucho buscar en Google, me parece que el método más simple (sin embargo, razonablemente robusta) de hacerlo (en cualquier plataforma) es de Linux libnetfilter_queue proyecto. Sin embargo, estoy teniendo problemas para encontrar cualquier documentación razonable para el proyecto, en las afueras de la oficial documentación. Sus principales características (como se indica por el primer eslabón son)

  • recibir paquetes de la cola del núcleo nfnetlink_queue subsistema
  • emisión de veredictos y / o reinyección de paquetes alterados al núcleo nfnetlink_queue subsistema

El énfasis es mío. ¿Cómo exactamente se supone que debo ir sobre esto? He intentado modificar el código de la muestra href="http://www.netfilter.org/projects/libnetfilter_queue/doxygen/nfqnl__test_8c_source.html"> siempre, pero tal vez estoy mal entendido algo. El código está funcionando en modo NFQNL_COPY_PACKET, por lo que am de recibir el paquete entero - pero mis modificaciones que parecen estar restringidos a mi propia aplicación - como era de esperar, dada la "copia" semántica .

Mi sensación es que estoy destinado a hacer uso de NF_QUEUE alguna manera, pero yo no he asimilado bastante ella. Cualquier punteros?

(Si hay un mecanismo más sencillo para hacer esto, que también es multiplataforma, me encantaría saberlo!)

¿Fue útil?

Solución

No puedo creer que me perdí esto anteriormente. Como reticentes como soy para enviar preguntas sobre SO, pensé que nunca iba a funcionar éste hacia fuera a mí mismo. :)

no me veía en el prototipo de la función correctamente. Resulta que en la función "veredicto" (descrito a continuación),

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     
)

Los dos últimos parámetros son para que los datos sean regresó a la pila de red. Obvia en retrospectiva, pero echaba de menos completamente como la función print_pkt no toma los datos de paquete como un parámetro, pero extrae de la struct nfq_data.

La clave es NF_ACCEPT el paquete y pasar la parte de atrás de paquetes adecuadamente modificada al kernel.

Otros consejos

Sólo una conjetura salvaje de la excavación alrededor del código fuente: trate de añadir explícitamente la carga útil destrozado usando nfnl_addattr_l(…, NFQA_PAYLOAD, …)

?
scroll top