전세계의 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);
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;
}
{
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';
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 주소 형식을 숫자형으로 변경해서 쿼리를 해줘야 합니다.
댓글 없음:
댓글 쓰기