利用 GeoIP 列出某地區的所有IP網段 - IT邦幫忙::IT知識分享社群
在 如何查詢地區性的所有IP網段 ? 這問題中,
主要是為解決如何擋某地區IP,
一般來說只要利用 GeoIP 的 資料檔及各程式的 API 來去做查詢,
就是最好的解決之道。
至於「如何列出某地區的所有IP網段」這問題,
雖然實務上的應用意義不大,
但的確蠻好奇怎麼找出來,
總算試出了怎麼從 GeoIP 的資料檔抓出來。
抓取原始資料
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
- egrep \"105645\" GeoLiteCity-Blocks.csv > tw.txt
- # 欄位分別為:
- # startIpNum,endIpNum,locId
- "1019108336","1019108339","105645"
- "1019111992","1019111999","105645"
- "1019162952","1019162959","105645"
- "1032003320","1032003327","105645"
- "3663831056","3663831071","105645"
- "3663832512","3663832543","105645"
- "3663832800","3663832815","105645"
- "3663836032","3663836047","105645"
- "3663836608","3663836623","105645"
- "3663837136","3663837151","105645"
- "3663837408","3663837423","105645"
- "3663837504","3663837519","105645"
轉換樣式
1019108336代表什麼,用 ping 就看出來了:
- $ ping 1019108336
- 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 樣式:
- # 編輯本檔為 32bit2ip.pl
- $file = $ARGV[0];
- sub toip {
- $bit32 = @_[0];
- # $result = $bit32>>24,"." + $bit32<<8>>24,".",$bit32<<16>>24,".",$bit32<<24>>24;
- $a = $bit32>>24;
- $b = $bit32<<8>>24;
- $c = $bit32<<16>>24;
- $d = $bit32<<24>>24;
- return "$a.$b.$c.$d";
- }
- open(F,"./$ARGV[0]");
- while(<F>) {
- chomp;
- $_ =~ s/"//g;
- my($startIpNum,$endIpNum,$locId) = split(',',$_);
- #print "$startIpNum\n";
- $s = &toip($startIpNum);
- $e = &toip($endIpNum);
- print "$s-$e\n";
- }
- close F;
執行 perl 32bit2ip.pl tw.txt 獲得以下結果:
- 60.190.91.240-60.190.91.243
- 60.190.106.56-60.190.106.63
- 60.191.49.72-60.191.49.79
- 61.131.30.248-61.131.30.255
- 218.97.160.16-218.97.160.31
- 218.97.165.192-218.97.165.223
- 218.97.166.224-218.97.166.239
- 218.97.179.128-218.97.179.143
- 218.97.181.192-218.97.181.207
- 218.97.183.208-218.97.183.223
- 218.97.184.224-218.97.184.239
- 218.97.185.64-218.97.185.79
台灣哪有那麼少?
其實應用 Taipei 來找,代號應是 21248及106214,
- 21248,"TW","03","Taipei","",25.0392,121.5250,,
- 105628,"TW","03","Taipeihsien","",25.0392,121.5250,,
- 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 的範例,查詢所會獲得的回應:
- $ irb -rubygems -rgeoip
- irb(main):001:0> g = GeoIP.new('GeoIP.dat')
- => #<GeoIP:0x9c5a770 @mutex=#<Mutex:0x9c5a754>, @flags=0, @databaseType=1, @record_length=3, @file=#<File:GeoIP.dat>, @databaseSegments=[16776960]>
- irb(main):002:0> g.country 'www.sohu.com'
- => ["www.sohu.com", "61.135.133.89", 48, "CN", "CHN", "China", "AS"]
- irb(main):003:0> g.country '61.135.133.1'
- => ["61.135.133.1", "61.135.133.1", 48, "CN", "CHN", "China", "AS"]
若要查詢細到什麼城市,則要下載 GeoLite City Binary Format 檔案,
查到的樣子是:
- irb(main):001:0> g = GeoIP.new('GeoLiteCity.dat')
- => #<GeoIP:0x9c4d148 @mutex=#<Mutex:0x9c4d0d8>, @flags=0, @databaseType=2, @record_length=3, @file=#<File:GeoLiteCity.dat>, @databaseSegments=[4140876]>
- irb(main):002:0> g.country '61.135.133.1'
- => ["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/ 的某頁裡。
希望這些資訊夠您參考。
參考資料:文中網址
可參考:
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 說:
- 擋上海南京跟無錫的所有 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
解開檔案後裡有:
- 1593 ip.nanjing.txt
- 4770 ip.shanghai.txt
- 966 ip.wuxi.txt
- 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
小弟自己寫的 geo IP PRO !!
給大家參考 或討論做法
http://geoip.hopto.org