2008/05/12

GeoIP 를 이용해서 전세계 IP 할당 지역(국가 및 도시) 확인

이미 수많은 개발자 및 서버들에서 이용되고 있는걸 저도 한번 해봤습니다...^^ 샘플코드가 있으니 뭐 딱히 할꺼라론....

전세계의 IP 할당에 관련된 최신 데이터 베이스는 http://www.maxmind.com/ 에서 구할수가 있습니다. 물론 상용버젼도 있으나 Free 버젼도 일반적인 상황에서는 훌륭 합니다.

샘플코드 : http://www.maxmind.com/app/api
DB파일 : http://www.maxmind.com/download/geoip/database/GeoIP.dat.gz


특히 Linux 계열에서는 GeoIP 를 방화벽에서 컴파일을 통한 모듈 추가를 해서, 특히 중국측 IP 대역을 차단하는데 많이들 이용하는 것 같습니다.

iptables -A INPUT -m geoip ! --src-cc KR -j DROP


다음은, 예제 코드에 있는 내용중 일부 입니다.

using System.IO;
using System.Net;

string IpAddress = Request.UserHostAddress;
CountryLookup cl = new CountryLookup(Server.MapPath("/") + "GeoIP_200805.dat");
Literal_GeoIp.Text = cl.lookupCountryName(IpAddress);


샘플코드에 있는 클래스는 별도로 만들어도 상관 없고요...
public partial class CountryLookup 처럼 해도 되고,. 그대로 쓰면 됩니다.

IP 주소는 숫자형으로 변환을 해야 합니다.

private long addrToNum(IPAddress addr)
{
        long ipnum = 0;
        byte[] b = BitConverter.GetBytes(addr.Address);
        for (int i = 0; i < 4; ++i)
        {
            long y = b[i];
            if (y < 0)
            {
                y += 256;
            }
            ipnum += y << ((3 - i) * 8);
        }
        Console.WriteLine(ipnum);
        return ipnum;
}


그외,. http://www.ip2nation.com/ 는 MySQL 에서 이용할수 있도록 덤프 파일을 제공하고 있는데요,. MySQL 을 이용하다면 DB 쿼리 방식도 괜찮을것 같고요..

$sql = 'SELECT
     c.country
 FROM
     ip2nationCountries c,
     ip2nation i
 WHERE
     i.ip < INET_ATON("'.$_SERVER['REMOTE_ADDR'].'")
     AND
     c.code = i.country
 ORDER BY
     i.ip DESC
 LIMIT 0,1';

MSSQL 에다가 넣어서 할려면,. 위처럼 IP 주소 형식을 숫자형으로 변경해서 쿼리를 해줘야 합니다.

댓글 없음:

댓글 쓰기

가장 많이 본 글