¿Cómo se envía un marco Ethernet con un FCS corrupto?

No estoy seguro de si esto es posible, ya que esto podría manejarse en hardware, pero necesito enviar algunos marcos Ethernet con errores en ellos. Me gustaría poder crear runts, jabber, desalineación y errores incorrectos de FCS. Estoy trabajando en Python.

Puede manejarse en hardware, pero no siempre, e incluso si lo es, puede desactivarlo; Ver los parámetros de descarga de ethtool .

Con respecto a obtener un control total sobre los cuadros que creas, mira en PF_PACKET (para un enfoque) o el controlador de tap (para otro).

Aquí hay un artículo sobre el uso de PF_PACKET para enviar marcos hechos a mano desde Python .

Primero, desactivas la sum de comprobación de tu tarjeta ethernet:

sudo ethtool -K eth1 tx off 

Luego, envías los marcos corruptos desde python:

 #!/usr/bin/env python from socket import * # # Ethernet Frame: # [ # [ Destination address, 6 bytes ] # [ Source address, 6 bytes ] # [ Ethertype, 2 bytes ] # [ Payload, 40 to 1500 bytes ] # [ 32 bit CRC chcksum, 4 bytes ] # ] # s = socket(AF_PACKET, SOCK_RAW) s.bind(("eth1", 0)) src_addr = "\x01\x02\x03\x04\x05\x06" dst_addr = "\x01\x02\x03\x04\x05\x06" payload = ("["*30)+"PAYLOAD"+("]"*30) checksum = "\x00\x00\x00\x00" ethertype = "\x08\x01" s.send(dst_addr+src_addr+ethertype+payload+checksum) 

Ver una pregunta similar

intente usar scapy para python, hay ejemplos para generar marcos jumbo, también marcos runt. http://www.dirk-loss.de/scapy-doc/usage.html

El progtwig no funcionó como estaba previsto para que yo generara errores de FCS.

El controlador de red agregó nuevamente la sum de comprobación correcta al final del marco generado. Por supuesto, es muy posible que la solución funcione para algunas tarjetas, pero estoy seguro que no con ninguna de Intel. (También funciona sin ningún cambio de ethtool para mí).

Con al menos una tarjeta de red Intel e1000e, necesita un pequeño cambio en el código anterior: agregue la siguiente línea después de “s = socket (AF_PACKET, SOCK_RAW)”:

 s.setsockopt(SOL_SOCKET,43,1) 

Esto le indica al controlador NIC que use la opción “SO_NOFCS” definida en socket.h y envíe el marco sin calcular y agregar el FCS.

También te puede interesar el siguiente progtwig C, que me mostró cómo hacerlo: http://markmail.org/thread/eoquixklsjgvvaom

Pero tenga en cuenta que el progtwig no funcionará en núcleos recientes sin un pequeño cambio. El SOL_SOCKET parece haber cambiado el ID numérico de 42 a 43 en algún momento en el pasado.

Según el autor original, la función debería estar disponible para al menos los siguientes controladores: e100, e1000 y e1000e. Un grep rápido en las fonts del kernel de 3.16.0 indica que ixgbe igb y i40e también deberían funcionar. Si no está utilizando ninguna de estas tarjetas, esta opción de socket probablemente no estará disponible.