首页 文章

从大nfcapd二进制文件中获取IP地址

提问于
浏览
-1

我需要从nfcapd二进制文件中获取有关源IP和目标IP的信息 . 问题在于文件大小 . 我知道用io或os包打开和读取非常大(超过1 GB)的文件是不可取的 .

这是我的黑客攻击和选秀开始:

package main

import (
    "fmt"
    "time"
    "os"
    "github.com/tehmaze/netflow/netflow5"
    "log"
    "io"
    "bytes"
)

type Message interface {}

func main() {
    startTime := time.Now()
    getFile := os.Args[1]
    processFile(getFile)
    endTime := time.Since(startTime)
    log.Printf("Program executes in %s", endTime)
}

func processFile(fileName string) {
    file, err := os.Open(fileName)
    // Check if file is not empty. If it is, then exit from program
    if err != nil {
        fmt.Println(err)
        os.Exit(1)
    }

    // Useful to close file after getting information about it
    defer file.Close()
    Read(file)
}

func Read(r io.Reader) (Message, error) {
    data := [2]byte{}
    if _, err := r.Read(data[:]); err != nil {
        return nil, err
    }
    buffer := bytes.NewBuffer(data[:])
    mr := io.MultiReader(buffer, r)
    return netflow5.Read(mr)
}

我想将文件分成24个流程,并在阅读netflow package后同时处理它 . 但是我没想到如何做到这一点而不会在分裂期间丢失任何数据 .

如果我错过了代码或描述中的内容,请修复我 . 我花了很多时间在网上搜索我的解决方案并考虑其他可能的实现 .

任何帮助和/或建议将受到高度赞赏 .

文件具有以下属性(终端中的命令 file -I <file_name> ):

file_name: application/octet-stream; charset=binary

命令 nfdump -r <file_name> 之后的文件输出具有以下结构:

Date first seen          Duration Proto      Src IP Addr:Port          Dst IP Addr:Port   Packets    Bytes Flows

每个属性都在自己的列上 .

UPDATE 1: 不幸的是,由于二进制文件结构不同,通过nfcapd将文件保存到磁盘后,用netflow包解析文件是impossible . 这个回答是nfdumpnfdump贡献者给出的 .

现在唯一的办法是在go程序中运行nfdump,如pynfdump .

未来的另一个解决方案是使用gopacket .

1 回答

  • 0

    在解析文件时,IO几乎总是会成为限制因素,除非涉及大量计算,否则串行读取单个文件将是处理它的最快方法 .

    将文件包装在 bufio.Reader 中并将其提供给 Read 函数:

    file, err := os.Open(fileName)
    if err != nil {
        log.Fatal((err)
    }
    defer file.Close()
    
    packet, err := netflow5.Read(bufio.NewReader(file))
    

    解析后,如果需要单独处理块,则可以拆分记录 .

相关问题