-1

nfcapd バイナリ ファイルからソース IP と宛先 IP に関する情報を取得する必要があります。問題はファイルのサイズにあります。非常に大きな (1 GB を超える) ファイルを io または os パッケージで開いて読み取るのは望ましくないことはわかっています。

これが私のハッキングとドラフトの開始です:

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 パッケージで読み取った後に同時に処理したい。しかし、分割中にデータを失うことなくそれを行う方法は想像できません。

コードまたは説明で何かを見逃した場合は、修正してください。私は自分のソリューションを Web で検索し、別の可能な実装について考えることに多くの時間を費やしています。

ヘルプやアドバイスをいただければ幸いです。

ファイルには次のプロパティがあります(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

すべてのプロパティは独自の列にあります。

更新 1: 残念ながら、nfcapd を使用してディスクに保存した後、バイナリ ファイル構造の違いにより、netflow パッケージでファイルを解析することはできません。この回答は、nfdumpの寄稿者の1 人によって提供されました。

現在唯一の方法は、 pynfdump のような go プログラムで端末から nfdump を実行することです

将来的に考えられる別の解決策は、 gopacketを使用することです。

4

1 に答える 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))

解析が完了したら、チャンクを個別に処理する必要がある場合は、レコードを分割できます。

于 2016-10-25T15:51:52.033 に答える