【问题标题】:Writing raw IP data to an interface (linux)将原始 IP 数据写入接口 (linux)
【发布时间】:2012-10-13 23:57:41
【问题描述】:

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

在 Linux 中,我知道您可以直接写入某些设备(echo "DATA" > /dev/device_handle)。使用 python 在 /dev/eth1 上进行打开会达到相同的效果(即我可以做 echo "DATA" > /dev/eth1)

【问题讨论】:

    标签: python linux networking packet


    【解决方案1】:

    类似:

    #!/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 循环是不够的。

    【讨论】:

    • 谢谢。这应该让我开始走上正轨。是的,我有二进制形式的完整 IP 数据包。数据块的第一个字节是 IP 头的第一个字节。数据块的最后一个字节是IP数据的最后一个字节(我相信是tcp校验和)
    • 这段代码不需要创建以太网帧吗?你不想IPPROTO_TCP吗?
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-02
      • 2020-04-23
      • 2012-04-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多