2006年3月20日

查詢指定 IP 所屬國別

最近因公務所需調閱了一些網站的登入資訊,將有問題的 IP 記錄回覆給公司法務單位。

在查詢的過程中發現可以透過 DNS 反查 IP 所在網域,如下例(某廣告信來源 IP):

ada@gentoo ~ $ dig -x 125.250.18.250

; <<>> DiG 9.3.2 <<>> -x 125.250.18.250 ;; global options: printcmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 4229 ;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 0

;; QUESTION SECTION: ;250.18.250.125.in-addr.arpa. IN PTR

;; AUTHORITY SECTION: 250.125.in-addr.arpa. 1199 IN SOA a.dns.kr. inverse.nic.or.kr. 2005110202 21600 900 604800 43200

;; Query time: 45 msec ;; SERVER: 168.95.192.1#53(168.95.192.1) ;; WHEN: Mon Mar 20 15:25:16 2006 ;; MSG SIZE rcvd: 124

就前述這個例子而言可以知道該 IP 是配給韓國的,但更多時候會發現查到的是國際位址管理單位(如 APNIC):

ada@gentoo ~ $ dig -x 220.174.217.29

; <<>> DiG 9.3.2 <<>> -x 220.174.217.29 ;; global options: printcmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 11019 ;; flags: qr aa rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 0

;; QUESTION SECTION: ;29.217.174.220.in-addr.arpa. IN PTR

;; AUTHORITY SECTION: 220.in-addr.arpa. 172800 IN SOA ns1.apnic.net. read-TXT-record-of-zone-first-dns-admin.apnic.net. 2006031595 7200 1800 604800 172800

;; Query time: 247 msec ;; SERVER: 168.95.192.1#53(168.95.192.1) ;; WHEN: Mon Mar 20 15:31:20 2006 ;; MSG SIZE rcvd: 134

還好,我們還有 IP to Country 查詢服務 ,前述 IP 檢查的結果是: IP Address 220.174.217.29 belongs to China.

這是怎麼做到的?說起來只是一個查表動作而以,比較討厭的只有這個對應表的維護。但是感謝天,原來網路上早就有這麼一份完整的對照表:The IP-to-Country Handbook,更令人激賞的是這份對照表可以免費使用(不過有些 授權規定)。

取得這份資料後,開始考慮看能不能放到 SnipSnap 中當成一個 Macro。

考慮點:

  1. 資料筆數有 63726 筆,而且看起來只會繼續增加。
  2. 筆數多,佔用空間就大。以一筆記錄最多佔 32 bytes,最少佔 20 bytes 來計算的話約要佔掉 1.2MB 到 2.0MB 之間。
  3. 佔用空間大,保存方式就變成一個重大問題:
    1. 全部塞到 SnipSnap 同一個資料庫去:由於 SnipSnap 提供了多種資料儲存方式,因此在更新資料庫時會變的複雜。
    2. 以文字檔保存,可以提供資料庫更新時的最大彈性:
      1. 全部載入記憶體:對一個預設的 JRE 環境而言,很可能造成 OutOfMemory 的執行時期錯誤。
      2. 僅載入特定欄位:降低/免除 OutOfMemory 執行時期錯誤的發生率,但也同時限制了使用方式(例如只顯示國旗或僅英文代碼)。
      3. 載入 IP 起始位址及檔案中的記錄點:最省記憶體空間的方式,缺點是要對資料庫檔案長時間保持開啟狀態(另套 Java 版的 Blog 系統 blojsom 採用此法)
決定:
  1. 我想以載入 IP 起始位置、二碼簡稱、三碼簡稱為主。其中二碼簡稱可以作為國旗圖檔檔名,三碼簡稱可以作為文字輸出之用。
  2. 使用二維陣列儲存。
  3. 提供輸出國旗圖檔或文字輸出選項。
  4. 有空再來寫!