如何发送了一个Python原始的以太网帧(How do i send an raw ethernet

2019-06-27 16:36发布

我需要有几天做了一个项目,它的一个基本的客户端和服务器的接口。 美中不足的是,它需要所有的原始套接字。 我有创造,我只是停留在发送数据包没有问题。

首先,我试图将其绑定到接口“EN1”,但它不断给我一个错误nodename not known 。 当我把它绑定到我的本地IP地址,它工作正常。 完成此之后,我创建了一个原始数据包类,其所有的十六进制。 然后我做了一个sendto调用发送它上线。

的问题是,当我使用的Wireshark捕获分组它显示为是IPv4分组的有效载荷。 我不希望它自动地使头,这是我的原始数据包类是反正。 你知道有什么方法我可以把这些标题?

这里是我的代码 - 唯一的原始功能:

def raw():
    HOST = gethostbyname('192.168.1.10')

    s = socket(AF_INET, SOCK_RAW, IPPROTO_IP)
    s.bind((HOST, 0))

    s.setsockopt(IPPROTO_IP, IP_HDRINCL, 0) #no headers - it wont work!!

    pckt = packet("\x68\x65\x6c\x6c\x6f")
    netpacket = pckt.getpacket()

    print "Sending.. "
    print ""

    s.sendto(netpacket, ('192.168.1.1', 80))
    data = s.recv(4096)
    print data

O和这里是在最后一个hello捕获的数据包:

007f 2809 6da2 28cf daee 2156 0800 4500 004d 1bfc 0000 4000 db59 c0a8 010a c0a8 0101* 007f     

2809 6da2 28cf daee 2156 0800 4500 0036 2352 4000 4006 0000 c0a8 010a c0a8 0101 15c0 0050 

0000 0000 0000 0000 8010 813b 0000 68656c6c6f -hello

*这是负载起始,即使它被认为是包还我不打算使用任何其他模块我必须使用插座的开始。

Answer 1:

这要归功于这个问题的评论,我设法与服务器去连接。 时采取了改变地址族在linux下af_packet。 然后我把它绑定到我的网卡,把它。 有效。 感谢您的帮助的人! 这里是一些示例代码:

s = socket(AF_PACKET, SOCK_RAW)
s.bind(("en1", 0))
pckt = packet() #my class that initializes the raw hex
data = pckt.getpacket()
s.send(data)
message = s.recv(4096)
print s
print s.decode('hex')

它需要在Linux或Debian的。 我knowldege它在Mac OSX上不工作。 IDK的有关Windows。 如果u有一个MAC使用pycap或Scapy的,他们工作得很好。



Answer 2:

在回答你的问题安德鲁,这里是一个例子:

这个答案让我获得网络唤醒工作。 在这种情况下,数据是:

preamble = bytearray((0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF))
MAC = bytearray((0x00, 0x14, 0x85, 0xa4, 0x73, 0xce))
data = PREAMBLE + 16*MAC


文章来源: How do i send an raw ethernet frame in python