そのため、DDOS攻撃を受けている間にこれを一緒にハッキングして、ログからいたずら ipsを引き出しました。誰かがそれをより良くするための改善や他の提案がありますか?
一般的な考え方は次のとおりです。
そして文字列o 'パイプ:cut --delim " " -f7 /var/log/Apache_access | sort | uniq -c | sort -rn > sorted-ips.txt
私はいつもこれを使用しました:
tail -1000 /var/log/Apache_access | awk '{print $1}' | sort -nk1 | uniq -c | sort -nk1
tail
を使用すると、本当に行きたい距離の制限を設定できます。ログローテーションを使用しない場合は(何らかの理由で)、次にawk
-ほとんどのログはスペースで区切られているため、適切な$
変数を追加することで、追加情報(おそらく、ヒットしたURL、ステータス、ブラウザーなど)を引き出すことができます。最後に、uniq
の欠陥は、タッチペアでのみ機能します-IE:
A
A
A
A
B
A
A
生成されます:
4 A
1 B
2 A
望ましい出力ではありません。したがって、最初の列(この場合はipsですが、他の列も並べ替えることができます)、次にuniq
を並べ替え、最後にカウントを昇順で並べ替えて、最も高い違反者を確認します。
fail2ban ホイールを再発明している最中のようです。
Fail2banを見てください。それはおそらくあなたがすでに望んでいることをします、そしてそうでなければ、それはカスタマイズするのが簡単です。
Marco Ceppiは、awk
がこのための優れたツールであることについて正しいですが、awkはsort
やuniq
よりも優れたツールです。これは、そのロジックをawk
。 1000行をテーリングするだけの場合は大きな違いはありませんが、巨大なマルチギグログファイルを確認する場合は、それを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 IPを吐き出す1,000,000行を読み取り、ソートは1,000,000 IP全体を処理し、ソートされた1,000,000 IPをuniqに送信します。これにより、はるかに小さい値に削減されます。ソートする前のデータ量。 1,000,000 IPで複数のパスをパイプする/実行する代わりに、awkは1つのパスでほとんどすべてを実行します。
ラップトップで5,513,132行のApacheログ(1.1ギグ)を使用して、速度を比較します。
cat ./Apache_access | awk '{print $1}' | sort -nk1 | uniq -c | sort -nk1
_cat ./Apache_access | awk '{freq[$1]++} END {for (x in freq) {print freq[x], x}}' | sort -n