ログのIPv6 GUA(グローバルユニキャストアドレス)と*のみ*一致する正規表現

ログのIPv6 GUA(グローバルユニキャストアドレス)と*のみ*一致する正規表現

IPv6セキュリティのためのツールがほとんどないので、後でソースを公開する独自のソリューションをリリースしたいと思いました。 SO:ログの多い使用量の多いサーバーでの潜在的なブロックを防ぐために、リモートIPv6接続ログをフィルタリング、分析、および処理する正規表現が必要です。だから私は一致する正規表現だけに興味があります。本物(実際)IPv6グローバルユニキャストアドレス(「グア"). 無効なアドレスをブロックする価値はないので、IPv6 アドレス設定を検証することをお勧めしますが、必須ではありません。

これが(やや)難しい理由:

IPv6アドレスが圧縮される(前のゼロが圧縮される)ため、アドレスは単一のコロンと単一のセミコロンに分けることができます。そして二重セミコロンのセットです。そして二重セミコロンは、アドレスがどのように圧縮されるかに応じて異なる場所に現れることがあります!最後に、コロンで区切られたアドレス文字の数も可変です。

したがって、私が探している正規表現の目標は、次のいくつかの例のいずれかと同じです。

2001:db8:800:400::130
2001:db8:800:400::2:135
2001:db8:d::55:1
2001:db8:1ff:8c0:151:164:108:23

私は上記の内容がこの混乱した状況に合った正規表現を作成するのが難しいことを実際に示していると思います。

正規表現の予想出力:

  • 精密: 一致ただ有効な GUA アドレス。ログの一部またはローカルGUAではありません。
  • grepシングルのみgrepパイプがgrep通過しないgrep...
  • 優れた:正規表現はCPUリソースを消費する可能性があります。 1回の回答(現在削除済み)は、終了するまで完了せずにほぼ3時間実行されました。
  • テスト済み:テストは簡単ですので、公開する前に正規表現が正しく一致していることを確認してください。当然のようですが…

例:

grep "your RegEx Goes Here" /var/log/messages | sort -u

迅速で正確でパフォーマンスに優れた素晴らしいGUAアドレスのリストを提供する必要があります。

例 grep の出力は、目的の出力を示しています。

任意に選択できる:

正規表現は、少なくとも.NETファイル内の実際の完全なGUA IPv6アドレスを識別する必要があります/var/log/messagesしかし、: 正規表現がすべての入力を検証し、アドレス設定が有効であることを確認できれば、より良いです!

投稿してくださいペーストビン誰もが結果を表示して比較できるように、テスト結果を提供します。同じサーバーに公開されているすべての正規表現を実行して、結果とパフォーマンスを比較します。最も優れており、パフォーマンスに優れ、最も正確な正規表現は天才性を認められ、オープンソースソリューションに使用されます。

答え1

修正する:

後ろにこんにちは以前の正規表現に範囲がないことがわかった後、最初から書き直してテストし、4300を超える結果のサンプルを確認しました。また、確認できるように貼り付けボックスが新しい結果に更新されます。正しいようですが、きれいで独立した目で判断するのが最善です。

メモ:

3000:0000::/4次の正規表現はテストされ3ffe::/16、およびを除いて、GUAアドレス指定で指定されたIANAグローバルアドレスユニキャスト割り当てを正しく処理することが確認されました5f00::/8。後者の2つの範囲は6つの骨のものであり、現在はもはや使用されていません。これらの範囲は返され予約されており、3000:0000::/4野生では見つからず、絶対に使用できません。だから私は私が選んだ正規表現を通してこれらの問題を解決しました。バグが見つかったというフィードバックが付いている場合は、反対票を歓迎します。実際、私は私のアイデアをよく調べるためにここに記事を投稿しています。 ;-)

解決策:

IPv6 RegExに関するさまざまなスタックサイトで見つけた他のすべての質問は、IPv6アドレス指定のキッチンシンクと一致するには広すぎるスペクトルをカバーしています。grepIPブラックリストの出力を使用すること(私の究極の目標)であれば、精度が不足していることが大きな問題になる可能性があります。驚いたことに、Google検索でも結果が出ませんでした。

したがって、他の人が同じ問題を解決するのに時間を無駄にしないように、IPv6 GUAアドレスのみを一致させる方法を考えました。:

time grep -Eo "2[0-9a-fA-F]{3}:(([0-9a-fA-F]{1,4}[:]{1,2}){1,6}[0-9a-fA-F]{1,4})" /var/log/messages | sort -u >> /root/GUA-RegEx-Results.txt

テスト:

正規表現 - 私のテストでは*非常に忙しいDNSサーバー - 有効な一致のようです。IANAのグローバルアドレスユニキャスト割り当て。テストするときは、特に次のエラーを探しています。

  • 一部の GUA アドレス

テスト結果:

そのようなエラーは観察されず、私の結果を確認できます。ここ参考にしてください:このPastebinリストのどのアドレスからも悪用事例を推論してはいけません。)。

結果検証ツール:

IPv6 CIDR電卓

IPv6アドレス割り当てチェッカー

アドレスをコピーして確認し、上記のリンクでジングルを見つけたことを確認してください。

パフォーマンス:

1.5GB /var/log/messages ファイルをフィルタリングするために、次のパフォーマンスが観察されました。

有効な一意のIPv6アドレスを見つける:

  • 4345

スピード:

  • 実際の0メートル56.346秒
  • ユーザー0m28.916s
  • システム0m0.328s

もっとタイトでエレガントなものがあれば(オタクは楽しい正規表現の挑戦が大好きです。自分で挑戦してみましょう。) ぜひ答えに寄与してください。

関連情報