La reescritura de los paquetes de red sobre la marcha utilizando libnetfilter_queue
-
28-09-2019 - |
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!)
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, …)