
そこで、DDOS攻撃を受けている間にこれをハックしていたずらログから ips を削除します。改善点や改善のための提案はありますか?
全体的な考え方は次のとおりです。
- ログファイルから IP のみを取得します
- 並べ替える
- ユニークで数える
- もう一度並べ替える
そして弦楽器のパイプ:
cut --delim " " -f7 /var/log/apache_access | sort | uniq -c | sort -rn > sorted-ips.txt
答え1
私はいつもこれを使っています:
tail -1000 /var/log/apache_access | awk '{print $1}' | sort -nk1 | uniq -c | sort -nk1
tail
実際にどのくらい遡りたいかの制限を設定できます。ログローテーションを使用しない場合(何らかの理由で)便利です。2 番目に私が利用しているのは、ほとんどawk
のログがスペースで区切られているため、適切な変数を追加することで追加情報(アクセスした URL、ステータス、ブラウザーなど)を引き出すことができる機能です。最後に、接触するペアでのみ機能する$
という欠点があります。つまり、次のようになります。uniq
A
A
A
A
B
A
A
以下が生成されます:
4 A
1 B
2 A
望ましい出力ではありません。したがって、最初の列 (この場合は IP ですが、他の列を並べ替えることもできます) を並べ替え、次にuniq
それらを並べ替え、最後にカウントを昇順に並べ替えて、最も違反が多いものを確認できるようにします。
答え2
どうやらあなたは今、失敗2バン車輪。
fail2ban を見てください。おそらく、すでに必要な機能が備わっていますが、そうでない場合は簡単にカスタマイズできます。
答え3
awk
Marco Ceppi は、これに適したツールであることは正しいですが、ロジックを に移動できるため、sort
やよりも awk の方が優れたツールです。 1000 行を tail するだけなら大した違いはありませんが、数ギガバイトの巨大なログ ファイルを参照する場合は、 に移動した方が桁違いに高速化できます。uniq
awk
awk
cat /var/log/apache_access | awk '{freq[$1]++} END {for (x in freq) {print freq[x], x}}' | sort -n
必要な処理は実行できますが、大きなファイルの場合ははるかに高速です。IP アドレスをキーとして、IP の出現回数を値として使用して、awk で IP の配列を作成します。
awk はデータを 1 回処理するだけで、最終出力のソート以外のほとんどの作業を行うため、速度が向上します。他の方法を使用すると、転送ログに 1,000,000 行がある場合、awk は 1,000,000 行を読み取り、1,000,000 個の IP を吐き出し、次に sort が 1,000,000 個の IP 全体を処理し、ソートされた 1,000,000 個の IP を uniq に送信します。uniq は、sort に渡す前に、データをはるかに少ない量に減らします。1,000,000 個の IP をパイプしたり、複数のパスを実行したりする代わりに、awk は 1 回のパスでほぼすべてを実行します。
私のラップトップで 5,513,132 行の Apache ログ (1.1 GB) を使用して、速度を比較します。
- 2分45秒
cat ./apache_access | awk '{print $1}' | sort -nk1 | uniq -c | sort -nk1
- 0分40秒
cat ./apache_access | awk '{freq[$1]++} END {for (x in freq) {print freq[x], x}}' | sort -n