我如何在python中发送原始以太网帧

Noa*_*ter 4 python sockets ethernet

我需要在几天内完成一个项目,它是一个基本的客户端和服务器接口.问题是它需要是所有原始套接字.我没有创建它的问题,我只是坚持发送数据包.

首先,我尝试将其绑定到接口'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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

*这是有效载荷的开始,即使它应该是数据包的开始,我也不会使用任何其他模块我必须使用套接字.

Noa*_*ter 6

感谢这个问题的评论,我设法与服务器建立连接.所有这一切都是在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')
Run Code Online (Sandbox Code Playgroud)

它需要在linux或debian中.据我所知,它在mac osx中不起作用.关于windows的idk.如果你有一个mac使用pycap或scapy,他们工作正常.