ip2location 0.6.1

Find geo information & proxy information based on the given IP using IP2Location BIN databases
Documentation

IP2Location & IP2Proxy

Crates.io Documentation

Linux Arm7 Linux x86_64 macOS x86_64 Windows x86_64

This library reads the IP2Location DB format for both IP2Location and IP2Proxy and returns geo information for the given IP.

Features

  • Zero-copy — string fields borrow directly from the memory-mapped file
  • Memory-mapped I/O — database is mmap’d at open time, no heap allocation on the lookup path
  • Supports both IP2Location (geolocation) and IP2Proxy (proxy detection) BIN databases
  • Handles IPv4, IPv6, 6to4, Teredo, and IPv4-mapped IPv6 addresses

Requirements

  • Rust 1.85+ (edition 2024)

Building

  • debug
cargo b
  • release
cargo b --release

Testing

cargo t -v

Usage

[dependencies]
ip2location = "0.6"

Example

use ip2location::{error, Record, DB};

const IPV4BIN: &str = "data/IP2LOCATION-LITE-DB1.BIN";
const IPV6BIN: &str = "data/IP2LOCATION-LITE-DB1.IPV6.BIN";
const IP2PROXYBIN: &str = "data/IP2PROXY-IP-COUNTRY.BIN";

// Lookup an IPv4 in the IP2Location IPv6 BIN Database
fn ip_lookup_in_ipv6bin() -> Result<(), error::Error> {
    let db = DB::from_file(IPV6BIN)?;
    let record = db.ip_lookup("43.224.159.155".parse().unwrap())?;
    if let Record::LocationDb(rec) = record {
        assert!(rec.country.is_some());
        assert_eq!(rec.country.as_ref().unwrap().short_name, "IN");
        assert_eq!(rec.country.as_ref().unwrap().long_name, "India");
    }
    Ok(())
}

// Lookup an IPv4 in the IP2Location IPv4 BIN Database
fn ip_lookup_in_ipv4bin() -> Result<(), error::Error> {
    let db = DB::from_file(IPV4BIN)?;
    let record = db.ip_lookup("43.224.159.155".parse().unwrap())?;
    if let Record::LocationDb(rec) = record {
        assert!(rec.country.is_some());
        assert_eq!(rec.country.as_ref().unwrap().short_name, "IN");
        assert_eq!(rec.country.as_ref().unwrap().long_name, "India");
    }
    Ok(())
}

// Lookup an IP in the Proxy Database
fn ip_lookup_in_proxy_bin() -> Result<(), error::Error> {
    let db = DB::from_file(IP2PROXYBIN)?;
    let record = db.ip_lookup("1.1.1.1".parse().unwrap())?;
    if let Record::ProxyDb(rec) = record {
        assert!(rec.country.is_some());
    }
    Ok(())
}

Executing the Example

cargo build --examples

# IP2Location Example
./target/debug/examples/lookup data/IP2LOCATION-LITE-DB1.IPV6.BIN 2a01:cb08:8d14::

# IP2Proxy Example
./target/debug/examples/lookup data/IP2PROXY-IP-COUNTRY.BIN 1.1.1.1

License

This is free software, licensed under the MIT license.

Ip2Location Databases:


Sriram