한국인터넷진흥원에서 한국IP대역 뽑아내기

다즐링의 이미지

주의: 이 포스팅은 닭짓에 관한 글임을 알려드립니다. 기술적인 내용은 없습니다.

여러가지 문제로 geoip 를 삽질하고 있었습니다.
그런데 지인이 알려주길.. 한국인터넷진흥원에 한국IP 대역이 있다는 것입니다.
문제의 시발점은..
1. geoip 관련 컴파일 하기 귀찬다.
2. 지인왈 "geoip 오류 꽤 된다" <-- 업데이트 않해서 일지도..
3. 대역업데이트가 의외로 자주된다.
4. 그냥 서브넷으로 나눠주면 geoip가 안되는 라우터에다가도 넣을수 있다.

코딩은 3일간에 거쳐서 했습니다.
( 본인은 프로그래머가 아닙니다. )
비트연산하다가 머리에 쥐가나서.. 커피마시고
모듈검색해서 결국 완성은 40분만에;;
역시 가져다가 쓰는게 최곱니다;

몇부분 귀찬은 부분이 있지만.. 그냥 쓰렵니다;;

고칠점
1. 로직 -_-;;; 대역이 잘게나누어지는데 귀찬아서 포기했음;;
2. 느리다. <-- 어차피 포기;
3. 생각나면.. 웹에서 데이터 글거서 파싱하게 만들것.

필요데이터 : 한국인터넷진흥원 에서 받은 excel파일을 csv로 컨버팅 ( 엑셀에서 ) , Python 모듈 iplib

#!/usr/bin/python25
 
from csv import reader
import iplib
 
FILE="KR_IPv4_data(20070803).cvs"
 
RANGE =  map(lambda x : pow(2,x) , range(20))
def get_range(i):
        return RANGE.index(  max( [ x for x in RANGE if x <= i ] ) )
 
def cal_subnets(f,l,r):
        back = [f,l,r]
        f = iplib.IPv4Address(f)
        l = iplib.IPv4Address(l) + 1
        diff =  map(int,str(l - f).split("."))
        c = 0
        for p in [3,2,1,0]:
                if diff[p] != 0:
                        break
        if diff[p] in RANGE:
                i = RANGE.index( diff[p])
        else:
                i = get_range(diff[p])
        cidr = 8 * p + ( 8 -  i)
        CIDR = "%s/%s" % ( str(f) , str(cidr))
        if str(l-1) != (iplib.CIDR(CIDR).get_last_ip() + 1):
                # recursive call
                print "%s - %s %s -> %s" % ( back[0] , back[1] , CIDR , (iplib.CIDR(CIDR).get_last_ip() + 1) )
                fromip = iplib.CIDR(CIDR).get_last_ip() + 2
                toip = back[1]
                cal_subnets(str(fromip),toip,0)
                #print "RECURSIVE END"
        else:
                print "%s - %s %s -> %s  " % (back[0] , back[1] , CIDR , (iplib.CIDR(CIDR).get_last_ip() + 1) )
 
 
for c in reader(open(FILE)):
        if len(c) == 4 and c[3].endswith('.'):
                firstip = c[0]
                lastip = c[1]
                iprange = int(c[2].replace(",",""))
                cal_subnets(firstip,lastip,iprange)
File attachments: 
첨부파일 크기
Plain text icon subnets.txt25.43 KB

댓글

다즐링의 이미지

위데이터와 geoip와의 차이를 비교해봅니다.
python geoip 모듈을 써봅시다.
maxmind python geoip 모듈

결과는.. 최근 추가된 2대역 ( 8월 1일자 3일자 ) 빼곤 완벽하게 나옵니다.
-.-;; 흑흑 지인의 사기에 또 당했습니다.

#!/usr/bin/python
 
import GeoIP
 
gi = GeoIP.new(GeoIP.GEOIP_MEMORY_CACHE)
 
for x in open("subnets.txt"):
        ip = x.split()[0]
        cc =  gi.country_code_by_addr(ip)
        if cc != "KR":
                print "ERROR %s" % ip

-------------------------------------------------------------------------------------------------------
Life ... http://iz4u.net/blog/

------------------------------------------------------------------------------------------------
Life is in 다즐링

김정균의 이미지

한국 IP 라면 libkrisp 를 사용해 보세요. krnic 의 data 를 기준으로 합니다.

ftp://mirror.oops.org/pub/oops/libkrisp

data 는

ftp://mirror.oops.org/pub/oops/libkrisp/data

에서 여러가지 format 으로 받으실 수 있습니다. GeoIP 가 설치되어 있으면 GeoIP 까지 연동이 됩니다.
GeoIPCountry, GeoIPCity, GeoIPISP 까지 연동이 됩니다.

설치 후에, data 는 업데이트 해 주셔야 합니다. data directory 에서 SQL 파일을 받으셔서 SQLite database 를 생성해 주시면 됩니다.

김정균의 이미지

부가적으로.. libkrisp 에서 지원하는 언어별 API 입니다. (제가 할 줄 아는 것만.. ^^)

PHP extension : ftp://mirror.oops.org/pub/oops/php/extensions/mod_krisp/
PHP Pear : ftp://mirror.oops.org/pub/oops/php/pear/krisp/
Perl Module : ftp://mirror.oops.org/pub/oops/perl/KRISP/

Perl module 은 SWIG 를 이용해서 만들었습니다. python module 도 Perl module 참고해서 SWIG 를 이용하면 쉽게 만들 수 있지 않을까 싶습니다만.. 제가 python 구조에 대해서 모르는지라 시도는 해 보지 않았습니다.

다즐링의 이미지

김정균님의 krisp 라이브러리 사용을 보고 데이터를 다시 뽑아보았습니다.

