【问题标题】:Create a packet from raw bytes and write to pcap file using gopacket从原始字节创建数据包并使用 gopacket 写入 pcap 文件
【发布时间】:2021-08-20 06:42:31
【问题描述】:

我想使用 gopacket 从原始字节创建一个数据包并将数据包写入 pcap 文件。

我从原始字节创建了一个 UDP 数据包,如下所示。

package main

import (
        "fmt"
        "net"
        "log"
        "os"
        "time"
        //"encoding/hex"
        "github.com/google/gopacket"
        "github.com/google/gopacket/layers"
        "github.com/google/gopacket/pcap"
        "github.com/google/gopacket/pcapgo"
)

var (
        device       string = "eth0"
        snapshot_len int32  = 65535
        promiscuous  bool   = false
        err          error
        timeout      time.Duration = 30 * time.Second
        handle       *pcap.Handle
        buffer       gopacket.SerializeBuffer
        options      gopacket.SerializeOptions
)

func main() {
        ethernetLayer := &layers.Ethernet{
            SrcMAC: net.HardwareAddr{0xFF, 0xAA, 0xFA, 0xAA, 0xFF, 0xAA},
            DstMAC: net.HardwareAddr{0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD},
        }
        ipLayer := &layers.IPv4{
            SrcIP: net.IP{127,0,0,1},
            DstIP: net.IP{8,8,8,8},
        }
        udpLayer := &layers.UDP{
            SrcPort: 51190,
            DstPort: 4789,
        }
        rawBytes := []byte{10, 20, 30}
        buffer = gopacket.NewSerializeBuffer()
        gopacket.SerializeLayers(buffer, options,
                ethernetLayer,
                ipLayer,
                udpLayer,
                gopacket.Payload(rawBytes),
        )
        outgoingPacket := buffer.Bytes()
        fmt.Println(outgoingPacket)
        ethpacket := gopacket.NewPacket(outgoingPacket,
                                    layers.LayerTypeEthernet,
                                    gopacket.Default )

我很惊讶如何将这些数据包写入 pcap 文件。这是那部分代码。

        f, err := os.Create("temp.pcap")
        if err != nil {
                log.Fatal(err)
                os.Exit(1)
        }
        defer f.Close()

        //handle, err = pcap.OpenLive(device, snapshot_len, promiscuous, timeout)
        //if err != nil {
        //        log.Fatal(err)
        //}
        //defer handle.Close()

        //handle.WritePacketData(outgoingPacket)
        w := pcapgo.NewWriter(f)
        w.WriteFileHeader(uint32(snapshot_len), layers.LinkTypeEthernet)
        w.WritePacket(ethpacket.Metadata().CaptureInfo, ethpacket.Data())
       

这是我得到的错误。请帮助如何进一步进行

[root@centos-sqa-blr01 gopacket]# go run create_pcap.go
#命令行参数
./create_pcap.go:75:26: packet.MetaData undefined(类型gopacket.Packet没有元数据字段或方法,但有元数据)

【问题讨论】:

    标签: go gopacket


    【解决方案1】:

    注意错误信息:“元数据”不是“元数据”。

    猜你需要修改:

    -            w.WritePacket(packet.MetaData().CaptureInfo, ethpacket.Data())
    +            w.WritePacket(packet.Metadata().CaptureInfo, ethpacket.Data())
    

    更新:

    如果你只是想创建和编写一个数据包,请注释以下代码。它对我有用。

        // handle, err = pcap.OpenLive(device, snapshot_len, promiscuous, timeout)
        // if err != nil {
        //  log.Fatal(err)
        // }
        // defer handle.Close()
    

    【讨论】:

    • 谢谢@p1gd0g。我纠正了错误,但 pcap 仍然是空的,没有数据包。
    • 请给我们一个可执行性最低的例子。 @mmeda
    • 我已经编辑了我的原始代码。所以你看到的代码就是我执行的。如果您需要更多详细信息,请告诉我
    • 感谢@p1gd0g,我通过注释这些行来运行更新的代码。我看到执行程序时没有错误。但是,pcap 文件是空的。它不包含任何数据包
    • @mmeda 文件存在吗?你可以运行ls -l 来显示文件大小吗?
    猜你喜欢
    • 1970-01-01
    • 2018-11-06
    • 2015-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-24
    相关资源
    最近更新 更多