對 IP 位址的批次資料集執行本地化的批次 ASN 查找
下載文件頂部連結的兩個 BGP 資料集(http://thyme.apnic.net/current/data-raw-table 和 http://thyme.apnic.net/current/data-used-autnums) 。其中第一個包含 IANA 分配的所有子網路範圍及其關聯的 ASN 號碼。第二個是 ASN 編號和描述符的清單。它們每天都會在格林尼治標準時間 +10 點之間進行更新,如 http://thyme.apnic.net 所述。將這兩個檔案以及您要尋找的名為 uniq_ip.txt 的 IP 清單放在與 ip2asn.py 腳本相同的資料夾中。執行bulk-ip-to-asn-correlation.py 您將獲得兩個輸出檔案– ip2asn--invalids.txt 包含所有已識別的無效IP 位址(包括本機和保留位址)的清單和ip2asn-results.txt 包含csv格式化結果,標頭為時間戳記、ip、asn、「asn 描述子」。
我花了一段時間才找到最有效的方法來執行所提供的 IP 位址與其從 IANA 註冊的關聯子網路之間的關聯。
我的實現的關鍵在 https://docs.python.org/3/library/bisect.html 的第一個「其他範例」中進行了解釋,其中它們根據評分標準將字母等級與測試分數相關聯。
請注意,所有 IP 位址都將轉換為其整數值以進行計算。
首先,我建立每個 CIDR 前綴中包含的 IP 位址總數(從 /1 到 /32)的元組,並將其儲存在 NETMASK_MAP 中。我認為創建一個乾淨的 IP 位址列表,將從提供的文件中找到該列表,過濾掉無效地址。在此過程中,我還為我們的查詢地址提取了第一個八位元組的唯一清單。這將用於從 BGP 資料集中過濾掉許多不需要的範圍。
接下來,我利用包含 IANA 註冊子網路及其各自 ASN 的 data-raw-table 檔案來建立兩個查找表。對於 BGP 資料集中的每個子網,我們首先確定第一個八位元組是否包含在查詢 IP 位址的八位元組的 uniq 清單中。如果是,我們接著計算指定 CIDR 範圍內的最大 IP 位址 (calculate_net_rage())。這些最大 IP 數量將會加入subnet_lookup_table 中。第二個表 asn_lookup_table 是依序建立的,其中包含每個最大 IP 位址對應的 ASN 編號。這遵循成績平分範例,其中subnet_lookup_table 是斷點變量,asn_lookup_table 是字母成績。
然後,我們根據 data-used-autnums BGP 資料集建立最終表,其中包含 ASN 編號與其描述符文字的相關性。
最後,對於清理後的查詢清單中的每個 IP 位址,我們會依照連結的 Python 文件中的概述執行二等分,以關聯給定 IP 所屬的最大 IP 位址及其關聯的 ASN 編號。然後將其與描述符文字相關聯。
如果你提供的IP不存在我不知道會發生什麼事。它可能會爆炸。祝你好運。