python - ¿Cómo se envía un marco de Ethernet con un FCS corrupto?
networking automated-tests (4)
No estoy seguro de si esto es posible, ya que esto podría manejarse en hardware, pero necesito enviar algunas tramas Ethernet con errores en ellas. Me gustaría poder crear runts, jabber, desalineación y errores FCS incorrectos. Estoy trabajando en Python.
El programa no funcionó según lo previsto para generar errores de FCS.
El controlador de red agregó la suma de comprobación correcta al final del marco generado de nuevo. Por supuesto, es bastante 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 al 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 ni agregar el FCS.
Puede que también le interese el siguiente C-programme, que sí me mostró cómo hacerlo: http://markmail.org/thread/eoquixklsjgvvaom
Pero tenga en cuenta que el programa no funcionará en kernels recientes sin un pequeño cambio. El SOL_SOCKET parece haber cambiado la ID numérica de 42 a 43 en algún momento del pasado.
Según el autor original, la función debería estar disponible para al menos los siguientes controladores: e100, e1000 y e1000e. Un rápido grep en las fuentes del kernel de 3.16.0 indica que ixgbe igb e i40e también deberían funcionar. Si no está utilizando ninguna de estas tarjetas, esta opción de socket probablemente no estará disponible.
Primero, deshabilita la suma de comprobación de su tarjeta ethernet:
sudo ethtool -K eth1 tx off
Luego, envía los marcos corruptos de 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)
Se puede manejar en hardware, pero no siempre, e incluso si lo es, puedes desactivarlo; ver los parámetros de descarga ethtool .
Con respecto a obtener el control total sobre los cuadros que creas, busca en PF_PACKET (para un enfoque) o en el controlador de acceso (para otro).
Aquí hay un artículo sobre el uso de PF_PACKET para enviar marcos hechos a mano de Python .
intente utilizar Scapy para Python, hay ejemplos para generar marcos jumbo, también marcos de enrutamiento. http://www.dirk-loss.de/scapy-doc/usage.html