
1 秒あたり最大 10 件の要求のみを処理できるサービスがあり、この数がどれくらいの頻度を超えているかを監視する必要があります。私はtcpdump、ss、netstat、ntopのさまざまなソリューションを見ましたが、私の要件を満たすソリューションはないようです。モニタリングは2つのスクリプトに分割する必要があると思います。 tcpdumpを介してrootとして実行してデータを収集します。例:
tcpdump -i eth0 src ldapproxy and port ldap and '(tcp-syn|tcp-ack)!=0'
その後、出力を分析し、最後の確認以降に1秒あたりの最大クエリ数を提供する別のスクリプトがここでブロックされます。
答え1
始めるのに役立ついくつかの内容は次のとおりです。
awk '/ > /{
split($1,t,":"); time = (t[1]*60+t[2])*60+t[3]
diff = time-lasttime; lasttime = time
event[++i] = diff; window += diff; tod[i] = $1
while(window>=1){
window -= event[1]
for(j=1;j<i;j++){
event[j] = event[j+1]
tod[j] = tod[j+1]
}
i--
}
if(i+1>10) printf "%d events in %f secs at %s\n",i+1,window,tod[i]
} '
event
1秒実行ウィンドウのすべてのタイムスタンプを(配列に)保持します(浮動小数点秒に変換)。新しいイベントが範囲外になると、最初に記録されたイベントが削除され、すべてのイベントが1ビット未満に移動されます。i
常に相対時間がゼロのウィンドウの開始に対応するイベントを除いて、存在するイベントの数を示します。数値が10を超えると、スクリプトはウィンドウ内のイベント数を印刷します。出力例:
11 events in 0.962827 secs at 14:53:51.262827
このパターンは/ > /
着信パケットにのみ一致します。興味のある行に合わせて改善する必要があるかもしれません。