Cómo usar la interfaz TUN / TAP para dividir paquetes, túneles y luego volver a montar.(similar a mlppp)
-
14-11-2019 - |
Pregunta
Estoy buscando crear una aplicación cliente / servidor que pueda usar para cortar paquetes de red por la mitad, túneles cada mitad del paquete sobre una conexión UDP separada (porque cada conexión UDP va a pasar a través de un enlace WiFi diferente) y Luego vuelva a montar los paquetes divididos en el otro extremo. Además de dividir los paquetes, cada medio paquete también tendrá que tener un número de identificación y secuencia para que se puedan volver a montar adecuadamente.
Básicamente, estoy tratando de hacer algo similar a MLPPP
Estoy buscando hacer esto usando Python y el controlador TUN / TOP NETWORK. He encontrado las siguientes muestras de código de Python y los módulos que creo que podría ser útil para este proyecto.
Python Tun / TAP
- http://www.secdev.org/projects/tuntap_udp/files/ tunproxy.py
- http://twistedmatrix.com/trac/browser/trunk/ retorcido / par / tuntap.py
- http://pastebin.com/gmb8zufj
Python Raw Packet Manipulation
- http://libdnet.sourceforge.net/
- http://pypi.python.org/pypi/pyip/
- http://code.google.com/p/python-packet/
Mi pregunta es ¿Se puede realizar la modificación de paquetes necesarios con Python y cuál sería una posible manera de abordar esto? ¿Puedo usar los módulos anteriores para hacer esto o hay una solución mejor? Estoy buscando algunas comentarios que me guiarán en la dirección correcta, ya que no soy un programador experimentado. Cualquier código de código o enlaces adicionales son bienvenidos.
Solución
Estamos haciendo algo como esto en producción y funciona bastante bien.Sin embargo, no dividimos paquetes individuales.Establecemos pesos fraccionarios para cada conexión (ilimitada) y envíemos los paquetes.Tenemos algún código en lugar para lidiar con diferentes latencias en cada línea.En el otro extremo, los amortizamos y reordenamos.El rendimiento es bastante bueno: tenemos sitios con 5+ líneas ADSL y obtenga buenas velocidades, más de 40 Mbps en la descarga.
Los paquetes de división (por ejemplo, 1500/2= 750) introducirían gastos generales innecesarios ... Mantenga sus paquetes lo más grandes posible.
Hemos desarrollado nuestro propio protocolo (formato de encabezado) para los paquetes UDP.Hemos realizado pruebas de bucle invertido en el TUN / TAP hasta 200 Mbps, por lo que definitivamente el kernel a la interacción del espacio de usuario funciona bien.Anteriormente utilizamos NFQUEUE, pero que tenían problemas de confiabilidad.
Todo lo anterior fue escrito en Python.
Otros consejos
Me parece perfectamente posible.
Los módulos TUN / TAP que ha descubierto parecer que harían el trabajo.Twisted será de alto rendimiento y el costo de lastimar su cabeza lo funcionará todo.
En cuanto a dividir los paquetes, no necesita interpretar los datos de ninguna manera, simplemente trátelo como un bulto de datos binarios, divídalo en dos y agregue un encabezado, no usaría ningún módulo de terceros.Para eso, solo manejo normal de cuerdas Python.
O podría usar NetStrings Si desea un formato de encapsulación de paquetes fácil de usar.
No supongo que iría a un cohete, ¡pero estoy seguro de que aprenderías mucho hacerlo!