소스는 여기
데이터는 2가지로 뽑았습니다.

첨부파일중 krisp-2007-08-11.txt 이것은
210.92.128.0/17 BORANET
210.98.128.0/18 BORANET
210.102.32.0/19 BORANET
이런식으로 서브넷 , ISP 로 뽑았고

첨부파일중 krisp-2007-08-11-cisco.txt 이것은
210.92.128.0 0.0.127.255 BORANET
210.98.128.0 0.0.63.255 BORANET
210.102.32.0 0.0.31.255 BORANET
210.108.0.0 0.0.255.255 BORANET
이런식으로 시스코 access-list 에 맞게 변형하였습니다.

위의 소스와 별다르게 변형은 않했으니까 필요하신분은 알아서 =3

-------------------------------------------------------------------------------------------------------
Life ... http://iz4u.net/blog/

댓글 첨부 파일: 
첨부파일 크기
Plain text icon krisp-2007-08-11.txt31 KB
Plain text icon krisp-2007-08-11-cisco.txt40.84 KB

------------------------------------------------------------------------------------------------
Life is in 다즐링

김정균의 이미지

http://ipstat.nida.or.kr/korea_ip/korea_ip4_isp.jsp 는 누락된 대역이 많습니다. http://online.nida.or.kr/link/ISPAllocation.jsp 를 이용하는 것이 좋습니다. 다만, query 마구 날리시면 page 주소를 바꾸니.. 많이 날리지는 않는게 좋습니다.

제가 하루에 한번씩 체크해서 데이터를 가공해 놓는데, 왠만하면 제 ftp 에 가공된 데이터를 이용하시는 것을 권장합니다. 그래야.. 해당 페이지가 오래 유지되지 않을까 싶습니다. ^^;

ftp://mirror.oops.org/pub/oops/libkrisp/data/iplist.txt 가 위 페이지를 txt 버전으로 가공해 놓은 것입니다.

다즐링의 이미지

아아 누락된것이 있나보군요.

혹시 한국ip대역은 어떤 페이지인지 알수 있을까요?

지금 이작업을 하는 이유는.. 위에도 적었다 시피..

centos 등의.. geoip 패치하기 귀찬거나.. 등등의 경우와
시스코 라우터 혹은 스위치에서 access-list 등의 용도로 사용하려고 만드는 것입니다.
application 단이나 geoip 가 그냥 가능한 배포판은 그다지 없어서 ^_^; ( 안녕을 쓰면 좋겠지만 말이죠 ;; )

뭐 저도 한번만 글어서 만들어둘 예정입니다. =)

-------------------------------------------------------------------------------------------------------
Life ... http://iz4u.net/blog/

------------------------------------------------------------------------------------------------
Life is in 다즐링

김정균의 이미지

ftp://mirror.oops.org/pub/oops/libkrisp/data/iplist.txt 를 이용하시면 됩니다. 제가 계속 업데이트본을 제공하고 있습니다. 이 파일은 softlink 로 항상 갱신된 파일입니다. (하루에 한번 체크를 하며, 변경 사항이 있을 경우, link 가 해당 날자로 변경이 됩니다.)

또한, 원 경로가 (위의 댓글에 있습니다.) html 이기 때문에 파싱하기 편하도록 TXT format 으로 변환을 해 둔것이니, 이 파일을 사용하시는 것이 좋습니다. (아마 KRNIC 에서 해당 페이지를 없애지 않는한은 계속 업데이트본을 제공할 겁니다. 제가 이 파일을 유지하면서 경로가 3번 바뀌었습니다. 없어지면 찾느라 고생좀 했죠. ^^)

송효진의 이미지

혹시 시나 구 단위의 지역정보도 알 수 있을까요?
네이버 지역정보 처럼요.

emerge money
http://wiki.kldp.org/wiki.php/GentooInstallSimple - 명령어도 몇개 안되요~

김정균의 이미지

libkrisp 에서 hostip.net 의 data 를 이용하여, 시 (또는 구)까지는 제공을 합니다만.. hostip.net 의 data 가 부정확한 관계로 별로 신용을 할 수는 없습니다. 물론 libkrisp 에서 제공하는 data 는 어느정도 제가 손을 보기는 했습니다만, 그래도 상당히 부정확합니다.

따로 ISP 같은데서 제공해 주지 않는한은 쉽지 않을 것 같습니다. GeoIPCity 역시 상당히 부정확합니다.

김정균의 이미지

흠.. NIDA 서버 개편이 되면서.. http://online.nida.or.kr/link/ISPAllocation.jsp 페이지가 없어졌군요.

개편 후, http://online.nida.or.kr/link/ISPAllocation.jsp 에서 제공하는 IP 할당 목록은 관리 대행자들만 대상으로 하여, 독립적으로 IP를 할당 받아서 사용하는 기관들은 빠져 있습니다. 예전의 http://online.nida.or.kr/link/ISPAllocation.jsp 는 기관별 IP할당 목록이라서 다 있었는데, NIDA에서 이 페이지에 대한 제공에 대하여 정책이 서지 않았기 때문에 현재로서는 다시 열어 줄 수 없다는 입장인 듯 싶더군요. 지금 까지 제공된 것도 이 페이지의 존재를 확인하지 못해서 였다는 ^^;

김정균의 이미지

ㅎㅎ KINIC이 못받아 가게끔 변화를 주었네요.

그래서 http://my.oops.org/132 요렇게 받아 올 수 있도록 해 보았습니다. ssl + cookie check라는 꽁수를 써 놓아서 text browser (java script 로 구현해 놔서..)로는 더이상 접근이 안된다는.. --;

대체 무슨 생각으로 이러는지.. 쩝..

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.