如何在Python中使用原始套接字?
问题内容:
我正在编写一个应用程序来测试网络驱动程序以处理损坏的数据。而且我想到了使用原始套接字发送此数据,因此发送计算机的TCP-IP堆栈将不会对其进行更正。
我仅在Linux上编写此应用程序。我有在系统调用中使用原始套接字的代码示例,但我真的很想保持测试尽可能动态,并使用Python编写大部分(如果不是全部)测试。
我已经在网络上搜索了一些关于python中原始套接字用法的解释和示例,但是还没有发现真正有意义的东西。只是一个非常老的代码示例,演示了这个想法,但绝不起作用。
据我了解,Python的Raw Socket用法在语义上与UNIX的Raw套接字几乎相同,但是没有struct
用于定义数据包结构的。
我想知道最好不要在Python中编写测试的原始套接字部分,而在C中通过系统调用,然后从主要的Python代码中调用它,这会更好吗?
问题答案:
您可以这样操作:
首先,您禁用网卡的自动校验和:
sudo ethtool -K eth1 tx off
然后从python 2发送您的躲避帧(您必须自己转换为Python 3):
#!/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)
做完了