IP アドレスのバルク データセットに対してローカライズされた大量の ASN ルックアップを実行する
ドキュメントの上部にリンクされている 2 つの BGP データセット (http://thyme.apnic.net/current/data-raw-table および http://thyme.apnic.net/current/data-used-autnums) をダウンロードします。 。これらの最初のものには、IANA から割り当てられたすべてのサブネット範囲とそれに関連付けられた ASN 番号が含まれています。 2 番目は ASN 番号と記述子のリストです。 http://thyme.apnic.net で説明されているように、どちらも毎日午前 4 時から午前 9 時 +10GMT の間に更新されます。これら 2 つのファイルと、uniq_ip.txt という名前の検索する IP のリストを、ip2asn.py スクリプトと同じフォルダー内に配置します。 Bulk-ip-to-asn-correlation.py を実行すると、識別されたすべての無効な IP アドレス (ローカル アドレスと予約アドレスを含む) のリストを含む ip2asn--invalids.txt と、CSV を含む ip2asn-results.txt の 2 つの出力ファイルが提供されます。タイムスタンプ、ip、asn、「asn 記述子」のヘッダーを持つフォーマットされた結果。
提供された IP アドレスと、IANA から登録されているそれに関連付けられたサブネットの間の関連付けを実行する最も効率的な方法を見つけるのに、しばらく時間がかかりました。
私の実装の鍵は、https://docs.python.org/3/library/bisect.html の最初の「その他の例」で説明されており、そこでは、採点スケールに基づいて文字の成績をテストのスコアに関連付けています。
すべての IP アドレスは計算のために整数値に変換されることに注意してください。
まず、各 CIDR プレフィックスに含まれる IP アドレスの総数 (/1 から /32) のタプルを作成し、それらを NETMASK_MAP に保存します。提供されたファイルから検索される IP アドレスのクリーンなリストを作成し、無効なアドレスを除外すると思います。このプロセス中に、クエリ アドレスの最初のオクテットの一意のリストも抽出します。これは、BGP データ セットから不要な範囲の多くをフィルタリングするために利用されます。
次に、IANA 登録サブネットとそれぞれの ASN を含むデータ生テーブル ファイルを利用して 2 つのルックアップ テーブルを構築します。 BGP データ セット内のサブネットごとに、最初のオクテットがクエリ IP アドレスのオクテットの UNIQ リストに含まれているかどうかを最初に判断します。そうであれば、指定された CIDR 範囲内の最大 IP アドレス (calculate_net_rage()) を計算します。これらの最大 IP は subnet_lookup_table に追加されます。 2 番目のテーブル asn_lookup_table が順番に作成され、各最大 IP アドレスに対応する ASN 番号が含まれます。これは、subnet_lookup_table がブレークポイント変数であり、asn_lookup_table が文字の成績である、成績二分法の例に従います。
次に、data-used-autnums BGP データ セットから、ASN 番号とその記述子テキストの相関関係を含む最終テーブルを構築します。
最後に、クリーンなクエリ リスト内の IP アドレスごとに、リンクされた Python ドキュメントで説明されているように二分法を実行して、指定された IP が該当する最大 IP アドレスとそれに関連付けられた ASN 番号を関連付けます。次に、それが記述子テキストに関連付けられます。
あなたが提供したIPが存在しない場合、何が起こるかわかりません。おそらく爆発するでしょう。幸運を。