tcpdump は、フィルタの解析に O(n²) 時間がかかります。

tcpdump は、フィルタの解析に O(n²) 時間がかかります。

私はtcpdump次のようなフィルタを使って実行しています。

 not (
     (host 1.165.155.169 and port 4444)
  or (host 1.168.68.116 and port 4444)
  or (host 1.173.192.253 and port 4444)
  or (host 1.174.97.43 and port 4444)
  :
  or (host 161.138.104.1 and port 58339)
)

私の問題は、tcpdump開始にO(n²)時間がかかり、何百もの行があることです。起動すると素晴らしい動作します。初期化のみ O(n²) で正常に処理されないようです。

フィルタとランタイムの行tcpdump初期化をO(n)または少なくともO(n log n)に最適化する方法はありますか?

<ip,port> テーブルがあります。

編集する

あなたの考えに感謝します。これまで、彼らはすべてO(n²)を提供しました。

私があなたのアイデアをテストするのを待つ理由はありません。テスト用のスクリプトは次のとおりです。

#!/bin/bash                                                                              

# Make some network noise                                                                
(sudo nice nice ping -f localhost >/dev/null) &
noisepid=$!

filter() {
    # $1 = How many entries?                                                             
    perl -e '                                                                            
        $pre = "not (";                                                                  
        $post = ")";                                                                     
        $join = " and ";                                                                 
        sub hostport {                                                                   
          $host = sprintf "%d.%d.%d.%d", rand()*255,rand()*255,rand()*255,rand()*255;    
          $port = sprintf "%d", rand()*65535;                                            
          return "(host $host and port $port)";                                          
        }                                                                                
        print $pre, join($join,map { hostport() } 1..shift), $post;                      
    ' $1
}
export -f filter

seq 400 | parallel --joblog my.log 'sudo tcpdump -ni any "`filter {}`"|read a'
kill -9 $noisepid
# field - https://codeberg.org/tange/tangetools/src/branch/master/field                  
# plotpipe - https://codeberg.org/tange/tangetools/src/branch/master/plotpipe            
field 14,4 < my.log | sort -n | plotpipe

tcpdump -F fileより高速ですが、まだO(n²)です。

編集2:

他のサーバーで再描画されたグラフ(たとえば、前のグラフと数字を比較できません)tcpdumptcpdump -O

-Oの有無にかかわらず

-O状況をさらに悪化させることは明らかです。

ベストアンサー1

これはバグのように見えます。提出しましたhttps://github.com/the-tcpdump-group/libpcap/issues/1255

解決策が見つかったら、答えを投稿してください。

おすすめ記事