socket real example python tcp network-programming network-protocols raw-sockets

real - Implementación de pila Python TCP



real python socket (5)

¿Hay una biblioteca de Python que implemente una pila TCP independiente?

No puedo usar la biblioteca de socket python habitual porque recibo una secuencia de paquetes en 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).

Esperaba que ya existiera algún tipo de pila TCP que pudiera utilizar. ¿Algunas ideas? He usado lwip en el pasado para un proyecto de C, algo así en Python sería perfecto.


Echando un vistazo por encima de Scapy , parece que podría 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.


Es posible que pueda usar el módulo ctypes para importar lwip y volver a usarlo.


No dices en qué plataforma estás trabajando, pero si trabajas en Linux, abro una interfaz tun / tap y vuelvo a poner los paquetes IP en el kernel como una interfaz de red real para que el kernel pueda hacer todo eso complicado TCP cosas.

Así es como (por ejemplo) funciona OpenVPN : recibe los paquetes IP sin procesar a través de UDP o TCP y los canaliza de vuelta al kernel a través de una interfaz tun / tap.

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


Sé que esto no está directamente relacionado con Python, pero si buscas hacer un procesamiento de red pesado, debes 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) ;-)


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 no está comprometido con lo que está en el extremo emisor, considere usar Twisted Conch o Paramiko para hacer el reenvío 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.