Iptools
This is a port of package iptools from Python with a lot of optimizations.
Key Features
- 100% safe Rust with
#![forbid(unsafe_code)] - Minimum dependencies
- Optimized for speed, with better performance than the
ipnetandipnetworkcrates and the standard library implementation (Benched on AArch64 and x86_64) - WebAssembly support (see WASM.md)
no_stdsupport with optional serde serialization forIpRange/IpVer
Which crate should I choose?
Recommendation: choose iptools when you need string-based APIs, reserved-block detection, WebAssembly builds, or when execution speed is a priority. Reach for ipnet if you need subnet aggregation, address arithmetic traits, or tighter integration with IpAddr. Use ipnetwork when you only require lightweight CIDR parsing/iteration and prefer its smaller, std-only API surface.
Getting Started
Add the following dependency to your Cargo manifest:
[]
= "0.4.0"
no_std support
To use iptools in a no_std environment, disable the default features:
[]
= { = "0.4.0", = false }
Example of usage
use ;
let first_range = match new ;
let second_range = match new ;
// Print range bounds (tuple: start, end)
println!;
// Use the IpRange as an iterator. Clone the range to iterate without consuming the original
let mut iter = first_range.clone;
println!; // Option<String>
// Print current length (total addresses in the range)
println!;
// Remaining addresses to iterate from a cloned iterator
let mut iter2 = first_range.clone;
println!;
iter2.next;
println!;
// Check whether an IP or CIDR is contained in the range
match first_range.contains
// Iterate over addresses (string iterator)
for ip in first_range.clone.take
IPv6 validation differences
The Rust port follows the canonical compression rules from
RFC 4291 ยง2.2.
That means non-conforming strings such as :::1 are rejected even though
Python iptools crate accepted them. You can see the
difference locally:
Supported Rust Versions
Rust 1.78.0+
License
This project is licensed under the MIT license.