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 を実行することです。