将原始IP数据写入接口(linux)

时间:2012-10-23 23:25:55

标签: python linux networking packet

我有一个包含二进制格式的原始IP数据包的文件。文件中的数据包含完整的IP标头,TCP \ UDP标头和数据。我想使用任何语言(最好是python)来读取这个文件并将数据转储到该行上。

在Linux中我知道你可以直接写入某些设备(echo“DATA”> / dev / device_handle)。使用python在/ dev / eth1上做一个开放实现相同的效果(即我可以回显“DATA”> / dev / eth1)

2 个答案:

答案 0 :(得分:2)

没有;没有/dev/eth1设备节点 - 网络设备与字符/块设备(如终端和硬盘驱动器)位于不同的命名空间中。您必须创建一个AF_PACKET套接字来发送原始IP数据包。

答案 1 :(得分:2)

类似的东西:

#!/usr/bin/env python
import socket
s = socket.socket(socket.AF_PACKET, socket.SOCK_RAW)
s.bind(("ethX", 0))

blocksize = 100;
with open('filename.txt') as fh:
    while True:
        block = fh.read(blocksize)
        if block == "": break  #EOF
        s.send(block)

应该工作,但是没有测试过。

  • ethX需要更改为您的界面(例如eth1eth2wlan1等。)
  • 您可能想要使用blocksize。一次100个字节应该没问题,你可以考虑上升,但我会保持低于1500字节的以太网PDU。
  • 您可能需要root / sudoer权限。我之前在从原始套接字读取时需要它们,从未尝试过只写一个。
  • 这提供了您实际上将数据包(并且只有数据包)转储到文件。不是任何类型的编码(例如十六进制)。如果一个字节是0x30,那么它在文本文件中应该是'0',而不是“0x30”,“30”或类似的东西。如果不是这种情况,您需要使用某些处理替换while循环,但send仍然相同。
  • 因为我刚刚读到您正在尝试发送IP数据包 - 在这种情况下,您可能需要立即构建整个数据包,然后将其推送到套接字。简单的while循环是不够的。