2010-11-26 27 views
5

Estoy intentando escribir una aplicación de espacio de usuario que se puede enganchar en la pila de red de un sistema operativo, huelen los paquetes que volaban y editar las que el interesado.Reescritura de paquetes de red sobre la marcha usando libnetfilter_queue

Después de mucho buscar en Google, parece Para mí, el método más simple (aunque razonablemente robusto) de hacerlo (en cualquier plataforma) es el proyecto libnetfilter_queue de Linux. Sin embargo, tengo problemas para encontrar cualquier documentación razonable para el proyecto, aparte de la limitada documentación de official. Sus principales características (como se indica por el primer enlace son)

  • recibir paquetes de la cola desde el subsistema de kernel nfnetlink_queue
  • emisión de veredictos y/o reinyección de los paquetes alterados al subsistema de kernel nfnetlink_queue

El énfasis es mío. ¿Cómo exactamente me refiero a esto? Intenté modificar el código sample proporcionado, pero tal vez estoy malinterpretando algo. El código está operando en el modo NFQNL_COPY_PACKET, entonces I am recibiendo el paquete completo, pero mis modificaciones parecen estar restringidas a mi propia aplicación, como era de esperar, dada la semántica de "copia".

Mi sensación es que estoy destinado a hacer uso de NF_QUEUE de alguna manera, pero no lo he asimilado del todo. ¿Alguna sugerencia?

(Si hay un mecanismo más sencillo para hacer esto, que también es multiplataforma, me encantaría oír hablar de eso)

Respuesta

11

No puedo creer que me haya perdido esto anteriormente. Tan reticente como soy para publicar preguntas sobre SO, pensé que nunca iba a trabajar en esto yo mismo. :)

No miré el prototipo de 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 devueltos a la pila de red. Obvio en retrospectiva, pero lo omití por completo ya que la función print_pkt no toma los datos del paquete como un parámetro, sino que los extrae del struct nfq_data.

La clave es NF_ACCEPT el paquete y pasar el paquete modificado adecuadamente de nuevo al kernel.

+0

Sedate, ¿experimentas al usar esto a través de Java (JNI)? Tengo curiosidad si disminuye el rendimiento. –

+0

@TinaJasmin Desafortunadamente no tengo experiencia con JNI, así que no estoy seguro de cuánto de un golpe de rendimiento estaría involucrado. Lo siento, no puedo ser más útil. –

0

Sólo una conjetura salvaje de la excavación alrededor del código fuente: tratar de manera explícita añadiendo la carga útil destrozada usando nfnl_addattr_l(…, NFQA_PAYLOAD, …)?

Cuestiones relacionadas