Feb 082010
 

利用 GeoIP 列出某地區的所有IP網段 - IT邦幫忙::IT知識分享社群

如何查詢地區性的所有IP網段 ? 這問題中,
主要是為解決如何擋某地區IP,
一般來說只要利用 GeoIP 的 資料檔及各程式的 API 來去做查詢,
就是最好的解決之道。

至於「如何列出某地區的所有IP網段」這問題,
雖然實務上的應用意義不大,
但的確蠻好奇怎麼找出來,
總算試出了怎麼從 GeoIP 的資料檔抓出來。

抓取原始資料

前往 http://www.maxmind.com/app/geolitecity 抓取
GeoLite City CSV Format
解開後裡面有:GeoLiteCity-Blocks.csv GeoLiteCity-Location.csv 兩檔。
http://www.maxmind.com/app/csv有說明各欄位的作用。
以抓取台灣IP為例:
在 GeoLiteCity-Location.csv
locId,country,region,city,postalCode,latitude,longitude,metroCode,areaCode
105645,"CN","30","Taiwan","",22.8167,111.6333,,
可知台灣的LocId是 105645
然後 用該碼查詢 哪些IP 範圍屬於 105645

  1. egrep \"105645\" GeoLiteCity-Blocks.csv > tw.txt
  2. # 欄位分別為:
  3. # startIpNum,endIpNum,locId
  4. "1019108336","1019108339","105645"
  5. "1019111992","1019111999","105645"
  6. "1019162952","1019162959","105645"
  7. "1032003320","1032003327","105645"
  8. "3663831056","3663831071","105645"
  9. "3663832512","3663832543","105645"
  10. "3663832800","3663832815","105645"
  11. "3663836032","3663836047","105645"
  12. "3663836608","3663836623","105645"
  13. "3663837136","3663837151","105645"
  14. "3663837408","3663837423","105645"
  15. "3663837504","3663837519","105645"

轉換樣式
1019108336代表什麼,用 ping 就看出來了:

  1. $ ping 1019108336
  2. PING 1019108336 (60.190.91.240) 56(84) bytes of data.

參考 http://en.kioskea.net/faq/945-converting-a-32-bit-integer-into-ip
一文的範例,
利用 perl 的簡單語法來轉換 tw.txt 裡的 ip 樣式:

  1. # 編輯本檔為 32bit2ip.pl
  2. $file = $ARGV[0];
  3. sub toip {
  4. $bit32 = @_[0];
  5. # $result = $bit32>>24,"." + $bit32<<8>>24,".",$bit32<<16>>24,".",$bit32<<24>>24;
  6. $a = $bit32>>24;
  7. $b = $bit32<<8>>24;
  8. $c = $bit32<<16>>24;
  9. $d = $bit32<<24>>24;
  10. return "$a.$b.$c.$d";
  11. }
  12. open(F,"./$ARGV[0]");
  13. while(<F>) {
  14. chomp;
  15. $_ =~ s/"//g;
  16. my($startIpNum,$endIpNum,$locId) = split(',',$_);
  17. #print "$startIpNum\n";
  18. $s = &toip($startIpNum);
  19. $e = &toip($endIpNum);
  20. print "$s-$e\n";
  21. }
  22. close F;

執行 perl 32bit2ip.pl tw.txt 獲得以下結果:

  1. 60.190.91.240-60.190.91.243
  2. 60.190.106.56-60.190.106.63
  3. 60.191.49.72-60.191.49.79
  4. 61.131.30.248-61.131.30.255
  5. 218.97.160.16-218.97.160.31
  6. 218.97.165.192-218.97.165.223
  7. 218.97.166.224-218.97.166.239
  8. 218.97.179.128-218.97.179.143
  9. 218.97.181.192-218.97.181.207
  10. 218.97.183.208-218.97.183.223
  11. 218.97.184.224-218.97.184.239
  12. 218.97.185.64-218.97.185.79

