socket español python sockets raw-sockets

socket python 3 español



¿Cómo uso Raw Socket en Python? (6)

Estoy escribiendo una aplicación para probar un controlador de red para manejar datos corruptos. Y pensé en enviar estos datos usando un socket sin formato, por lo que no será corregido por la pila TCP-IP del equipo remitente.

Estoy escribiendo esta aplicación únicamente en Linux. Tengo ejemplos de código de uso de sockets sin formato en las llamadas al sistema, pero me gustaría mantener mi prueba tan dinámica como sea posible y escribir la mayoría si no toda en Python.

He buscado un poco en la web para obtener explicaciones y ejemplos del uso de sockets sin formato en python, pero no he encontrado nada realmente esclarecedor. Solo un ejemplo de código muy antiguo que demuestra la idea, pero de ninguna manera funciona.

Según lo que reuní, el uso de Socket Raw en Python es casi idéntico en semántica al socket sin struct UNIX, pero sin las struct que definen la estructura de los paquetes.

Me preguntaba si sería mejor no escribir la parte de socket sin formato de la prueba en Python, pero en C con llamadas al sistema, y ​​llamarlo desde el código principal de Python.


¿Es this el código antiguo que mencionaste encontrar? Me parece sensato, pero no lo he probado yo mismo (o he usado mucho enchufes). reference de la documentación muestra cómo usar sockets sin formato para olfatear paquetes, y se ve lo suficientemente similar.


Finalmente, la mejor solución para este caso fue escribir todo en C, porque no es una gran aplicación, por lo que habría incurrido en mayor penalización para escribir una cosa tan pequeña en más de 1 idioma.

Después de mucho jugar con las tomas RAW C y python, finalmente preferí las tomas RAW C. Los sockets RAW requieren modificaciones a nivel de bits de grupos de menos de 8 bits para escribir los encabezados de los paquetes. A veces escribiendo solo 4 bits o menos. Python no define ninguna asistencia para esto, mientras que Linux C tiene una API completa para esto.

Pero definitivamente creo que si solo este pequeño fragmento de inicialización de encabezado se manejara convenientemente en Python, nunca hubiera usado C aquí.



Las llamadas al sistema de socket (o Winsocks, en Windows) ya están incluidas en el socket módulo estándar: intro , reference .

Nunca he usado conectores crudos, pero parece que se pueden usar con este módulo:

El último ejemplo muestra cómo escribir un sniffer de red muy simple con sockets sin formato en Windows. El ejemplo requiere privilegios de administrador para modificar la interfaz:

import socket # the public network interface HOST = socket.gethostbyname(socket.gethostname()) # create a raw socket and bind it to the public interface s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_IP) s.bind((HOST, 0)) # Include IP headers s.setsockopt(socket.IPPROTO_IP, socket.IP_HDRINCL, 1) # receive all packages s.ioctl(socket.SIO_RCVALL, socket.RCVALL_ON) # receive a package print s.recvfrom(65565) # disabled promiscuous mode s.ioctl(socket.SIO_RCVALL, socket.RCVALL_OFF)


Lo haces así:

Primero desactiva la suma de verificación automática de su tarjeta de red:

sudo ethtool -K eth1 tx off

Y luego envíe su marco dudoso de Python:

#!/usr/bin/env python from socket import socket, AF_PACKET, SOCK_RAW s = socket(AF_PACKET, SOCK_RAW) s.bind(("eth1", 0)) # We''re putting together an ethernet frame here, # but you could have anything you want instead # Have a look at the ''struct'' module for more # flexible packing/unpacking of binary data # and ''binascii'' for 32 bit CRC src_addr = "/x01/x02/x03/x04/x05/x06" dst_addr = "/x01/x02/x03/x04/x05/x06" payload = ("["*30)+"PAYLOAD"+("]"*30) checksum = "/x1a/x2b/x3c/x4d" ethertype = "/x08/x01" s.send(dst_addr+src_addr+ethertype+payload+checksum)

Hecho.


s = socket(AF_PACKET, SOCK_RAW) s = socket(PF_PACKET, SOCK_RAW)

resultado:

[root@localhost python]# tcpdump -i eth0 capture size 96 bytes 11:01:46.850438 01:02:03:04:05:06 (oui Unknown) > 01:02:03:04:05:06 (oui Unknown), ethertype Unknown (0x0801), length 85: 0x0000: 5b5b 5b5b 5b5b 5b5b 5b5b 5b5b 5b5b 5b5b [[[[[[[[[[[[[[[[ 0x0010: 5b5b 5b5b 5b5b 5b5b 5b5b 5b5b 5b5b 5041 [[[[[[[[[[[[[[PA 0x0020: 594c 4f41 445d 5d5d 5d5d 5d5d 5d5d 5d5d YLOAD]]]]]]]]]]] 0x0030: 5d5d 5d5d 5d5d 5d5d 5d5d 5d5d 5d5d 5d5d ]]]]]]]]]]]]]]]] 0x0040: 5d5d 5d00 0000 00 ]]]....