Pregunta

Estoy buscando una utilidad de Linux que pueda alterar las cargas útiles de los paquetes de red en función de un conjunto de reglas. Idealmente, usaría iptables y el módulo de kernel netfilter , pero no admiten la manipulación genérica de la carga útil: iptables alterará varios encabezado (direcciones, puertos, TOS, etc.), y puede coincidir con bytes arbitrarios dentro de un paquete, pero aparentemente no puede alterar datos arbitrarios dentro del paquete.

Un módulo de kernel sería una gran ventaja, ya que la eficiencia es una preocupación, pero estoy feliz de explorar cualquier otra opción que haga el trabajo.

¡Gracias por tus ideas!


Actualización desde hace mucho tiempo:

Elegimos usar el módulo NFQUEUE , que es la última implementación de los módulos QUEUE que sugirió Robert Gamble. Parecía ser bastante simple, con un bono de seguridad para permitir que nuestro código se ejecute en el espacio del usuario, no del núcleo.

La implementación habría sido casi trivial si simplemente hubiéramos querido alterar la carga útil sin cambiar su tamaño. En ese caso, definiríamos una iptables para seleccione el " interesante " paquetes para nosotros y enviarles un objetivo NFQUEUE . Escribiríamos una función de devolución de llamada que inspeccionaría los paquetes de NFQUEUE , modificaría los datos según fuera necesario y volvería a calcular las sumas de verificación en sus encabezados TCP e IP.

Sin embargo, nuestro caso de uso implica la inyección de caracteres adicionales en el flujo de datos. Esto tiene el efecto secundario algo obvio de aumentar los números de SEQ / ACK correspondientes en la secuencia TCP, y el efecto secundario no tan obvio de confundir el módulo conntrack lo suficiente como para romper NAT por completo. Después de un lote de investigación, rascado de cabeza y experimentación, la solución más conveniente fue deshabilitar el seguimiento de conexión para estos paquetes en particular (con el objetivo NOTRACK en el raw ) y manejarlo en nuestra devolución de llamada. Guarde sus tomates y odie el correo; No estoy en absoluto orgulloso de dejarte bajo el capó, pero era la única forma de hacer llegar un producto confiable al cliente antes de la próxima Edad de Hielo. Y es una buena historia. Pero realmente aprecio y comparto sus sentimientos sinceros.

La versión 2 aprovechará nuestra nueva iluminación reemplazando nuestra devolución de llamada y varias reglas de iptables con un NAT personalizado y / o conntrack helper . Estamos seguros de que el ejercicio actual nos ha brindado suficiente experiencia para crear un módulo de kernel que se ajuste orgánicamente a la arquitectura de filtro de red para resolver los problemas que encontramos.

¡Gracias de nuevo por su interés y sugerencias!

¿Fue útil?

Solución

No lo he usado, pero el QUEUE netfilter target Parece que podría funcionar. Utiliza un socket nflink y una aplicación de espacio de usuario registrada en el socket para realizar las modificaciones de la carga útil.

La página del manual libipq contiene detalles sobre cómo usar esto y proporciona un ejemplo simple .

Otros consejos

Resolución:

Terminamos con un módulo personalizado para netfilter, que es claramente el " derecho " herramienta para el trabajo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top