多くの IT 企業では、アルゴリズムは面接で非常に重要な部分を占めていますが、実際の仕事でアルゴリズムに遭遇することはほとんどなく、あまり実用的ではないと不満を言う人も多くいます。弊社が面接でよく使う質問について解説します。最下層では非常にシンプルなアルゴリズムが使われていますが、実際の業務では比較的見やすいシナリオである、大規模なブラックリストIPマッチングについて解説します。同時に、セキュリティ ゲートウェイで開発した例を使用して検証を行います。
問題とシナリオ 質問: IP セグメントのリストは膨大にあり、特定の IP がそれらのいずれかに属しているかどうかをすばやく確認する必要があります。 これは実際にはよくある問題です。当社のセキュリティ ゲートウェイを例にとると、少なくとも次のシナリオで必要になります。 シナリオ 1: 単純なブラックリストとホワイトリストのマッチング ゲートウェイの場合、ブラックリストとホワイトリストのマッチングは基本的な機能です。
シナリオ2: 実際のIPアドレスを取得する 実際の IP アドレスを取得することは、トラフィックのソース パスが異なる可能性があるため、一部の Web サイトにとっては非常に厄介な問題です。
同様の参考として、nginx の real ip 関数を参照できます。原理も比較的単純です。「set_real_ip_from 192.168.1.0/24;」のようなステートメントを通じて内部 IP リストを設定できます。このように、XFF ヘッダーを処理するときに、後ろから前に向かって検索し、再帰モードで、内部 IP ではない最初の値、つまり実際の IP を見つけます。これでこの記事の質問に戻ります。 シナリオ 3: トラフィックのラベル付け この部分の機能は、バックエンドのビジネスモジュールによって実装されることが多いです。製品を開発する際には、リクエストが来たときに何らかの自動アノテーションを行って、バックエンドの負担を軽減したいと考えています。より便利なものは次のとおりです。
上記のシナリオは、比較的簡単に遭遇する大規模な IP セグメント リストを照合するいくつかのアプリケーション シナリオについて説明しています。 2. アルゴリズムの説明 アルゴリズム 1: ハッシュマップ ほとんどの人の最初の反応は、ハッシュマップを使用して一致させることですが、これは理論的には可能です (ネットワーク セグメントを独立した IP に分割する) が、基本的には使用できません。
したがって、ハッシュマップ方式はクエリには効率的ですが、実装レベルでは実現可能ではありません。 アルゴリズム2: ネットワークセグメントリストの順次マッチング 現在、ほとんどのオープンソース実装がこの方式を採用していることがわかります。たとえば、シナリオの段落で説明した nginx の 2 つの機能モジュールは、accss モジュールと realip モジュールにあります。これらは、設定を cidr リストとして保存し、それらを 1 つずつ照合します。別の実装は、openresty の lua-resty-iputils モジュールです。このコードはより直感的に見えます。
オープンソース実装は、ほとんどの単純なシナリオを処理するのに十分ですが、その後のテストでは、IP セグメントの数が増えると、パフォーマンスがまだ不足していることが示されています。 アルゴリズム3: 二分探索 実際のアルゴリズムは非常にシンプルで、バイナリ検索を使用するだけです。これらの IP セグメントが互いに隣接していないと仮定して、図に示すように、Java に似たバイナリ検索を使用します。 隣接していない 4 つの IP セグメント A、B、C、D があるとします。各セグメントは、開始 IP の整数表現と終了 IP の整数表現の 2 つの数値に変換できます。たとえば、0.0.0.0/24 は [0, 255] に変換できます。このように、4 つのネットワーク セグメントは 8 つの数字に変換され、並べ替えることができます。ネットワーク セグメントは互いに隣接していないため、図に示すように、1 つの IP セグメントが別の IP セグメントに接続されている必要があります。このマッチングアルゴリズムはよりシンプルになります:
したがって、アルゴリズム全体は非常にシンプルですが、ネットワーク セグメントが互いに隣接していないことを前提としているため、見落とされがちです。以下は簡単な説明です。 任意の 2 つのネットワーク セグメント A と B には、次の 3 つの関係があります。
上の図は、任意の 2 つのネットワーク セグメントを示しています。
それで:
したがって、元データがある程度前処理されていれば、バイナリ検索は安全かつ効果的な方法です。 3. テストデータ 最近はかなり多くの携帯電話が発売されているので、私たちもその傾向を追ってスコアを計算してみます。
テスト1: ベンチマークテスト
テスト2: 10,000個のブラックリスト + ハッシュマップ
テスト 3: 10,000 個のブラックリスト + lua-resty-utils モジュールの順次検索
テスト4: 10,000個のブラックリスト + バイナリ検索
テスト データから、バイナリ検索はハッシュに基づくパフォーマンスに近いパフォーマンスを、メモリ消費量を大幅に削減しながら達成できることがわかります。一方、単純な順次トラバーサルでは、パフォーマンスが桁違いに低下します。 [この記事は51CTOコラム「千安科技」のオリジナル記事です。転載についてはWeChatパブリックアカウント(bigsec)を通じて原作者にご連絡ください] この著者の他の記事を読むにはここをクリックしてください |
<<: 高校の授業に人工知能が進出。全国40校がこの教材を導入
>>: 機械学習とデータサイエンスに関する必読の無料オンライン電子書籍 10 冊
11月29日、米国時間火曜日に開催されたReinventカンファレンスにおいて、アマゾンのクラウドコ...
あなたに関するあらゆることが、さまざまな形で世界に明らかにされています。 [[387859]] 3月...
[[421224]]ハイパーオートメーションがネットワークとデータ セキュリティに与えるプラスの影響...
脅威の状況が絶えず変化する中、高度なサイバー攻撃に対する防御手段として、生成型人工知能 (GAI) ...
650 億パラメータの大規模モデルの事前トレーニング ソリューションは、リリース時にオープン ソース...
この記事はAI新メディアQuantum Bit(公開アカウントID:QbitAI)より許可を得て転載...
現在、より成熟し、広く使用されているインテリジェント テクノロジーにはどのようなものがありますか? ...
[[419471]]小文字で構成される文字列 S が与えられた場合、重複削除操作は隣接する 2 つの...
[[348678]] 5G、人工知能、ブロックチェーンなどの新技術の継続的な進歩は、あらゆる企業の変...
2024 年までに、AI は少なくとも 3 つの異なる方法で顧客体験 (CX) に影響を与えるでしょ...
[[432622]] 【51CTO.com クイック翻訳】はじめにこのプロジェクトでは、簡単なコード...
生体認証技術は、市場に登場した最新の AI イノベーションのおかげで、特に 2021 年には長年にわ...