7

¿Hay una biblioteca de Python que implementa una pila TCP independiente?Python TCP aplicación pila

No puedo usar la biblioteca de socket python habitual porque estoy recibiendo un flujo de paquetes sobre un socket (me están pasando por un túnel a través de este socket). Cuando recibo un paquete TCP SYN dirigido a un puerto en particular, me gustaría aceptar la conexión (enviar un syn-ack) y luego obtener los datos enviados por el otro extremo (ack'ing apropiadamente).

Tenía la esperanza de que había algún tipo de pila TCP ya escrito que podría utilizar. ¿Algunas ideas? He usado lwip en el pasado para un proyecto de C, algo así en Python sería perfecto.

+2

que terminó la implementación de una pila TCP bastante básico en Python, después de todo. Es justo lo que necesitaba para el proyecto en el que estaba trabajando, pero podría necesitar algo de trabajo. Si desea verlo de todos modos, la fuente está aquí: http://github.com/dound/vns/blob/master/TCPStack.py –

Respuesta

7

No dice en qué plataforma está trabajando, pero si está trabajando en Linux, abriría un tun/tap interface y obtendría los paquetes IP nuevamente en el núcleo como una interfaz de red real para que el kernel pueda hacer todo ese complicado asunto del TCP.

Esta es la forma (por ejemplo) OpenVPN obras - que recibe los paquetes IP a través de UDP o TCP y los túneles de nuevo en el núcleo a través de una interface tun/tap.

Creo que ahora también hay una interfaz tun/tap para Windows que fue desarrollada para el puerto OpenVPN en windows.

+0

Me gusta esta idea. Estoy usando Linux, por lo que obtener el dispositivo tun/tap y una configuración tap0 intf no fue difícil. Lamentablemente, no sé cómo usarlo. Para comenzar, estoy escribiendo mi paquete sin encapsular en bruto en tap0 (con un socket sin formato). Veo que el paquete SYN de forma correcta aparece en tap0 (dirigido a las direcciones MAC e IP de tap0). Sin embargo, si ejecuto netcat escuchando en la dirección IP de tap0, no veo que responda con un syn-ack. Puedo conectarme con telnet (aunque el kernel parece atajar este tráfico a través de lo). ¿Alguna sugerencia sobre cómo podría hacer que esto funcione? Gracias Nick! –

1

Sé que esto no está directamente relacionado con Python, pero si está buscando hacer un procesamiento de red pesado, debería considerar Erlang en lugar de Python. Solo una sugerencia realmente ... siempre puedes tomar una foto haciendo esto con Twisted ... si te sientes aventurero (y tienes mucho tiempo de tu lado) ;-)

+0

Por qué Erlang en concreto? ¿Por qué no C? C++? ¿Java? etc ... – jmucchiello

+1

Porque Erlang aterriza muy bien para hacer procesos asincrónicos. – jldupont

+1

Voté esta copia de seguridad. Quien lo votó debería avergonzarse de usted. No hay nada de malo en pedirle a alguien que cuestione sus necesidades de herramientas. Dicho eso, ¿por qué Erlang específicamente? –

0

Es posible que puedas usar el ctypes módulo para importar lwip y usarlo de nuevo.

+0

No es una mala idea, pero creo que esto implicaría mucho más trabajo de lo que estoy buscando en este caso. –

2

Al echar un vistazo más de Scapy, parece que podría ser capaz de manejar estas situaciones de bajo nivel. No lo he usado yo mismo, así que no puedo confirmar que haga lo que me has explicado; Solo he echado un vistazo a la documentación.

+0

Scapy está ordenado, pero no creo que me ayude a manejar el protocolo en sí mismo, ¿simplemente decodificando el paquete en sus campos constitutivos? –

0

Si ya está comprometido con el software en el otro extremo del socket, es decir, reenviando paquetes TCP, entonces quizás TCPWatch le muestre cómo obtener los paquetes SYN. SCAPY es ciertamente genial para enviar exactamente los paquetes que deseas, pero no estoy seguro de que funcione como un proxy.

http://hathawaymix.org/Software/TCPWatch

Sin embargo, si usted no está comprometido con lo que está en el extremo emisor, a continuación, considere el uso de Twisted Conch o paramiko hacer el reenvío de SSH. Incluso si no necesita cifrado, aún puede utilizar estos con blowfish que tiene un bajo impacto en su CPU. Esto no significa que necesite Conch en el otro extremo, ya que SSH está estandarizado, por lo que cualquier software SSH debería funcionar. En el mundo SSH, esto se conoce normalmente como "reenvío de puertos" y las personas usan un cliente de terminal SSH para iniciar sesión en un servidor SSH y configurar el túnel de reenvío de puertos. Conch y Paramiko le permiten construir esto en una aplicación de Python para que no haya necesidad de un cliente de terminal SSH.

Cuestiones relacionadas