台灣哪有那麼少?
其實應用 Taipei 來找,代號應是 21248及106214,

  1. 21248,"TW","03","Taipei","",25.0392,121.5250,,
  2. 105628,"TW","03","Taipeihsien","",25.0392,121.5250,,
  3. 106214,"CN","07","Taipei","",24.9853,118.6453,,

在 Block 上就有 10211及5 行了…
台北縣也有19行。
所以要把一個區域的IP找出,要把可能的地區名稱都考慮進來。

參考資料:http://en.kioskea.net/faq/945-converting-a-32-bit-integer-into-ip

=====================================

http://ithelp.ithome.com.tw/question/10038057

如何查詢地區性的所有IP網段 ?

比如整個上海或整個香港 IP 段. 要怎查 ?
像一些遊戲公司他們是怎擋海外 IP 或擋大陸 IP 段的 ?
要怎找 ? 感謝

不是整部 server 擋喔, 因為公司的server 是拿 HP 用 VM 當 OS.
其中一個虛擬 server 裡的 IIS 管理員 ==> 打開後本機下有一堆網站.
是其中一個網站想在內容的目錄安全設定裡設定限制某區域的 IP 來訪存取.

2010-02-02 20:12:41 補充

不要叫我去中華電信申請 Router 上擋 IP 來源. 那整個server 所有網
站不就通通擋掉了. 只是其中一個網站要設而已. 3Q 喔.

2010-02-02 20:27:29 補充

------------------

時間:2010-02-03 09:13:28

簡言之:
利用 GeoIP 來判斷IP從何國家而來。

一般的作法:
通常是利用API來查詢 GeoIP 的資料庫檔案
根據查詢結果來決定要做什麼樣的回應。
以下是用 Ruby 的範例,查詢所會獲得的回應:

  1. $ irb -rubygems -rgeoip
  2. irb(main):001:0> g = GeoIP.new('GeoIP.dat')
  3. => #<GeoIP:0x9c5a770 @mutex=#<Mutex:0x9c5a754>, @flags=0, @databaseType=1, @record_length=3, @file=#<File:GeoIP.dat>, @databaseSegments=[16776960]>
  4. irb(main):002:0> g.country 'www.sohu.com'
  5. => ["www.sohu.com", "61.135.133.89", 48, "CN", "CHN", "China", "AS"]
  6. irb(main):003:0> g.country '61.135.133.1'
  7. => ["61.135.133.1", "61.135.133.1", 48, "CN", "CHN", "China", "AS"]

若要查詢細到什麼城市,則要下載 GeoLite City Binary Format 檔案,
查到的樣子是:

  1. irb(main):001:0> g = GeoIP.new('GeoLiteCity.dat')
  2. => #<GeoIP:0x9c4d148 @mutex=#<Mutex:0x9c4d0d8>, @flags=0, @databaseType=2, @record_length=3, @file=#<File:GeoLiteCity.dat>, @databaseSegments=[4140876]>
  3. irb(main):002:0> g.country '61.135.133.1'
  4. => ["61.135.133.1", "61.135.133.1", "CN", "CHN", "China", "AS", "22", "Beijing", "", 39.9289, 116.3883]

就可以依陣列的最後幾個元素來判斷給不給服務。

其他程式環境使用 GeoIP 的 API 可參考:
Linux/Unix 方面:
http://www.maxmind.com/app/linux
Windows 方面:
http://www.maxmind.com/app/windows

IIS 的目錄設定:
要在 Web Server 上設定,
就算是 Apache,也需要 mod_geoip 才跑得起來,
至於 IIS,可能至少要用 asp 或 .Net 才可有此機制,
可參考此範例修改:
http://www.codeproject.com/KB/asp/geoip.aspx
或用 google 找 asp geoip 找相關的經驗分享。

不大建議的做法:
要表列一個地區的IP,不是理想的做法。
光是台灣的IP應可參考:
http://rms.twnic.net.tw/twnic/User/Member/Search/main7.jsp?Order=ORG.ID
大陸的IP列表,應可能在:
http://www.cnnic.cn/index/0D/ 的某頁裡。

希望這些資訊夠您參考。

參考資料:文中網址

