ソースIPと宛先IPに関する情報をnfcapdバイナリファイルから取得する必要があります。問題はファイルのサイズにあります。私はioまたはosパッケージで非常に大きなファイル(1 GB以上)を開いて読み込むことは望ましくないことを知っています。私は同時にnetflowpackageを読んだ後、24のフローやプロセス、それを持つチャンクにファイルを分割したい大きなnfcapdバイナリファイルからIPアドレスを取得する
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)
}
:
は、ここに私のハッキング、ドラフトスタートです。しかし、私は分割中にデータを失うことなくそれを行う方法を想像していません。
私がコードや説明で何かを忘れた場合は、私に修正してください。私は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
すべてのプロパティは、自身のコラムです。
UPDATE 1: は残念ながら、それはnfcapd介してディスク上に保存した後によるバイナリファイルの構造の違いにNetFlowのパッケージを使用してファイルを解析するimpossibleです。この回答は、nfdumpの寄稿者のoneによって与えられました。
唯一の方法は、pynfdumpのようなgoプログラムで端末からnfdumpを実行することです。
今後別のpossibleソリューションは、gopacketを使用します。
このnfcapdバイナリファイルの構造は何ですか?それは実際に合理的に構造化された行を持つテキストファイルですか?あなたの問題はファイルを効率的に読む方法がわからないか、あるいはIPの解析にも助けが必要なのでしょうか?私はGitHubの要旨の例の出力ファイルを発見した – HenryTK
:私はそれを非常に大規模なバージョンを仮定しますhttps://gist.githubusercontent.com/asachs/bfbfebdb39b33a5ded61/raw/319f206b29e5b7a046e48768f24b4be0f5e2f07c/gistfile1.txt は、あなたが扱っているものです。 – HenryTK
@HenryTKファイルに関する詳細を追加しました。私は今、ファイルを効率的に読み込み、IPを解析する方法を知らない。私はゴランの初心者です。 – memu