国にマッピングされた IP 範囲を持つ ip-to-country.csv をダウンロードしました。このデータをデータベースに保存する方法と、IP アドレスがどこから来ているかを知るために IP アドレスがどの範囲で照会できるかを教えてください。
4 に答える
それを行うために、 ip2cという小さなライブラリを作成しました。webhosting.infoのデータベースを使用しますが、 Software77のデータベースもサポートしています。
CSV 情報をコンパクトなバイナリ形式に変換し、ファイル、メモリ、またはメモリ マップされたファイルを直接検索できます。
Java API の使用法は次のようになります。
String ip = 85.64.225.159;
int caching1 = IP2Country.NO_CACHE; // Straight on file, Fastest startup, slowest queries
int caching2 = IP2Country.MEMORY_MAPPED; // Memory mapped file, fast startup, fast queries.
int caching3 = IP2Country.MEMORY_CACHE; // load file into memory, slowerst startup, fastest queries
IP2Country ip2c = new IP2Country(caching1);
Country c = ip2c.getCountry(ip);
if (c == null)
{
System.out.println("UNKNOWN");
}
else
{
// will output IL ISR ISRAEL
System.out.println(c.get2cStr() + " " + c.get3cStr() + " " + c.getName());
}
IP-to-Country Handbook を参照してください
。ip-to-country.csv ファイルには 5 つのフィールドが含まれています。
* Begining of IP address range
* Ending of IP address range
* Two-character country code based on ISO 3166
* Three-character country code based on ISO 3166
* Country name based on ISO 3166
次のフィールドを持つテーブルを作成することにより、このデータを任意のデータベースにインポートできます。
FIELD DATA TYPE FIELD DESCRIPTION
IP_FROM NUMERICAL (DOUBLE) Beginning of IP address range.
IP_TO NUMERICAL (DOUBLE) Ending of IP address range.
COUNTRY_CODE2 CHAR(2) Two-character country code based on ISO 3166.
COUNTRY_CODE3 CHAR(3) Three-character country code based on ISO 3166.
COUNTRY_NAME VARCHAR(50) Country name based on ISO 3166
上記のテーブルにデータをインポートした後、次の Select ステートメントを発行して、対応するIP 番号の国を検索するためにクエリを実行できます。
SELECT COUNTRY_NAME FROM <TableName> WHERE IP_FROM <= IP Number and IP_TO >= IP Number
ここで、特定の ABCD IP の IP 番号は次のように計算されます。
IP Number = A x (256*256*256) + B x (256*256) + C x 256 + D
IPv4 の場合、次の形式で保存できます。
- IP アドレスを整数に変換します。したがって、127.0.0.1 は 2 147 483 649 になります。
- テーブルをトリプル IPFrom IPTo Country として保存します
- IpFrom と IpTo のインデックスを構築する
IP アドレスを検索する必要がある場合は、次のクエリを実行します。
SELECT Country from GeoIP where IpFrom < $IP and $IP < $IpTo
これにより、IPアドレスの国が表示されます
範囲の ipTo (上限) 値に対してのみインデックスを作成し、クエリを使用できます。
select country from geoip where $ip <= ipTo limit 1
(MaxMind データベースのように範囲が重複しないことを前提としています)