2010-02-03 09:27:06補充若要用 GeoIP 的資料,把某一區的IP倒出來的話,

可參考:

http://www.maxmind.com/app/geolitecity

裡面的 CSV Format 這一段落,

下載 csv 檔:

http://geolite.maxmind.com/download/geoip/database/GeoLiteCity_CSV/GeoLiteCity_20100101.zip

再參考:

Instructions on how to use our CSV databases with a SQL database

http://www.maxmind.com/app/csv

怎麼把 CSV 轉到 SQL 的說明,

就可以抓到某地區的完整IP範圍了。

回應

1

michelle 說:

我們那個網站的 server 作業系統是用 Win2003.
twtw 大哥您的意思是我就算設在 IIS 目錄裡. 有可能會爆掉是嗎 ?
=>.<=

2010-02-04 21:17:03

2

twtw 說:

如果設在IIS目錄裡,假設只允許「台灣的IP」可存取的話,您就要把:
http://rms.twnic.net.tw/twnic/User/Member/Search/main7.jsp?Order=ORG.ID">http://rms.twnic.net.tw/twnic/User/Member/Search/main7.jsp?Order=ORG.ID
裡面的「核發IP範圍」加到IIS設定中的允許清單中;
IIS不會爆掉,用人工去手動一筆筆判斷、整理再加進去的過程中會 瘋掉。
且該台灣IP列表是會變動的,要怎麼判斷以前IIS上的設定跟新的列表上的差別?

如果是只允許「公司範圍」的IP,用IIS上的現有設定是沒問題的;
但若以世界上的某地區做可不可存取的判斷,
手動去設定列表,在更新及管理上,相當不便;
若用 GeoIP 做的話,最多只要下載更新那資料庫檔就解決了。

2010-02-05 09:52:02

3

michelle 說:

謝謝 twtw 大哥. 大概有點概念了.
那假設我要擋上海南京跟無錫的所有 IP 網段好了.
不讓這一些地方的會員或客戶或惡意訪客(駭客或來亂的)上門.
要怎查 ? 還是幫我查寄給我 ~"~
感恩喔.

2010-02-06 18:32:07

4

twtw 說:

  1. 擋上海南京跟無錫的所有 IP 網段

其實這樣擋的意義不大,被擋的人隨便找個proxy就還是能連進來。
若要這三地區的IP網段,就要從
http://geolite.maxmind.com/download/geoip/database/GeoLiteCity_CSV/GeoLiteCity_20100101.zip">http://geolite.maxmind.com/download/geoip/database/GeoLiteCity_CSV/GeoLiteCity_20100101.zip
內容中抓取。
我分別以 Shanghai,Nanjing,Wuxi 來抓取,
所整理出的結果放在:
http://alpha.tagbible.net/upfile/dl?filetoken=1267421ba15e4b7fd759108416fbe91bbc97b957">http://alpha.tagbible.net/upfile/dl?filetoken=1267421ba15e4b7fd759108416fbe91bbc97b957
解開檔案後裡有:

  1. 1593 ip.nanjing.txt
  2. 4770 ip.shanghai.txt
  3. 966 ip.wuxi.txt
  4. 7329 total

每一行是:開始IP-結束IP 的樣式,
共有 七千 多行,就是包括這三地區的網段。
怎麼抓出的細節?
主要是該csv檔是32bit的數字,來轉成習慣的IP樣式,
是參考這一文做出來的:
http://en.kioskea.net/faq/945-converting-a-32-bit-integer-into-ip">http://en.kioskea.net/faq/945-converting-a-32-bit-integer-into-ip

2010-02-07 00:59:18

5

twtw 說:

將如何從 GeoIP 抓出所要的地區IP,
詳細的步驟寫在
http://ithelp.ithome.com.tw/question/10038355">利用 GeoIP 列出某地區的所有IP網段
一文裡。

2010-02-07 02:08:23

  2 Responses to “利用 GeoIP 列出某地區的所有 IP 網段”

  1. 小弟自己寫的 geo IP PRO !!
    給大家參考 或討論做法

 Leave a Reply

(required)

(required)


*

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>